Skip to main content

knapsack_ga_demo/
knapsack_ga_demo.rs

1use 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}