solverforge-solver 0.19.8

Solver engine for SolverForge
Documentation
use super::*;

#[test]
fn ruin_never_probes_or_commits_into_a_pinned_destination() {
    let mut director = create_director(vec![1, 2]);
    director.working_solution_mut().routes.push(Route {
        stops: vec![3],
        pinned: true,
    });
    let mov = ListRuinMove::<VrpSolution, i32>::new(
        0,
        &[1],
        entity_count,
        list_len,
        list_get,
        list_remove,
        list_insert,
        "stops",
        0,
    );

    assert!(mov.is_doable(&director));
    let undo = mov.do_move(&mut director);
    assert_eq!(director.working_solution().routes[1].stops, vec![3]);
    mov.undo_move(&mut director, undo);
    assert_eq!(director.working_solution().routes[0].stops, vec![1, 2]);
    assert_eq!(director.working_solution().routes[1].stops, vec![3]);
}

#[test]
fn ruin_rejects_a_pinned_source() {
    let mut director = create_director(vec![1, 2]);
    director.working_solution_mut().routes[0].pinned = true;
    director.working_solution_mut().routes.push(Route {
        stops: vec![],
        pinned: false,
    });
    let mov = ListRuinMove::<VrpSolution, i32>::new(
        0,
        &[1],
        entity_count,
        list_len,
        list_get,
        list_remove,
        list_insert,
        "stops",
        0,
    );

    assert!(!mov.is_doable(&director));
    assert_eq!(director.working_solution().routes[0].stops, vec![1, 2]);
}