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}