knapsack_ga_demo/
knapsack_ga_demo.rs1use roma_lib::algorithms::{
2 Algorithm,
3 GeneticAlgorithm,
4 GeneticAlgorithmParameters,
5 TerminationCriteria,
6 TerminationCriterion,
7};
8use roma_lib::observer::{ChartObserver, ConsoleObserver, Observable};
9use roma_lib::operator::{BinaryTournamentSelection, BitFlipMutation, SinglePointCrossover};
10use roma_lib::problem::KnapsackBuilder;
11use roma_lib::solution_set::SolutionSet;
12use roma_lib::utils::cli::seed_from_cli_or;
13
14fn main() {
15 let seed = seed_from_cli_or(42);
16
17 let problem = KnapsackBuilder::new()
18 .with_capacity(150.0)
19 .add_item(10.0, 20.0)
20 .add_item(20.0, 30.0)
21 .add_item(30.0, 60.0)
22 .add_item(35.0, 65.0)
23 .add_item(45.0, 70.0)
24 .add_item(55.0, 90.0)
25 .add_item(150.0, 300.0)
26 .build();
27
28 let parameters = GeneticAlgorithmParameters::new(
29 50,
30 0.85,
31 0.08,
32 SinglePointCrossover::new(),
33 BitFlipMutation::new(),
34 BinaryTournamentSelection::new(),
35 TerminationCriteria::new(vec![TerminationCriterion::MaxIterations(40)]),
36 )
37 .with_elite_size(1)
38 .with_seed(seed);
39
40 let mut algorithm = GeneticAlgorithm::new(parameters);
41 algorithm.add_observer(Box::new(ConsoleObserver::new(true)));
42 algorithm.add_observer(Box::new(ChartObserver::new_default()));
43
44 let result = algorithm
45 .run(&problem)
46 .expect("GA run failed");
47
48 if let Some(best) = result.best_solution(&problem) {
49 println!(
50 "GA finished (seed={}). Best fitness={:.4}",
51 seed,
52 best.quality_value()
53 );
54 } else {
55 println!("GA finished with no solutions (seed={})", seed);
56 }
57}