From 6de816f6a4fb1bf839e1541ee2a45c71f1506a1a Mon Sep 17 00:00:00 2001 From: Arne Keller Date: Thu, 31 Jan 2019 16:10:03 +0100 Subject: [PATCH] German comments; optimizations --- Cargo.lock | 29 +-------------- Cargo.toml | 5 +-- src/display.rs | 4 +- src/main.rs | 99 +++++++++++++++++--------------------------------- 4 files changed, 38 insertions(+), 99 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e51e184..2d6fb9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,9 +1,8 @@ [[package]] -name = "Aufgabe1" +name = "aufgabe1" version = "0.1.0" dependencies = [ "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "decorum 0.1.2", "geo 0.11.0", "svg 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -55,15 +54,6 @@ dependencies = [ "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "decorum" -version = "0.1.2" -dependencies = [ - "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "failure" version = "0.1.5" @@ -160,21 +150,6 @@ name = "rustc-demangle" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "serde" -version = "1.0.84" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "serde_derive" -version = "1.0.84" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.25 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "svg" version = "0.5.12" @@ -253,8 +228,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum redox_syscall 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)" = "423e376fffca3dfa06c9e9790a9ccd282fafb3cc6e6397d01dbf64f9bacc6b85" "checksum rstar 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "64ffe043929ee67d46694af1a4851f6bbe571b52a55677ba1686222dc35fd449" "checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619" -"checksum serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)" = "0e732ed5a5592c17d961555e3b552985baf98d50ce418b7b655f31f6ba7eb1b7" -"checksum serde_derive 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d6115a3ca25c224e409185325afc16a0d5aaaabc15c42b09587d6f1ba39a5b" "checksum svg 0.5.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a863ec1f8e7cfd4ea449f77445cca06aac240b9a677ccf12b0f65ef020db52c7" "checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" diff --git a/Cargo.toml b/Cargo.toml index 24513d1..9f57773 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "Aufgabe1" +name = "aufgabe1" version = "0.1.0" -authors = ["arne"] +authors = ["Arne Keller "] edition = "2018" [profile.release] @@ -11,5 +11,4 @@ opt-level = 3 [dependencies] geo = { path = "/home/arne/Documents/Code/Github/geo/geo" } svg = "0.5.11" -decorum = { path = "/home/arne/Documents/Code/Github/decorum" } chrono = "0.4.6" diff --git a/src/display.rs b/src/display.rs index ed0443f..739c605 100644 --- a/src/display.rs +++ b/src/display.rs @@ -63,8 +63,8 @@ pub(crate) fn generate_svg( route2_start: Point, ) -> String { let mut document = Document::new() - // view box at (0, -200), w*h (200, 200) - .set("viewBox", (0, -1100, 2100, 2100)) + // view box at (x,y), (w,h) + .set("viewBox", (0.0, route2_start.y(), 2100.0, -route2_start.y()+1000.0)) .set("xmlns:xlink", "http://www.w3.org/1999/xlink"); for circle in points.iter().map(|(p, color)| { diff --git a/src/main.rs b/src/main.rs index 0e5a148..fbc9ebd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,16 +13,16 @@ type Line = geo::Line; type LineString = geo::LineString; type Polygon = geo::Polygon; -// 30 km/h = 8+1/3 meters/second -// 15 km/h = 4+1/6 meters/second +// 30 km/h = 8+1/3 m/s +// 15 km/h = 4+1/6 m/s #[derive(Debug, Clone, PartialEq)] struct RunState { - /// Theoretically possible maximum delay + /// Theoretisch mögliche Wartezeit delay: f64, - /// Our current location + /// Lisas Position pos: Point, - /// Current location of the bus, not including any delays + /// Position des Busses bus: Point, } impl cmp::Eq for RunState {} @@ -38,33 +38,36 @@ impl cmp::PartialOrd for RunState { } fn main() { - // starting at 07:00, bus is 15 km away + // 07:00: Bus ist 15 km entfernt let start_time = NaiveTime::from_hms(7, 0, 0); let bus = Point::new(0.0, -15000.0); + // 30 km/h -> 8.3 m/s let bus_speed = 30.0 / 3.6; + // Zeitpunkt basierend auf Wartezeit in Sekunden berechnen let delay_to_time = |delay| start_time + Duration::seconds((delay / bus_speed) as i64); + // Input einlesen (Lisas Haus und Hindernisse) let data = input::read_input(); let house = data.start; let polys = data.polys; - eprintln!("{:?}", house); - eprintln!("{:?}", polys); for p in &polys { assert!(p.interiors.is_empty()); } + // alle Ecken der Hindernisse bestimmen let points = polys .iter() .map(|x| x.exterior.0.clone()) .flatten() .collect::>(); + // Startzustand let start = RunState { pos: house, bus: bus, delay: max_possible_delay(bus, house), }; - eprintln!("# Max. delay possible: {:?}", delay_to_time(start.delay)); + eprintln!("Maximum: {:?}", delay_to_time(start.delay)); let mut states = BinaryHeap::new(); states.push(vec![start]); @@ -74,36 +77,39 @@ fn main() { let save_prefix = "tmp_"; let mut save_counter = 0; + // weitersuchen, bis kein besserer Zustand mehr vorhanden ist while states.peek().map(|x| x[0].delay > best_delay) == Some(true) { let s = states.pop().unwrap(); let last = &s[0]; - // new states + // neue Zustände let mut all = vec![]; - // attempt to go to any other vertex/point + // versuche zu jeder anderen Ecke zu gehen for next in points .iter() .filter(|next| !s.iter().any(|x| x.pos == (**next).into())) { let next = Point::from(*next); if next != last.pos && none_intersect(&polys, &Line::new(last.pos, next)) { - // could run to that point + // Lisa könnte zu dieser Ecke rennen let bus_next = last.bus.translate(0.0, distance(last.pos, next) * 2.0); - let mut route = s.clone(); - //eprintln!("{},{} would go {},{}", last.pos.x(), last.pos.y(), next.x(), next.y()); - route.insert( - 0, - RunState { - pos: next, - bus: bus_next, - delay: max_possible_delay(bus_next, next), - }, - ); - all.push(route); + let delay = max_possible_delay(bus_next, next); + if delay > best_delay { + let mut route = s.clone(); + route.insert( + 0, + RunState { + pos: next, + bus: bus_next, + delay, + }, + ); + all.push(route); + } } } - // attempt to go to the bus + // versuche, direkt zum Bus zu gehen let bus = last.bus; let range = to_bus(bus, last.pos); if range.len() == 2 { @@ -118,7 +124,7 @@ fn main() { line.end.y - bus.y() - line.end_point().euclidean_distance(&line.start_point()) * 2.0; if delay > best_delay { - // new high score! + // neue beste Wartezeit let mut route = s.clone(); route.insert( 0, @@ -129,31 +135,27 @@ fn main() { }, ); eprintln!( - "# New best delay {:?} ({:?} states left)", + "Verbesserung: {:?} ({:?} Zustände verbleiben)", delay_to_time(delay), states.len() ); best = route; best.reverse(); best_delay = delay; - /* display::save_svg( &format!("{}{}.svg", save_prefix, save_counter), house, &polys, &best, ); - */ save_counter += 1; - } else { - // not worth it } } } states.extend(all); } } - eprintln!("d = {:?}", delay_to_time(best_delay)); + eprintln!("Zeit = {:?}", delay_to_time(best_delay)); let route = best; eprintln!("Route:"); for s in &route { @@ -246,38 +248,3 @@ fn to_bus(bus: Point, start: Point) -> Vec { vec![] } } - -#[cfg(test)] -#[test] -fn test_to_bus() { - assert!( - to_bus( - Coordinate { - x: 0.0.into(), - y: 0.0.into() - } - .into(), - Coordinate { - x: 1.0.into(), - y: 23.0.into() - } - .into() - ) - .len() == 2 - ); - assert_eq!( - to_bus( - Coordinate { - x: 0.0.into(), - y: 168.7601848778319.into() - } - .into(), - Coordinate { - x: 1.0.into(), - y: 23.0.into() - } - .into() - ), - vec![] - ); -}