Add direction to beltfinding.

This commit is contained in:
hal8174 2024-02-27 17:50:02 +01:00
parent 29ef8eb39d
commit 0b84841768
2 changed files with 164 additions and 49 deletions

View file

@ -71,6 +71,11 @@ impl ConflictAvoidance {
for i in 0..problem.path.len() { for i in 0..problem.path.len() {
let mut p = Vec::new(); let mut p = Vec::new();
p.push(PathField::Belt {
pos: problem.start[i].0,
dir: problem.start[i].1,
});
for j in 0..problem.path[i].len() - 1 { for j in 0..problem.path[i].len() - 1 {
p.push(PathField::Belt { p.push(PathField::Belt {
pos: problem.path[i][j], pos: problem.path[i][j],
@ -80,7 +85,12 @@ impl ConflictAvoidance {
p.push(PathField::Belt { p.push(PathField::Belt {
pos: *problem.path[i].last().unwrap(), pos: *problem.path[i].last().unwrap(),
dir: *p.last().unwrap().dir(), dir: problem.end[i].1,
});
p.push(PathField::Belt {
pos: problem.end[i].0,
dir: problem.end[i].1,
}); });
belts.push(p); belts.push(p);
@ -109,7 +119,7 @@ impl ConflictAvoidance {
} }
for path in &self.belts { for path in &self.belts {
for p in path { for p in &path[1..path.len() - 1] {
match p { match p {
PathField::Belt { pos, dir: _ } => { PathField::Belt { pos, dir: _ } => {
*conflicts.get_mut(pos.x as usize, pos.y as usize) += 1 *conflicts.get_mut(pos.x as usize, pos.y as usize) += 1
@ -426,7 +436,7 @@ impl ConflictAvoidance {
} }
for path in &self.belts { for path in &self.belts {
for p in path { for p in &path[1..path.len() - 1] {
match p { match p {
PathField::Belt { pos, dir: _ } => { PathField::Belt { pos, dir: _ } => {
*conflicts.get_mut(pos.x as usize, pos.y as usize) += 1 *conflicts.get_mut(pos.x as usize, pos.y as usize) += 1

View file

@ -7,7 +7,7 @@ use crate::{
use std::ops::Index; use std::ops::Index;
use termcolor::{Color, ColorSpec}; use termcolor::{Color, ColorSpec};
use self::common::{print_map, PathField, Position, PositionType}; use self::common::{print_map, Direction, PathField, Position, PositionType};
pub mod brute_force; pub mod brute_force;
pub mod common; pub mod common;
@ -21,8 +21,8 @@ pub struct Field {
pub struct Problem { pub struct Problem {
map: Map<Field>, map: Map<Field>,
start: Vec<Position>, start: Vec<(Position, Direction)>,
end: Vec<Position>, end: Vec<(Position, Direction)>,
path: Vec<Vec<Position>>, path: Vec<Vec<Position>>,
} }
@ -36,7 +36,7 @@ impl Problem {
} }
} }
pub fn add_connection(&mut self, start: Position, end: Position) { pub fn add_connection(&mut self, start: (Position, Direction), end: (Position, Direction)) {
self.start.push(start); self.start.push(start);
self.end.push(end); self.end.push(end);
self.path.push(Vec::new()); self.path.push(Vec::new());
@ -80,11 +80,11 @@ impl Problem {
} }
for p in &self.start { for p in &self.start {
self.map.get_mut(p.x as usize, p.y as usize).wheight += 200.0; self.map.get_mut(p.0.x as usize, p.0.y as usize).wheight = f64::INFINITY;
} }
for p in &self.end { for p in &self.end {
self.map.get_mut(p.x as usize, p.y as usize).wheight += 200.0; self.map.get_mut(p.0.x as usize, p.0.y as usize).wheight = f64::INFINITY;
} }
} }
@ -94,14 +94,14 @@ impl Problem {
if let Some(i) = self if let Some(i) = self
.start .start
.iter() .iter()
.position(|p| p == &Position::new(x as PositionType, y as PositionType)) .position(|p| p.0 == Position::new(x as PositionType, y as PositionType))
{ {
color.set_fg(Some(COLORS[i])); color.set_fg(Some(COLORS[i]));
(color, "s") (color, "s")
} else if let Some(i) = self } else if let Some(i) = self
.end .end
.iter() .iter()
.position(|p| p == &Position::new(x as PositionType, y as PositionType)) .position(|p| p.0 == Position::new(x as PositionType, y as PositionType))
{ {
color.set_fg(Some(COLORS[i])); color.set_fg(Some(COLORS[i]));
(color, "t") (color, "t")
@ -111,13 +111,15 @@ impl Problem {
.map(|j| (i, j)) .map(|j| (i, j))
}) { }) {
color.set_fg(Some(COLORS[i])); color.set_fg(Some(COLORS[i]));
if self.path[i][p].x < self.path[i][p + 1].x { let c = &self.path[i][p];
let n = self.path[i].get(p + 1).unwrap_or(&self.end[i].0);
if c.x < n.x {
(color, "") (color, "")
} else if self.path[i][p].x > self.path[i][p + 1].x { } else if c.x > n.x {
(color, "") (color, "")
} else if self.path[i][p].y < self.path[i][p + 1].y { } else if c.y < n.y {
(color, "") (color, "")
} else if self.path[i][p].y > self.path[i][p + 1].y { } else if c.y > n.y {
(color, "") (color, "")
} else { } else {
unreachable!() unreachable!()
@ -210,7 +212,11 @@ impl Problem {
for i in 0..self.start.len() { for i in 0..self.start.len() {
self.calculate_wheights(i); self.calculate_wheights(i);
let m = MapInternal { map: &self.map }; let m = MapInternal { map: &self.map };
let p = dijkstra::<MapInternal, FibonacciHeap<_>>(&m, self.start[i], self.end[i]); let p = dijkstra::<MapInternal, FibonacciHeap<_>>(
&m,
self.start[i].0.in_direction(&self.start[i].1, 1),
self.end[i].0.in_direction(&self.end[i].1, -1),
);
if let Some(p) = p { if let Some(p) = p {
self.path[i] = p; self.path[i] = p;
@ -220,7 +226,10 @@ impl Problem {
} }
pub mod problems { pub mod problems {
use super::{common::Position, Problem}; use super::{
common::{Direction, Position},
Problem,
};
pub fn belt_madness_level_1() -> Problem { pub fn belt_madness_level_1() -> Problem {
let mut p = Problem::new(17, 13); let mut p = Problem::new(17, 13);
@ -253,11 +262,23 @@ pub mod problems {
p.set_blocked(16, 9, true); p.set_blocked(16, 9, true);
p.add_connection(Position::new(3, 7), Position::new(13, 4)); p.add_connection(
p.add_connection(Position::new(3, 8), Position::new(13, 5)); (Position::new(2, 7), Direction::Right),
(Position::new(14, 4), Direction::Right),
);
p.add_connection(
(Position::new(2, 8), Direction::Right),
(Position::new(14, 5), Direction::Right),
);
p.add_connection(Position::new(3, 4), Position::new(13, 8)); p.add_connection(
p.add_connection(Position::new(3, 5), Position::new(13, 7)); (Position::new(2, 4), Direction::Right),
(Position::new(14, 8), Direction::Right),
);
p.add_connection(
(Position::new(2, 5), Direction::Right),
(Position::new(14, 7), Direction::Right),
);
p p
} }
@ -278,15 +299,39 @@ pub mod problems {
p.set_blocked(16, 9, true); p.set_blocked(16, 9, true);
p.add_connection(Position::new(3, 4), Position::new(13, 2)); p.add_connection(
p.add_connection(Position::new(3, 7), Position::new(13, 3)); (Position::new(2, 4), Direction::Right),
p.add_connection(Position::new(3, 10), Position::new(13, 4)); (Position::new(14, 2), Direction::Right),
p.add_connection(Position::new(3, 9), Position::new(13, 5)); );
p.add_connection(
(Position::new(2, 7), Direction::Right),
(Position::new(14, 3), Direction::Right),
);
p.add_connection(
(Position::new(2, 10), Direction::Right),
(Position::new(14, 4), Direction::Right),
);
p.add_connection(
(Position::new(2, 9), Direction::Right),
(Position::new(14, 5), Direction::Right),
);
p.add_connection(Position::new(3, 2), Position::new(13, 7)); p.add_connection(
p.add_connection(Position::new(3, 3), Position::new(13, 8)); (Position::new(2, 2), Direction::Right),
p.add_connection(Position::new(3, 5), Position::new(13, 9)); (Position::new(14, 7), Direction::Right),
p.add_connection(Position::new(3, 8), Position::new(13, 10)); );
p.add_connection(
(Position::new(2, 3), Direction::Right),
(Position::new(14, 8), Direction::Right),
);
p.add_connection(
(Position::new(2, 5), Direction::Right),
(Position::new(14, 9), Direction::Right),
);
p.add_connection(
(Position::new(2, 8), Direction::Right),
(Position::new(14, 10), Direction::Right),
);
p p
} }
@ -309,13 +354,31 @@ pub mod problems {
p.set_blocked(32, 3, true); p.set_blocked(32, 3, true);
p.set_blocked(32, 9, true); p.set_blocked(32, 9, true);
p.add_connection(Position::new(3, 3), Position::new(29, 7)); p.add_connection(
p.add_connection(Position::new(3, 4), Position::new(29, 9)); (Position::new(2, 3), Direction::Right),
p.add_connection(Position::new(3, 5), Position::new(29, 8)); (Position::new(29, 7), Direction::Right),
);
p.add_connection(
(Position::new(2, 4), Direction::Right),
(Position::new(29, 9), Direction::Right),
);
p.add_connection(
(Position::new(2, 5), Direction::Right),
(Position::new(29, 8), Direction::Right),
);
p.add_connection(Position::new(3, 7), Position::new(29, 3)); p.add_connection(
p.add_connection(Position::new(3, 8), Position::new(29, 5)); (Position::new(2, 7), Direction::Right),
p.add_connection(Position::new(3, 9), Position::new(29, 4)); (Position::new(29, 3), Direction::Right),
);
p.add_connection(
(Position::new(2, 8), Direction::Right),
(Position::new(29, 5), Direction::Right),
);
p.add_connection(
(Position::new(2, 9), Direction::Right),
(Position::new(29, 4), Direction::Right),
);
p p
} }
@ -408,20 +471,62 @@ pub mod problems {
p.set_blocked_range(28, 17, 29, 17, true); p.set_blocked_range(28, 17, 29, 17, true);
// Path // Path
p.add_connection(Position::new(4, 3), Position::new(26, 25)); p.add_connection(
p.add_connection(Position::new(12, 3), Position::new(18, 25)); (Position::new(4, 2), Direction::Down),
p.add_connection(Position::new(14, 3), Position::new(3, 26)); (Position::new(26, 26), Direction::Down),
p.add_connection(Position::new(16, 3), Position::new(14, 25)); );
p.add_connection(Position::new(3, 4), Position::new(27, 24)); p.add_connection(
p.add_connection(Position::new(3, 11), Position::new(27, 17)); (Position::new(12, 2), Direction::Down),
p.add_connection(Position::new(3, 13), Position::new(27, 26)); (Position::new(18, 26), Direction::Down),
p.add_connection(Position::new(3, 15), Position::new(27, 13)); );
p.add_connection(Position::new(27, 15), Position::new(2, 3)); p.add_connection(
p.add_connection(Position::new(3, 17), Position::new(18, 3)); (Position::new(14, 2), Direction::Down),
p.add_connection(Position::new(3, 24), Position::new(26, 3)); (Position::new(2, 26), Direction::Left),
p.add_connection(Position::new(4, 25), Position::new(27, 4)); );
p.add_connection(Position::new(12, 25), Position::new(27, 11)); p.add_connection(
p.add_connection(Position::new(16, 25), Position::new(28, 3)); (Position::new(16, 2), Direction::Down),
(Position::new(14, 26), Direction::Down),
);
p.add_connection(
(Position::new(2, 4), Direction::Right),
(Position::new(28, 24), Direction::Right),
);
p.add_connection(
(Position::new(2, 11), Direction::Right),
(Position::new(28, 17), Direction::Right),
);
p.add_connection(
(Position::new(2, 13), Direction::Right),
(Position::new(28, 26), Direction::Right),
);
p.add_connection(
(Position::new(2, 15), Direction::Right),
(Position::new(28, 13), Direction::Right),
);
p.add_connection(
(Position::new(28, 15), Direction::Left),
(Position::new(2, 2), Direction::Up),
);
p.add_connection(
(Position::new(2, 17), Direction::Right),
(Position::new(18, 2), Direction::Up),
);
p.add_connection(
(Position::new(2, 24), Direction::Right),
(Position::new(26, 2), Direction::Up),
);
p.add_connection(
(Position::new(4, 26), Direction::Up),
(Position::new(28, 4), Direction::Right),
);
p.add_connection(
(Position::new(12, 26), Direction::Up),
(Position::new(28, 11), Direction::Right),
);
p.add_connection(
(Position::new(16, 26), Direction::Up),
(Position::new(28, 2), Direction::Up),
);
p p
} }