Skip to main content

solverforge_config/
phase.rs

1use serde::{Deserialize, Serialize};
2
3use crate::acceptor::AcceptorConfig;
4use crate::forager::ForagerConfig;
5use crate::move_selector::MoveSelectorConfig;
6use crate::termination::TerminationConfig;
7
8// Phase configuration.
9#[derive(Debug, Clone, Deserialize, Serialize)]
10#[serde(tag = "type", rename_all = "snake_case")]
11pub enum PhaseConfig {
12    // Construction heuristic phase.
13    ConstructionHeuristic(ConstructionHeuristicConfig),
14
15    // Local search phase.
16    LocalSearch(LocalSearchConfig),
17
18    // Exhaustive search phase.
19    ExhaustiveSearch(ExhaustiveSearchConfig),
20
21    // Partitioned search phase.
22    PartitionedSearch(PartitionedSearchConfig),
23
24    // Custom phase.
25    Custom(CustomPhaseConfig),
26}
27
28fn default_k() -> usize {
29    2
30}
31
32// Construction heuristic configuration.
33#[derive(Debug, Clone, Deserialize, Serialize)]
34#[serde(rename_all = "snake_case")]
35pub struct ConstructionHeuristicConfig {
36    // Type of construction heuristic.
37    #[serde(default)]
38    pub construction_heuristic_type: ConstructionHeuristicType,
39
40    // k for ListKOpt (default 2).
41    #[serde(default = "default_k")]
42    pub k: usize,
43
44    // Phase termination configuration.
45    pub termination: Option<TerminationConfig>,
46}
47
48impl Default for ConstructionHeuristicConfig {
49    fn default() -> Self {
50        Self {
51            construction_heuristic_type: ConstructionHeuristicType::default(),
52            k: default_k(),
53            termination: None,
54        }
55    }
56}
57
58// Construction heuristic types.
59#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
60#[serde(rename_all = "snake_case")]
61pub enum ConstructionHeuristicType {
62    // First fit heuristic (basic variables).
63    #[default]
64    FirstFit,
65
66    // First fit decreasing (by entity difficulty).
67    FirstFitDecreasing,
68
69    // Weakest fit heuristic.
70    WeakestFit,
71
72    // Weakest fit decreasing.
73    WeakestFitDecreasing,
74
75    // Strongest fit heuristic.
76    StrongestFit,
77
78    // Strongest fit decreasing.
79    StrongestFitDecreasing,
80
81    // Cheapest insertion (greedy, basic variables).
82    CheapestInsertion,
83
84    // Allocate entity from queue.
85    AllocateEntityFromQueue,
86
87    // Allocate to value from queue.
88    AllocateToValueFromQueue,
89
90    // List round-robin construction: distributes elements evenly across entities.
91    ListRoundRobin,
92
93    // List cheapest insertion: inserts each element at the score-minimizing position.
94    ListCheapestInsertion,
95
96    // List regret insertion: inserts elements in order of highest placement regret.
97    ListRegretInsertion,
98
99    // List Clarke-Wright savings: greedy route merging by savings value.
100    ListClarkeWright,
101
102    // List k-opt: per-route k-opt polishing (k=2 is exact 2-opt).
103    ListKOpt,
104}
105
106// Local search configuration.
107#[derive(Debug, Clone, Default, Deserialize, Serialize)]
108#[serde(rename_all = "snake_case")]
109pub struct LocalSearchConfig {
110    // Acceptor configuration.
111    pub acceptor: Option<AcceptorConfig>,
112
113    // Forager configuration.
114    pub forager: Option<ForagerConfig>,
115
116    // Move selector configuration.
117    pub move_selector: Option<MoveSelectorConfig>,
118
119    // Phase termination configuration.
120    pub termination: Option<TerminationConfig>,
121}
122
123// Exhaustive search configuration.
124#[derive(Debug, Clone, Default, Deserialize, Serialize)]
125#[serde(rename_all = "snake_case")]
126pub struct ExhaustiveSearchConfig {
127    // Exhaustive search type.
128    #[serde(default)]
129    pub exhaustive_search_type: ExhaustiveSearchType,
130
131    // Phase termination configuration.
132    pub termination: Option<TerminationConfig>,
133}
134
135// Exhaustive search types.
136#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
137#[serde(rename_all = "snake_case")]
138pub enum ExhaustiveSearchType {
139    // Branch and bound.
140    #[default]
141    BranchAndBound,
142
143    // Brute force.
144    BruteForce,
145}
146
147// Partitioned search configuration.
148#[derive(Debug, Clone, Default, Deserialize, Serialize)]
149#[serde(rename_all = "snake_case")]
150pub struct PartitionedSearchConfig {
151    // Number of partitions.
152    pub partition_count: Option<usize>,
153
154    // Phase termination configuration.
155    pub termination: Option<TerminationConfig>,
156}
157
158// Custom phase configuration.
159#[derive(Debug, Clone, Default, Deserialize, Serialize)]
160#[serde(rename_all = "snake_case")]
161pub struct CustomPhaseConfig {
162    // Custom phase class name.
163    pub custom_phase_class: Option<String>,
164}