Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions docs/paper/reductions.typ
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
"SubsetSum": [Subset Sum],
"MinimumFeedbackArcSet": [Minimum Feedback Arc Set],
"MinimumFeedbackVertexSet": [Minimum Feedback Vertex Set],
"SequencingWithReleaseTimesAndDeadlines": [Sequencing with Release Times and Deadlines],
"MultipleChoiceBranching": [Multiple Choice Branching],
"ShortestCommonSupersequence": [Shortest Common Supersequence],
"MinimumSumMulticenter": [Minimum Sum Multicenter],
Expand Down Expand Up @@ -2273,6 +2274,48 @@ NP-completeness was established by Garey, Johnson, and Stockmeyer @gareyJohnsonS
*Example.* Let $A = {3, 7, 1, 8, 2, 4}$ ($n = 6$) and target $B = 11$. Selecting $A' = {3, 8}$ gives sum $3 + 8 = 11 = B$. Another solution: $A' = {7, 4}$ with sum $7 + 4 = 11 = B$.
]

#{
let x = load-model-example("SequencingWithReleaseTimesAndDeadlines")
let n = x.instance.lengths.len()
let lengths = x.instance.lengths
let release = x.instance.release_times
let deadline = x.instance.deadlines
let sol = x.optimal.at(0)
// Decode Lehmer code to permutation
let available = range(n)
let perm = ()
for c in sol.config {
perm = perm + (available.at(c),)
available = available.slice(0, c) + available.slice(c + 1)
}
// Compute start times by simulating the schedule (build (task_idx, start) pairs)
let current = 0
let schedule = ()
for idx in perm {
let s = calc.max(current, release.at(idx))
schedule = schedule + ((idx, s),)
current = s + lengths.at(idx)
}
[
#problem-def("SequencingWithReleaseTimesAndDeadlines")[
Given a set $T$ of $n$ tasks and, for each task $t in T$, a processing time $ell(t) in ZZ^+$, a release time $r(t) in ZZ^(>=0)$, and a deadline $d(t) in ZZ^+$, determine whether there exists a one-processor schedule $sigma: T -> ZZ^(>=0)$ such that for all $t in T$: $sigma(t) >= r(t)$, $sigma(t) + ell(t) <= d(t)$, and no two tasks overlap (i.e., $sigma(t) > sigma(t')$ implies $sigma(t) >= sigma(t') + ell(t')$).
][
Problem SS1 in Garey and Johnson's appendix @garey1979, and a fundamental single-machine scheduling feasibility problem. It is strongly NP-complete by reduction from 3-Partition, so no pseudo-polynomial time algorithm exists unless P = NP. The problem becomes polynomial-time solvable when: (1) all task lengths equal 1, (2) preemption is allowed, or (3) all release times are zero. The best known exact algorithm for the general case runs in $O^*(2^n dot n)$ time via dynamic programming on task subsets.

*Example.* Consider #n tasks:
#align(center, table(
columns: n + 1,
align: center,
table.header([], ..range(n).map(i => [$t_#(i + 1)$])),
[$ell(t)$], ..lengths.map(l => [#l]),
[$r(t)$], ..release.map(r => [#r]),
[$d(t)$], ..deadline.map(d => [#d]),
))
A feasible schedule: #schedule.map(((idx, s)) => [$sigma(t_#(idx + 1)) = #s$ (runs $[#s, #(s + lengths.at(idx)))$)]).join([, ]). All release and deadline constraints are satisfied with no overlap.
]
]
}

#{
let x = load-model-example("ShortestCommonSupersequence")
let alpha-size = x.instance.alphabet_size
Expand Down
2 changes: 1 addition & 1 deletion problemreductions-cli/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ pub struct CreateArgs {
/// Candidate weighted arcs for StrongConnectivityAugmentation (e.g., 2>0:1,2>1:3)
#[arg(long)]
pub candidate_arcs: Option<String>,
/// Deadlines for MinimumTardinessSequencing (comma-separated, e.g., "5,5,5,3,3")
/// Deadlines for scheduling problems (comma-separated, e.g., "5,5,5,3,3")
#[arg(long)]
pub deadlines: Option<String>,
/// Precedence pairs for MinimumTardinessSequencing (e.g., "0>3,1>3,1>4,2>4")
Expand Down
45 changes: 43 additions & 2 deletions problemreductions-cli/src/commands/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ use problemreductions::models::graph::{
};
use problemreductions::models::misc::{
BinPacking, FlowShopScheduling, LongestCommonSubsequence, MinimumTardinessSequencing,
MultiprocessorScheduling, PaintShop, SequencingWithinIntervals, ShortestCommonSupersequence,
StringToStringCorrection, SubsetSum,
MultiprocessorScheduling, PaintShop, SequencingWithReleaseTimesAndDeadlines,
SequencingWithinIntervals, ShortestCommonSupersequence, StringToStringCorrection, SubsetSum,
};
use problemreductions::models::BiconnectivityAugmentation;
use problemreductions::prelude::*;
Expand Down Expand Up @@ -1900,6 +1900,47 @@ pub fn create(args: &CreateArgs, out: &OutputConfig) -> Result<()> {
)
}

// SequencingWithReleaseTimesAndDeadlines
"SequencingWithReleaseTimesAndDeadlines" => {
let lengths_str = args.lengths.as_deref().ok_or_else(|| {
anyhow::anyhow!(
"SequencingWithReleaseTimesAndDeadlines requires --lengths, --release-times, and --deadlines\n\n\
Usage: pred create SequencingWithReleaseTimesAndDeadlines --lengths 3,2,4 --release-times 0,1,5 --deadlines 5,6,10"
)
})?;
let release_str = args.release_times.as_deref().ok_or_else(|| {
anyhow::anyhow!(
"SequencingWithReleaseTimesAndDeadlines requires --release-times\n\n\
Usage: pred create SequencingWithReleaseTimesAndDeadlines --lengths 3,2,4 --release-times 0,1,5 --deadlines 5,6,10"
)
})?;
let deadlines_str = args.deadlines.as_deref().ok_or_else(|| {
anyhow::anyhow!(
"SequencingWithReleaseTimesAndDeadlines requires --deadlines\n\n\
Usage: pred create SequencingWithReleaseTimesAndDeadlines --lengths 3,2,4 --release-times 0,1,5 --deadlines 5,6,10"
)
})?;
let lengths: Vec<u64> = util::parse_comma_list(lengths_str)?;
let release_times: Vec<u64> = util::parse_comma_list(release_str)?;
let deadlines: Vec<u64> = util::parse_comma_list(deadlines_str)?;
if lengths.len() != release_times.len() || lengths.len() != deadlines.len() {
bail!(
"All three lists must have the same length: lengths={}, release_times={}, deadlines={}",
lengths.len(),
release_times.len(),
deadlines.len()
);
}
(
ser(SequencingWithReleaseTimesAndDeadlines::new(
lengths,
release_times,
deadlines,
))?,
resolved_variant.clone(),
)
}

// StringToStringCorrection
"StringToStringCorrection" => {
let usage = "Usage: pred create StringToStringCorrection --source-string \"0,1,2,3,1,0\" --target-string \"0,1,3,2,1\" --bound 2";
Expand Down
Loading
Loading