knapsack_hc_demo/
knapsack_hc_demo.rs1use 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}