Skip to main content

vrp_core/solver/search/
local_search.rs

1use crate::construction::heuristics::InsertionContext;
2use crate::models::GoalContext;
3use crate::solver::search::LocalOperator;
4use crate::solver::RefinementContext;
5use rosomaxa::prelude::*;
6use std::sync::Arc;
7
8/// A mutation operator which applies local search principles.
9pub struct LocalSearch {
10    operator: Arc<dyn LocalOperator>,
11}
12
13impl LocalSearch {
14    /// Creates a new instance of `LocalSearch`.
15    pub fn new(operator: Arc<dyn LocalOperator>) -> Self {
16        Self { operator }
17    }
18}
19
20impl HeuristicSearchOperator for LocalSearch {
21    type Context = RefinementContext;
22    type Objective = GoalContext;
23    type Solution = InsertionContext;
24
25    fn search(&self, heuristic_ctx: &Self::Context, solution: &Self::Solution) -> Self::Solution {
26        let refinement_ctx = heuristic_ctx;
27        let insertion_ctx = solution;
28
29        if let Some(new_insertion_ctx) = self.operator.explore(refinement_ctx, insertion_ctx) {
30            new_insertion_ctx
31        } else {
32            insertion_ctx.deep_copy()
33        }
34    }
35}