Skip to main content

solverforge_config/
move_selector.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
4#[serde(rename_all = "snake_case")]
5pub struct VariableTargetConfig {
6    pub entity_class: Option<String>,
7    pub variable_name: Option<String>,
8}
9
10// Move selector configuration.
11#[derive(Debug, Clone, Deserialize, Serialize)]
12#[serde(tag = "type", rename_all = "snake_case")]
13pub enum MoveSelectorConfig {
14    // Change move selector (standard variables).
15    ChangeMoveSelector(ChangeMoveConfig),
16
17    // Swap move selector (standard variables).
18    SwapMoveSelector(SwapMoveConfig),
19
20    // List change move selector — relocates single elements within/between routes.
21    ListChangeMoveSelector(ListChangeMoveConfig),
22
23    // Nearby list change move selector — distance-pruned element relocation.
24    NearbyListChangeMoveSelector(NearbyListChangeMoveConfig),
25
26    // List swap move selector — swaps single elements within/between routes.
27    ListSwapMoveSelector(ListSwapMoveConfig),
28
29    // Nearby list swap move selector — distance-pruned element swap.
30    NearbyListSwapMoveSelector(NearbyListSwapMoveConfig),
31
32    // Sublist change move selector (Or-opt) — relocates contiguous segments.
33    SubListChangeMoveSelector(SubListChangeMoveConfig),
34
35    // Sublist swap move selector — swaps contiguous segments between routes.
36    SubListSwapMoveSelector(SubListSwapMoveConfig),
37
38    // List reverse move selector (2-opt) — reverses segments within a route.
39    ListReverseMoveSelector(ListReverseMoveConfig),
40
41    // K-opt move selector — generalised route reconnection.
42    KOptMoveSelector(KOptMoveSelectorConfig),
43
44    // List ruin move selector (LNS) — removes elements for reinsertion.
45    ListRuinMoveSelector(ListRuinMoveSelectorConfig),
46
47    // Decorator that limits the number of moves yielded by a child selector.
48    SelectedCountLimitMoveSelector(SelectedCountLimitMoveSelectorConfig),
49
50    // Union of multiple selectors.
51    UnionMoveSelector(UnionMoveSelectorConfig),
52
53    // Cartesian product of selectors.
54    CartesianProductMoveSelector(CartesianProductConfig),
55}
56
57// Change move configuration.
58#[derive(Debug, Clone, Default, Deserialize, Serialize)]
59#[serde(rename_all = "snake_case")]
60pub struct ChangeMoveConfig {
61    #[serde(flatten)]
62    pub target: VariableTargetConfig,
63}
64
65// Swap move configuration.
66#[derive(Debug, Clone, Default, Deserialize, Serialize)]
67#[serde(rename_all = "snake_case")]
68pub struct SwapMoveConfig {
69    #[serde(flatten)]
70    pub target: VariableTargetConfig,
71}
72
73// Configuration for `ListChangeMoveSelector`.
74#[derive(Debug, Clone, Default, Deserialize, Serialize)]
75#[serde(rename_all = "snake_case")]
76pub struct ListChangeMoveConfig {
77    #[serde(flatten)]
78    pub target: VariableTargetConfig,
79}
80
81// Configuration for `NearbyListChangeMoveSelector`.
82#[derive(Debug, Clone, Deserialize, Serialize)]
83#[serde(rename_all = "snake_case")]
84pub struct NearbyListChangeMoveConfig {
85    // Maximum nearby destination positions to consider per source element.
86    pub max_nearby: usize,
87    #[serde(flatten)]
88    pub target: VariableTargetConfig,
89}
90
91impl Default for NearbyListChangeMoveConfig {
92    fn default() -> Self {
93        Self {
94            max_nearby: 10,
95            target: VariableTargetConfig::default(),
96        }
97    }
98}
99
100// Configuration for `ListSwapMoveSelector`.
101#[derive(Debug, Clone, Default, Deserialize, Serialize)]
102#[serde(rename_all = "snake_case")]
103pub struct ListSwapMoveConfig {
104    #[serde(flatten)]
105    pub target: VariableTargetConfig,
106}
107
108// Configuration for `NearbyListSwapMoveSelector`.
109#[derive(Debug, Clone, Deserialize, Serialize)]
110#[serde(rename_all = "snake_case")]
111pub struct NearbyListSwapMoveConfig {
112    // Maximum nearby swap partners to consider per source element.
113    pub max_nearby: usize,
114    #[serde(flatten)]
115    pub target: VariableTargetConfig,
116}
117
118impl Default for NearbyListSwapMoveConfig {
119    fn default() -> Self {
120        Self {
121            max_nearby: 10,
122            target: VariableTargetConfig::default(),
123        }
124    }
125}
126
127// Configuration for `SubListChangeMoveSelector` (Or-opt).
128#[derive(Debug, Clone, Deserialize, Serialize)]
129#[serde(rename_all = "snake_case")]
130pub struct SubListChangeMoveConfig {
131    // Minimum segment size (inclusive). Default: 1.
132    pub min_sublist_size: usize,
133    // Maximum segment size (inclusive). Default: 3.
134    pub max_sublist_size: usize,
135    #[serde(flatten)]
136    pub target: VariableTargetConfig,
137}
138
139impl Default for SubListChangeMoveConfig {
140    fn default() -> Self {
141        Self {
142            min_sublist_size: 1,
143            max_sublist_size: 3,
144            target: VariableTargetConfig::default(),
145        }
146    }
147}
148
149// Configuration for `SubListSwapMoveSelector`.
150#[derive(Debug, Clone, Deserialize, Serialize)]
151#[serde(rename_all = "snake_case")]
152pub struct SubListSwapMoveConfig {
153    // Minimum segment size (inclusive). Default: 1.
154    pub min_sublist_size: usize,
155    // Maximum segment size (inclusive). Default: 3.
156    pub max_sublist_size: usize,
157    #[serde(flatten)]
158    pub target: VariableTargetConfig,
159}
160
161impl Default for SubListSwapMoveConfig {
162    fn default() -> Self {
163        Self {
164            min_sublist_size: 1,
165            max_sublist_size: 3,
166            target: VariableTargetConfig::default(),
167        }
168    }
169}
170
171// Configuration for `ListReverseMoveSelector` (2-opt).
172#[derive(Debug, Clone, Default, Deserialize, Serialize)]
173#[serde(rename_all = "snake_case")]
174pub struct ListReverseMoveConfig {
175    #[serde(flatten)]
176    pub target: VariableTargetConfig,
177}
178
179// Configuration for `KOptMoveSelector`.
180#[derive(Debug, Clone, Deserialize, Serialize)]
181#[serde(rename_all = "snake_case")]
182pub struct KOptMoveSelectorConfig {
183    // K value (number of cuts). Default: 3.
184    pub k: usize,
185    // Minimum segment length between cuts. Default: 1.
186    pub min_segment_len: usize,
187    // Maximum nearby positions to consider per cut. Default: 0 (full enumeration).
188    // When > 0, uses distance-pruned NearbyKOptMoveSelector instead of full KOptMoveSelector.
189    pub max_nearby: usize,
190    #[serde(flatten)]
191    pub target: VariableTargetConfig,
192}
193
194impl Default for KOptMoveSelectorConfig {
195    fn default() -> Self {
196        Self {
197            k: 3,
198            min_segment_len: 1,
199            max_nearby: 0,
200            target: VariableTargetConfig::default(),
201        }
202    }
203}
204
205// Configuration for `ListRuinMoveSelector` (LNS).
206#[derive(Debug, Clone, Deserialize, Serialize)]
207#[serde(rename_all = "snake_case")]
208pub struct ListRuinMoveSelectorConfig {
209    // Minimum number of elements to ruin per move. Default: 2.
210    pub min_ruin_count: usize,
211    // Maximum number of elements to ruin per move. Default: 5.
212    pub max_ruin_count: usize,
213    // Number of ruin moves to generate per step. Default: 10.
214    pub moves_per_step: Option<usize>,
215    #[serde(flatten)]
216    pub target: VariableTargetConfig,
217}
218
219impl Default for ListRuinMoveSelectorConfig {
220    fn default() -> Self {
221        Self {
222            min_ruin_count: 2,
223            max_ruin_count: 5,
224            moves_per_step: None,
225            target: VariableTargetConfig::default(),
226        }
227    }
228}
229
230// Configuration for `SelectedCountLimitMoveSelector`.
231#[derive(Debug, Clone, Deserialize, Serialize)]
232#[serde(rename_all = "snake_case")]
233pub struct SelectedCountLimitMoveSelectorConfig {
234    // Maximum number of moves yielded from the child selector.
235    pub selected_count_limit: usize,
236    // Child selector to wrap.
237    pub selector: Box<MoveSelectorConfig>,
238}
239
240// Union move selector configuration.
241#[derive(Debug, Clone, Default, Deserialize, Serialize)]
242#[serde(rename_all = "snake_case")]
243pub struct UnionMoveSelectorConfig {
244    // Child selectors.
245    pub selectors: Vec<MoveSelectorConfig>,
246}
247
248// Cartesian product move selector configuration.
249#[derive(Debug, Clone, Default, Deserialize, Serialize)]
250#[serde(rename_all = "snake_case")]
251pub struct CartesianProductConfig {
252    // Child selectors.
253    pub selectors: Vec<MoveSelectorConfig>,
254}