Skip to main content

knapsack_hc_demo/
knapsack_hc_demo.rs

1use roma_lib::HtmlReportObserver;
2use roma_lib::algorithms::{
3    Algorithm,
4    HillClimbing,
5    HillClimbingParameters,
6    TerminationCriteria,
7    TerminationCriterion,
8};
9use roma_lib::observer::{ChartObserver, ConsoleObserver, Observable};
10use roma_lib::operator::BitFlipMutation;
11use roma_lib::problem::KnapsackBuilder;
12use roma_lib::solution_set::SolutionSet;
13use roma_lib::utils::cli::seed_from_cli_or;
14
15fn main() {
16    let seed = seed_from_cli_or(42);
17
18    let problem = KnapsackBuilder::new()
19        .with_capacity(90.0)
20        .add_item(12.0, 24.0)
21        .add_item(22.0, 33.0)
22        .add_item(41.0, 80.0)
23        .build();
24
25    let parameters = HillClimbingParameters::new(
26        BitFlipMutation::new(),
27        0.10,
28        TerminationCriteria::new(vec![TerminationCriterion::MaxIterations(120)]),
29    )
30    .with_seed(seed);
31    let mut algorithm = HillClimbing::new(parameters);
32
33    algorithm.add_observer(Box::new(ConsoleObserver::new(true)));
34    algorithm.add_observer(Box::new(ChartObserver::new_default()));
35    algorithm.add_observer(Box::new(HtmlReportObserver::new_default()));
36
37    let result = algorithm
38        .run(&problem)
39        .expect("Hill Climbing run failed");
40
41    if let Some(best) = result.best_solution(&problem) {
42        println!(
43            "Hill-Climbing finished (seed={}). Best fitness={:.4}",
44            seed,
45            best.quality_value()
46        );
47    } else {
48        println!("Hill-Climbing finished with no solutions (seed={})", seed);
49    }
50}