tsp/
tsp.rs

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        //solving for 5-points star
11        //historical europe tour: Rome, Paris, Athens, Berlin, London, Vienna
12        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}