pub struct ListKOptPhase<S, E>{ /* private fields */ }Expand description
Per-route k-opt polishing phase for list variable problems.
Runs 2-opt local search on each entity’s route to local optimum after construction. All domain knowledge is supplied via function pointers.
§Algorithm (k=2, 2-opt)
For each entity:
- Read the current route as a sequence of element indices.
- Try every segment reversal
[i..=j]. - Accept if distance improves AND
feasible_fnpasses (if provided). - Repeat until no improving reversal exists.
§Example
use solverforge_solver::ListKOptPhase;
use solverforge_core::domain::PlanningSolution;
use solverforge_core::score::SoftScore;
#[derive(Clone)]
struct Vehicle { route: Vec<usize> }
#[derive(Clone)]
struct Plan {
vehicles: Vec<Vehicle>,
score: Option<SoftScore>,
}
impl PlanningSolution for Plan {
type Score = SoftScore;
fn score(&self) -> Option<Self::Score> { self.score }
fn set_score(&mut self, score: Option<Self::Score>) { self.score = score; }
}
let phase = ListKOptPhase::<Plan, usize>::new(
2,
|p| p.vehicles.len(),
|p, entity_idx| p.vehicles[entity_idx].route.clone(),
|p, entity_idx, route| { p.vehicles[entity_idx].route = route; },
|_p, entity_idx| 0, // depot index
|_p, i, j| (i as i64 - j as i64).abs(),
None, // no extra feasibility check
0,
);Implementations§
Source§impl<S, E> ListKOptPhase<S, E>
impl<S, E> ListKOptPhase<S, E>
Sourcepub fn new(
k: usize,
entity_count: fn(&S) -> usize,
get_route: fn(&S, usize) -> Vec<usize>,
set_route: fn(&mut S, usize, Vec<usize>),
depot_fn: fn(&S, usize) -> usize,
distance_fn: fn(&S, usize, usize) -> i64,
feasible_fn: Option<fn(&S, usize, &[usize]) -> bool>,
descriptor_index: usize,
) -> Self
pub fn new( k: usize, entity_count: fn(&S) -> usize, get_route: fn(&S, usize) -> Vec<usize>, set_route: fn(&mut S, usize, Vec<usize>), depot_fn: fn(&S, usize) -> usize, distance_fn: fn(&S, usize, usize) -> i64, feasible_fn: Option<fn(&S, usize, &[usize]) -> bool>, descriptor_index: usize, ) -> Self
Creates a new k-opt polishing phase.
§Arguments
k— k value; only k=2 (2-opt) is implemented; k>2 logs a warning and is a no-opentity_count— number of entities (routes) in the solutionget_route— returns the route for entity at given index as element indicesset_route— replaces the route for entity at given indexdepot_fn— returns the depot element index for a given entitydistance_fn— distance between two element indicesfeasible_fn— optional feasibility gate; receives solution, entity index, and candidate route after tentative reversal; returnfalseto reject the movedescriptor_index— entity descriptor index for change notification
Trait Implementations§
Source§impl<S, E> Debug for ListKOptPhase<S, E>
impl<S, E> Debug for ListKOptPhase<S, E>
Source§impl<S, E, D, BestCb> Phase<S, D, BestCb> for ListKOptPhase<S, E>where
S: PlanningSolution,
E: Copy + Send + Sync + 'static,
D: Director<S>,
BestCb: BestSolutionCallback<S>,
impl<S, E, D, BestCb> Phase<S, D, BestCb> for ListKOptPhase<S, E>where
S: PlanningSolution,
E: Copy + Send + Sync + 'static,
D: Director<S>,
BestCb: BestSolutionCallback<S>,
Source§fn solve(&mut self, solver_scope: &mut SolverScope<'_, S, D, BestCb>)
fn solve(&mut self, solver_scope: &mut SolverScope<'_, S, D, BestCb>)
Executes this phase. Read more
Source§fn phase_type_name(&self) -> &'static str
fn phase_type_name(&self) -> &'static str
Returns the name of this phase type.
Auto Trait Implementations§
impl<S, E> Freeze for ListKOptPhase<S, E>
impl<S, E> RefUnwindSafe for ListKOptPhase<S, E>
impl<S, E> Send for ListKOptPhase<S, E>
impl<S, E> Sync for ListKOptPhase<S, E>
impl<S, E> Unpin for ListKOptPhase<S, E>
impl<S, E> UnsafeUnpin for ListKOptPhase<S, E>
impl<S, E> UnwindSafe for ListKOptPhase<S, E>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more