Various changes

This commit is contained in:
arnekeller 2019-04-01 23:22:35 +02:00
parent 4815d4f965
commit 551a0ba14c
3 changed files with 34 additions and 17 deletions

View File

@ -69,8 +69,15 @@ pub(crate) fn dump_latex_code(route: &[RunState], polys: &[Polygon]) {
println!("\\tkzDrawSegment(R{},R{})", idx - 1, idx); println!("\\tkzDrawSegment(R{},R{})", idx - 1, idx);
} }
for idx in 0..route.len() { for idx in 0..route.len() {
let color = if idx == 0 || idx == route.len() - 1 { "green" } else { "red" }; let color = if idx == 0 || idx == route.len() - 1 {
println!("\\tkzDrawPoint[fill={},color=black,size=13](R{})", color, idx); "green"
} else {
"red"
};
println!(
"\\tkzDrawPoint[fill={},color=black,size=13](R{})",
color, idx
);
} }
println!("\\end{{tikzpicture}}"); println!("\\end{{tikzpicture}}");
} }

View File

@ -73,9 +73,11 @@ fn read_svg(input: &str) -> Result<InputData, Box<Error>> {
let mut polys = Vec::new(); let mut polys = Vec::new();
for (id, node) in svg.descendants().svg() { for (id, node) in svg.descendants().svg() {
//eprintln!("<{:?} /> {:?}", id, node); //eprintln!("<{:?} /> {:?}", id, node);
if id == ElementId::Path && *node.parent().unwrap().tag_name() != QName::Id(ElementId::Marker) { if id == ElementId::Path
let attrs = node.attributes(); && *node.parent().unwrap().tag_name() != QName::Id(ElementId::Marker)
if let Some(&AttributeValue::Path(ref path)) = attrs.get_value(AttributeId::D) { {
let attrs = node.attributes();
if let Some(&AttributeValue::Path(ref path)) = attrs.get_value(AttributeId::D) {
let mut path = path.clone(); let mut path = path.clone();
path.conv_to_absolute(); path.conv_to_absolute();
@ -84,18 +86,18 @@ fn read_svg(input: &str) -> Result<InputData, Box<Error>> {
match p { match p {
PathSegment::MoveTo { x, y, .. } => { PathSegment::MoveTo { x, y, .. } => {
points.push(Point::new(*x, -*y)); points.push(Point::new(*x, -*y));
}, }
PathSegment::LineTo { x, y, .. } => { PathSegment::LineTo { x, y, .. } => {
points.push(Point::new(*x, -*y)); points.push(Point::new(*x, -*y));
}, }
PathSegment::VerticalLineTo { y, .. } => { PathSegment::VerticalLineTo { y, .. } => {
points.push(Point::new(points.last().unwrap().x(), -*y)); points.push(Point::new(points.last().unwrap().x(), -*y));
}, }
PathSegment::HorizontalLineTo { x, .. } => { PathSegment::HorizontalLineTo { x, .. } => {
points.push(Point::new(*x, points.last().unwrap().y())); points.push(Point::new(*x, points.last().unwrap().y()));
}, }
PathSegment::ClosePath { .. } => break, PathSegment::ClosePath { .. } => break,
_ => unimplemented!("nicht unterstütztes SVG-Element: {:?}", p) _ => unimplemented!("nicht unterstütztes SVG-Element: {:?}", p),
} }
} }
if points.len() == 1 { if points.len() == 1 {
@ -105,13 +107,13 @@ fn read_svg(input: &str) -> Result<InputData, Box<Error>> {
// Hindernis // Hindernis
polys.push(Polygon::new(points.into(), vec![])); polys.push(Polygon::new(points.into(), vec![]));
} }
} }
} }
} }
Ok(InputData { Ok(InputData {
start: house.expect("kein Startpunkt definiert!"), start: house.expect("kein Startpunkt definiert!"),
polys polys,
}) })
} }

View File

@ -9,6 +9,7 @@ use std::collections::BinaryHeap;
use std::f64; use std::f64;
use std::process::exit; use std::process::exit;
use std::sync::RwLock; use std::sync::RwLock;
use std::time::{self, Instant};
mod display; mod display;
mod input; mod input;
@ -138,15 +139,16 @@ fn main() {
// Zwischenlösungen speichern // Zwischenlösungen speichern
let save_prefix = "route_"; let save_prefix = "route_";
let mut save_counter = 0; let mut save_counter = 0;
// Debug-Statistiken
let mut total_time = time::Duration::from_secs(0);
let mut iterations = 0;
// weitersuchen, bis kein besserer Zustand mehr vorhanden ist // weitersuchen, bis kein besserer Zustand mehr vorhanden ist
while states.peek().map(|x| x[0].bus > best_bus) == Some(true) { while states.peek().map(|x| x[0].bus > best_bus) == Some(true) {
let start = Instant::now();
// besten Zustand einlesen // besten Zustand einlesen
let state = states.pop().unwrap(); let state = states.pop().unwrap();
let last = &state[0]; let last = &state[0];
if opt.debug {
println!("last {:?}", last);
}
// neue Zustände // neue Zustände
let mut all = vec![]; let mut all = vec![];
@ -222,6 +224,12 @@ fn main() {
} }
// neu gefundene Routen speichern // neu gefundene Routen speichern
states.extend(all); states.extend(all);
let end = Instant::now();
total_time += end - start;
iterations += 1;
}
if opt.debug {
eprintln!("DEBUG: {}us/iteration", total_time.as_micros() / iterations);
} }
// beste Lösung ausgeben // beste Lösung ausgeben
eprintln!("Finale Lösung:"); eprintln!("Finale Lösung:");
@ -264,7 +272,7 @@ fn main() {
} }
} }
lazy_static!{ lazy_static! {
static ref RTREE: RwLock<RTree<Polygon>> = RwLock::new(RTree::new()); static ref RTREE: RwLock<RTree<Polygon>> = RwLock::new(RTree::new());
} }
@ -322,7 +330,7 @@ fn distance(a: Point, b: Point) -> f64 {
fn best_bus_pos(opt: &Opt, total_distance: f64, lisa: Point) -> f64 { fn best_bus_pos(opt: &Opt, total_distance: f64, lisa: Point) -> f64 {
let x_l = lisa.x(); // a let x_l = lisa.x(); // a
let y_l = lisa.y(); // b let y_l = lisa.y(); // b
// y-Koordinate des Busses: d // y-Koordinate des Busses: d
// Länge, die Lisa noch laufen muss: l // Länge, die Lisa noch laufen muss: l
// Verhältnis beider Geschwindigkeiten: x = bus / lisa // Verhältnis beider Geschwindigkeiten: x = bus / lisa