solverforge-solver 0.8.6

Solver engine for SolverForge
Documentation
use super::*;
use solverforge_core::score::SoftScore;

#[derive(Clone)]
struct TestSolution;

impl PlanningSolution for TestSolution {
    type Score = SoftScore;

    fn score(&self) -> Option<Self::Score> {
        None
    }

    fn set_score(&mut self, _: Option<Self::Score>) {}
}

#[test]
fn test_accepts_improving_moves() {
    let mut acceptor = DiversifiedLateAcceptanceAcceptor::<TestSolution>::new(5, 0.1);
    acceptor.phase_started(&SoftScore::of(-100));

    assert!(acceptor.is_accepted(&SoftScore::of(-100), &SoftScore::of(-90)));
}

#[test]
fn test_accepts_late_equal() {
    let mut acceptor = DiversifiedLateAcceptanceAcceptor::<TestSolution>::new(3, 0.1);
    acceptor.phase_started(&SoftScore::of(-100));

    assert!(acceptor.is_accepted(&SoftScore::of(-90), &SoftScore::of(-100)));
}

#[test]
fn test_diversification_accepts_within_tolerance() {
    let mut acceptor = DiversifiedLateAcceptanceAcceptor::<TestSolution>::new(3, 0.1);
    acceptor.phase_started(&SoftScore::of(-100));

    acceptor.step_ended(&SoftScore::of(-80));
    acceptor.step_ended(&SoftScore::of(-70));
    acceptor.step_ended(&SoftScore::of(-60));

    assert!(acceptor.is_accepted(&SoftScore::of(-60), &SoftScore::of(-65)));
}

#[test]
fn test_rejects_outside_tolerance() {
    let mut acceptor = DiversifiedLateAcceptanceAcceptor::<TestSolution>::new(3, 0.05);
    acceptor.phase_started(&SoftScore::of(-100));

    acceptor.step_ended(&SoftScore::of(-40));
    acceptor.step_ended(&SoftScore::of(-40));
    acceptor.step_ended(&SoftScore::of(-40));

    assert!(!acceptor.is_accepted(&SoftScore::of(-40), &SoftScore::of(-50)));
}

#[test]
fn test_history_cycles() {
    let mut acceptor = DiversifiedLateAcceptanceAcceptor::<TestSolution>::new(3, 0.1);
    acceptor.phase_started(&SoftScore::of(-100));

    acceptor.step_ended(&SoftScore::of(-80));
    acceptor.step_ended(&SoftScore::of(-70));
    acceptor.step_ended(&SoftScore::of(-60));

    assert!(acceptor.is_accepted(&SoftScore::of(-60), &SoftScore::of(-75)));
}