vrp-core 1.5.8

A core algorithms to solve a Vehicle Routing Problem
Documentation
use super::*;
use crate::helpers::solver::create_default_refinement_ctx;
use crate::models::examples::create_example_problem;
use crate::utils::compare_floats;
use std::cmp::Ordering;

fn compare_statistic(refinement_ctx: &RefinementContext, expected: (usize, f64, f64)) {
    assert_eq!(refinement_ctx.statistics.generation, expected.0);
    assert_eq!(compare_floats(refinement_ctx.statistics.improvement_all_ratio, expected.1), Ordering::Equal);
    assert_eq!(compare_floats(refinement_ctx.statistics.improvement_1000_ratio, expected.2), Ordering::Equal);
}

#[test]
fn can_update_statistic() {
    let mut refinement_ctx = create_default_refinement_ctx(create_example_problem());
    let mut telemetry = Telemetry::new(TelemetryMode::None);
    telemetry.start();
    telemetry.on_initial(0, 1, Timer::start());

    telemetry.on_generation(&mut refinement_ctx, Timer::start(), true);
    compare_statistic(&refinement_ctx, (0, 1., 1.));

    telemetry.on_generation(&mut refinement_ctx, Timer::start(), false);
    compare_statistic(&refinement_ctx, (1, 0.5, 0.5));

    telemetry.on_generation(&mut refinement_ctx, Timer::start(), false);
    telemetry.on_generation(&mut refinement_ctx, Timer::start(), false);
    compare_statistic(&refinement_ctx, (3, 0.25, 0.25));

    (0..996).for_each(|_| {
        telemetry.on_generation(&mut refinement_ctx, Timer::start(), false);
    });
    compare_statistic(&refinement_ctx, (999, 0.001, 0.001));

    telemetry.on_generation(&mut refinement_ctx, Timer::start(), true);
    compare_statistic(&refinement_ctx, (1000, 2. / 1001., 0.001));
}