use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub struct VariableTargetConfig {
pub entity_class: Option<String>,
pub variable_name: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MoveSelectorConfig {
ChangeMoveSelector(ChangeMoveConfig),
SwapMoveSelector(SwapMoveConfig),
NearbyChangeMoveSelector(NearbyChangeMoveConfig),
NearbySwapMoveSelector(NearbySwapMoveConfig),
PillarChangeMoveSelector(PillarChangeMoveConfig),
PillarSwapMoveSelector(PillarSwapMoveConfig),
RuinRecreateMoveSelector(RuinRecreateMoveSelectorConfig),
ListChangeMoveSelector(ListChangeMoveConfig),
NearbyListChangeMoveSelector(NearbyListChangeMoveConfig),
ListSwapMoveSelector(ListSwapMoveConfig),
NearbyListSwapMoveSelector(NearbyListSwapMoveConfig),
SublistChangeMoveSelector(SublistChangeMoveConfig),
SublistSwapMoveSelector(SublistSwapMoveConfig),
ListReverseMoveSelector(ListReverseMoveConfig),
KOptMoveSelector(KOptMoveSelectorConfig),
ListRuinMoveSelector(ListRuinMoveSelectorConfig),
LimitedNeighborhood(LimitedNeighborhoodConfig),
UnionMoveSelector(UnionMoveSelectorConfig),
CartesianProductMoveSelector(CartesianProductConfig),
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ChangeMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct SwapMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct NearbyChangeMoveConfig {
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for NearbyChangeMoveConfig {
fn default() -> Self {
Self {
max_nearby: 10,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct NearbySwapMoveConfig {
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for NearbySwapMoveConfig {
fn default() -> Self {
Self {
max_nearby: 10,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct PillarChangeMoveConfig {
pub minimum_sub_pillar_size: usize,
pub maximum_sub_pillar_size: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct PillarSwapMoveConfig {
pub minimum_sub_pillar_size: usize,
pub maximum_sub_pillar_size: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Copy, Default, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum RecreateHeuristicType {
FirstFit,
#[default]
CheapestInsertion,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct RuinRecreateMoveSelectorConfig {
pub min_ruin_count: usize,
pub max_ruin_count: usize,
pub moves_per_step: Option<usize>,
pub recreate_heuristic_type: RecreateHeuristicType,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for RuinRecreateMoveSelectorConfig {
fn default() -> Self {
Self {
min_ruin_count: 2,
max_ruin_count: 5,
moves_per_step: None,
recreate_heuristic_type: RecreateHeuristicType::CheapestInsertion,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ListChangeMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct NearbyListChangeMoveConfig {
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for NearbyListChangeMoveConfig {
fn default() -> Self {
Self {
max_nearby: 10,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ListSwapMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct NearbyListSwapMoveConfig {
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for NearbyListSwapMoveConfig {
fn default() -> Self {
Self {
max_nearby: 10,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct SublistChangeMoveConfig {
pub min_sublist_size: usize,
pub max_sublist_size: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for SublistChangeMoveConfig {
fn default() -> Self {
Self {
min_sublist_size: 1,
max_sublist_size: 3,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct SublistSwapMoveConfig {
pub min_sublist_size: usize,
pub max_sublist_size: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for SublistSwapMoveConfig {
fn default() -> Self {
Self {
min_sublist_size: 1,
max_sublist_size: 3,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ListReverseMoveConfig {
#[serde(flatten)]
pub target: VariableTargetConfig,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct KOptMoveSelectorConfig {
pub k: usize,
pub min_segment_len: usize,
pub max_nearby: usize,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for KOptMoveSelectorConfig {
fn default() -> Self {
Self {
k: 3,
min_segment_len: 1,
max_nearby: 0,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct ListRuinMoveSelectorConfig {
pub min_ruin_count: usize,
pub max_ruin_count: usize,
pub moves_per_step: Option<usize>,
#[serde(flatten)]
pub target: VariableTargetConfig,
}
impl Default for ListRuinMoveSelectorConfig {
fn default() -> Self {
Self {
min_ruin_count: 2,
max_ruin_count: 5,
moves_per_step: None,
target: VariableTargetConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct LimitedNeighborhoodConfig {
pub selected_count_limit: usize,
pub selector: Box<MoveSelectorConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct UnionMoveSelectorConfig {
pub selectors: Vec<MoveSelectorConfig>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct CartesianProductConfig {
pub selectors: Vec<MoveSelectorConfig>,
}