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