diff --git a/Cargo.toml b/Cargo.toml index 35f2709..8f3fd7e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,5 @@ version = "0.1.0" edition = "2021" [dependencies] -rocket = "0.5.0" +rand = "0.9.0" +rocket = "0.5.1" diff --git a/src/main.rs b/src/main.rs index aa992e4..d4c7e0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,66 @@ +use rand::rng; +use rand::seq::SliceRandom; + #[macro_use] extern crate rocket; +fn calculate_distance(city1: &(f64, f64), city2: &(f64, f64)) -> f64 { + let dx = city1.0 - city2.0; + let dy = city1.1 - city2.1; + (dx * dx + dy * dy).sqrt() +} + +fn calculate_tour_length(tour: &[usize], cities: &[(f64, f64)]) -> f64 { + let mut length = 0.0; + for i in 0..tour.len() { + let city1 = &cities[tour[i]]; + let city2 = &cities[tour[(i + 1) % tour.len()]]; + length += calculate_distance(city1, city2); + } + length +} + +fn lin_kernighan(mut tour: Vec, cities: &[(f64, f64)]) -> Vec { + // let rng = rng(); + let n = cities.len(); + let mut improved = true; + + while improved { + improved = false; + for i in 0..n { + for j in (i + 2)..n { + if i == 0 && j == n - 1 { + continue; + } + let mut new_tour = tour.clone(); + new_tour[i + 1..=j].reverse(); + if calculate_tour_length(&new_tour, cities) < calculate_tour_length(&tour, cities) { + tour = new_tour; + improved = true; + } + } + } + } + tour +} + #[get("/")] -fn index() -> &'static str { - "Hello, world!" +fn index() -> String { + let cities = vec![(0.0, 0.0), (1.0, 5.0), (5.0, 2.0), (6.0, 7.0), (3.0, 4.0)]; + + let mut tour: Vec = (0..cities.len()).collect(); + tour.shuffle(&mut rng()); + + let best_tour = lin_kernighan(tour, &cities); + + // println!("Beste Tour: {:?}", best_tour); + println!( + "Länge der besten Tour: {}", + calculate_tour_length(&best_tour, &cities) + ); + + let tour_str = format!("Beste Tour: {:?}", best_tour); + return tour_str; } #[launch]