German comments; optimizations
This commit is contained in:
parent
c93c0d3043
commit
6de816f6a4
29
Cargo.lock
generated
29
Cargo.lock
generated
@ -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"
|
||||
|
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "Aufgabe1"
|
||||
name = "aufgabe1"
|
||||
version = "0.1.0"
|
||||
authors = ["arne"]
|
||||
authors = ["Arne Keller <arne.keller01@yahoo.de>"]
|
||||
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"
|
||||
|
@ -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)| {
|
||||
|
81
src/main.rs
81
src/main.rs
@ -13,16 +13,16 @@ type Line = geo::Line<f64>;
|
||||
type LineString = geo::LineString<f64>;
|
||||
type Polygon = geo::Polygon<f64>;
|
||||
|
||||
// 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::<Vec<_>>();
|
||||
|
||||
// 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 delay = max_possible_delay(bus_next, next);
|
||||
if delay > best_delay {
|
||||
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),
|
||||
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<Point> {
|
||||
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![]
|
||||
);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user