1use rs_genetics::plot::draw_fitness;
2use rs_genetics::population::{Config, GA, GetPopulation, InitializationStrategy, Population, TSPInitialization};
3
4fn main() {
5 struct City{x:f64,y:f64,}
6 fn distance_(city1: &City, city2: &City) -> f64 {
7 ((city1.x - city2.x).powi(2) + (city1.y - city2.y).powi(2)).sqrt()
8 }
9 fn total_distance(weights: Population) -> f64 {
10 let cities = vec![City{x:41.9028,y:12.4964},City{x:48.8566,y:2.3522},City{x:37.9838,y:23.7275},City{x:52.5200,y:13.4050},City{x:51.5074,y:-0.1278},City{x:48.2082,y:16.3738}];
13 let mut distance = 0.0;
14 match weights {
15 Population::Usize(vec)=>{
16 for i in 0..cities.len() - 1 {
17 distance += distance_(&cities[vec[0][i]], &cities[vec[0][i + 1]]);
18 }
19 distance += distance_(&cities[cities.len() - 1], &cities[0]);
20 distance
21 }
22 _ => panic!("Expected Population::usize")
23 }
24 }
25
26 let init_strategy = InitializationStrategy::Usize(Box::new(TSPInitialization));
27 let mut config = Config::default();
28 config.num_individuals=100;
29 config.num_genes = 6;
30 let mut ga = GA::new(init_strategy, total_distance, config);
31
32 let hist = ga.evolve(100);
33 let solution:Vec<usize> = ga.population.get_individual(0).unwrap();
34 println!("Solution = {:?}",solution);
35 draw_fitness(hist, "fitness_curve.png");
36}