Align job scheduling track names with literature.

This commit is contained in:
FiveMovesAhead 2026-02-10 15:44:48 +00:00
parent 8ccedeb43e
commit 51f2fffef6

View File

@ -11,7 +11,7 @@ use serde::{Deserialize, Serialize};
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
pub struct FlowConfig { pub struct ScenarioConfig {
pub avg_op_flexibility: f32, pub avg_op_flexibility: f32,
pub reentrance_level: f32, pub reentrance_level: f32,
pub flow_structure: f32, pub flow_structure: f32,
@ -19,42 +19,42 @@ pub struct FlowConfig {
} }
#[derive(Clone, Copy, Debug, Eq, PartialEq)] #[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum Flow { pub enum Scenario {
STRICT, FLOW_SHOP,
PARALLEL, HYBRID_FLOW_SHOP,
RANDOM, JOB_SHOP,
COMPLEX, FJSP_MEDIUM,
CHAOTIC, FJSP_HIGH,
} }
impl From<Flow> for FlowConfig { impl From<Scenario> for ScenarioConfig {
fn from(flow: Flow) -> Self { fn from(scenario: Scenario) -> Self {
match flow { match scenario {
Flow::STRICT => FlowConfig { Scenario::FLOW_SHOP => ScenarioConfig {
avg_op_flexibility: 1.0, avg_op_flexibility: 1.0,
reentrance_level: 0.2, reentrance_level: 0.2,
flow_structure: 0.0, flow_structure: 0.0,
product_mix_ratio: 0.5, product_mix_ratio: 0.5,
}, },
Flow::PARALLEL => FlowConfig { Scenario::HYBRID_FLOW_SHOP => ScenarioConfig {
avg_op_flexibility: 3.0, avg_op_flexibility: 3.0,
reentrance_level: 0.2, reentrance_level: 0.2,
flow_structure: 0.0, flow_structure: 0.0,
product_mix_ratio: 0.5, product_mix_ratio: 0.5,
}, },
Flow::RANDOM => FlowConfig { Scenario::JOB_SHOP => ScenarioConfig {
avg_op_flexibility: 1.0, avg_op_flexibility: 1.0,
reentrance_level: 0.0, reentrance_level: 0.0,
flow_structure: 0.4, flow_structure: 0.4,
product_mix_ratio: 1.0, product_mix_ratio: 1.0,
}, },
Flow::COMPLEX => FlowConfig { Scenario::FJSP_MEDIUM => ScenarioConfig {
avg_op_flexibility: 3.0, avg_op_flexibility: 3.0,
reentrance_level: 0.2, reentrance_level: 0.2,
flow_structure: 0.4, flow_structure: 0.4,
product_mix_ratio: 1.0, product_mix_ratio: 1.0,
}, },
Flow::CHAOTIC => FlowConfig { Scenario::FJSP_HIGH => ScenarioConfig {
avg_op_flexibility: 10.0, avg_op_flexibility: 10.0,
reentrance_level: 0.0, reentrance_level: 0.0,
flow_structure: 1.0, flow_structure: 1.0,
@ -64,29 +64,29 @@ impl From<Flow> for FlowConfig {
} }
} }
impl std::fmt::Display for Flow { impl std::fmt::Display for Scenario {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self { match self {
Flow::STRICT => write!(f, "strict"), Scenario::FLOW_SHOP => write!(f, "flow_shop"),
Flow::PARALLEL => write!(f, "parallel"), Scenario::HYBRID_FLOW_SHOP => write!(f, "hybrid_flow_shop"),
Flow::RANDOM => write!(f, "random"), Scenario::JOB_SHOP => write!(f, "job_shop"),
Flow::COMPLEX => write!(f, "complex"), Scenario::FJSP_MEDIUM => write!(f, "fjsp_medium"),
Flow::CHAOTIC => write!(f, "chaotic"), Scenario::FJSP_HIGH => write!(f, "fjsp_high"),
} }
} }
} }
impl std::str::FromStr for Flow { impl std::str::FromStr for Scenario {
type Err = anyhow::Error; type Err = anyhow::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> { fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() { match s.to_lowercase().as_str() {
"strict" => Ok(Flow::STRICT), "flow_shop" => Ok(Scenario::FLOW_SHOP),
"parallel" => Ok(Flow::PARALLEL), "hybrid_flow_shop" => Ok(Scenario::HYBRID_FLOW_SHOP),
"random" => Ok(Flow::RANDOM), "job_shop" => Ok(Scenario::JOB_SHOP),
"complex" => Ok(Flow::COMPLEX), "fjsp_medium" => Ok(Scenario::FJSP_MEDIUM),
"chaotic" => Ok(Flow::CHAOTIC), "fjsp_high" => Ok(Scenario::FJSP_HIGH),
_ => Err(anyhow::anyhow!("Invalid flow type: {}", s)), _ => Err(anyhow::anyhow!("Invalid scenario type: {}", s)),
} }
} }
} }
@ -94,9 +94,7 @@ impl std::str::FromStr for Flow {
impl_kv_string_serde! { impl_kv_string_serde! {
Track { Track {
n: usize, n: usize,
m: usize, s: Scenario
o: usize,
flow: Flow
} }
} }
@ -128,15 +126,15 @@ pub struct Challenge {
impl Challenge { impl Challenge {
pub fn generate_instance(seed: &[u8; 32], track: &Track) -> Result<Self> { pub fn generate_instance(seed: &[u8; 32], track: &Track) -> Result<Self> {
let mut rng = SmallRng::from_seed(StdRng::from_seed(seed.clone()).r#gen()); let mut rng = SmallRng::from_seed(StdRng::from_seed(seed.clone()).r#gen());
let FlowConfig { let ScenarioConfig {
avg_op_flexibility, avg_op_flexibility,
reentrance_level, reentrance_level,
flow_structure, flow_structure,
product_mix_ratio, product_mix_ratio,
} = track.flow.clone().into(); } = track.s.clone().into();
let n_jobs = track.n; let n_jobs = 50;
let n_machines = track.m; let n_machines = n_jobs / 2 + 5;
let n_op_types = track.o; let n_op_types = n_jobs / 2 + 5;
let n_products = 1.max((product_mix_ratio * n_jobs as f32) as usize); let n_products = 1.max((product_mix_ratio * n_jobs as f32) as usize);
let n_routes = 1.max((flow_structure * n_jobs as f32) as usize); let n_routes = 1.max((flow_structure * n_jobs as f32) as usize);
let min_eligible_machines = 1; let min_eligible_machines = 1;
@ -187,7 +185,7 @@ impl Challenge {
// Job Shop Logic: Random permutation // Job Shop Logic: Random permutation
rng.gen_range(0..base_sequence.len()) rng.gen_range(0..base_sequence.len())
} else { } else {
// Flow Shop Logic: Pick next sequential op // Scenario Shop Logic: Pick next sequential op
0 0
}; };