bugfix
This commit is contained in:
parent
9e9c0a76f8
commit
8de66358c0
2 changed files with 25 additions and 36 deletions
|
|
@ -76,10 +76,6 @@ pub fn find_optimal_path(
|
||||||
let t0 = SystemTime::now();
|
let t0 = SystemTime::now();
|
||||||
let mut running = true;
|
let mut running = true;
|
||||||
|
|
||||||
// this is time spent for the path, grid keeps the global timeframe
|
|
||||||
// same as path length, so remove?
|
|
||||||
let mut discrete_elapsed = 0;
|
|
||||||
|
|
||||||
// will keep at most 8 new directions from current location
|
// will keep at most 8 new directions from current location
|
||||||
let mut new_directions = vec![];
|
let mut new_directions = vec![];
|
||||||
|
|
||||||
|
|
@ -111,13 +107,13 @@ pub fn find_optimal_path(
|
||||||
new_directions.push(Point::new(
|
new_directions.push(Point::new(
|
||||||
x,
|
x,
|
||||||
y - 1,
|
y - 1,
|
||||||
grid.get_value(x, y - 1, discrete_elapsed),
|
grid.get_value(x, y - 1, current_path.length() + 1),
|
||||||
));
|
));
|
||||||
if x < N - 1 {
|
if x < N - 1 {
|
||||||
new_directions.push(Point::new(
|
new_directions.push(Point::new(
|
||||||
x + 1,
|
x + 1,
|
||||||
y - 1,
|
y - 1,
|
||||||
grid.get_value(x + 1, y - 1, discrete_elapsed),
|
grid.get_value(x + 1, y - 1, current_path.length() + 1),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -126,13 +122,13 @@ pub fn find_optimal_path(
|
||||||
new_directions.push(Point::new(
|
new_directions.push(Point::new(
|
||||||
x - 1,
|
x - 1,
|
||||||
y,
|
y,
|
||||||
grid.get_value(x - 1, y, discrete_elapsed),
|
grid.get_value(x - 1, y, current_path.length() + 1),
|
||||||
));
|
));
|
||||||
if y > 0 {
|
if y > 0 {
|
||||||
new_directions.push(Point::new(
|
new_directions.push(Point::new(
|
||||||
x - 1,
|
x - 1,
|
||||||
y - 1,
|
y - 1,
|
||||||
grid.get_value(x - 1, y - 1, discrete_elapsed),
|
grid.get_value(x - 1, y - 1, current_path.length() + 1),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -141,13 +137,13 @@ pub fn find_optimal_path(
|
||||||
new_directions.push(Point::new(
|
new_directions.push(Point::new(
|
||||||
x + 1,
|
x + 1,
|
||||||
y,
|
y,
|
||||||
grid.get_value(x + 1, y, discrete_elapsed),
|
grid.get_value(x + 1, y, current_path.length() + 1),
|
||||||
));
|
));
|
||||||
if y < N - 1 {
|
if y < N - 1 {
|
||||||
new_directions.push(Point::new(
|
new_directions.push(Point::new(
|
||||||
x + 1,
|
x + 1,
|
||||||
y + 1,
|
y + 1,
|
||||||
grid.get_value(x + 1, y + 1, discrete_elapsed),
|
grid.get_value(x + 1, y + 1, current_path.length() + 1),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -156,13 +152,13 @@ pub fn find_optimal_path(
|
||||||
new_directions.push(Point::new(
|
new_directions.push(Point::new(
|
||||||
x,
|
x,
|
||||||
y + 1,
|
y + 1,
|
||||||
grid.get_value(x, y + 1, discrete_elapsed),
|
grid.get_value(x, y + 1, current_path.length() + 1),
|
||||||
));
|
));
|
||||||
if x > 0 {
|
if x > 0 {
|
||||||
new_directions.push(Point::new(
|
new_directions.push(Point::new(
|
||||||
x - 1,
|
x - 1,
|
||||||
y + 1,
|
y + 1,
|
||||||
grid.get_value(x - 1, y + 1, discrete_elapsed),
|
grid.get_value(x - 1, y + 1, current_path.length() + 1),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -179,7 +175,7 @@ pub fn find_optimal_path(
|
||||||
|
|
||||||
if !taken_paths.contains(&hash) {
|
if !taken_paths.contains(&hash) {
|
||||||
points_added = true;
|
points_added = true;
|
||||||
grid.hit(point.x, point.y, discrete_elapsed);
|
grid.hit(point.x, point.y, new_path.length());
|
||||||
paths_to_consider.push(new_path);
|
paths_to_consider.push(new_path);
|
||||||
taken_paths.insert(hash);
|
taken_paths.insert(hash);
|
||||||
}
|
}
|
||||||
|
|
@ -192,6 +188,8 @@ pub fn find_optimal_path(
|
||||||
max = ended;
|
max = ended;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//drop lock
|
||||||
}
|
}
|
||||||
|
|
||||||
// continue?
|
// continue?
|
||||||
|
|
@ -201,7 +199,6 @@ pub fn find_optimal_path(
|
||||||
running = false;
|
running = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
discrete_elapsed += 1;
|
|
||||||
}
|
}
|
||||||
max
|
max
|
||||||
}
|
}
|
||||||
|
|
@ -216,32 +213,23 @@ mod tests {
|
||||||
let opt = find_optimal_path(Arc::new(Mutex::new(grid.clone())), 100, 10, 1000, 9, 9);
|
let opt = find_optimal_path(Arc::new(Mutex::new(grid.clone())), 100, 10, 1000, 9, 9);
|
||||||
|
|
||||||
let mut all_points: HashSet<Point> = HashSet::new();
|
let mut all_points: HashSet<Point> = HashSet::new();
|
||||||
|
let mut loop_in_path = false;
|
||||||
for point in opt.points.iter() {
|
for point in opt.points.iter() {
|
||||||
if all_points.contains(point) {
|
if all_points.contains(point) {
|
||||||
if all_points.contains(point) {
|
// we have a path that crosses itself
|
||||||
let iv = grid.get_initial_value(point.x, point.y);
|
// path value should be less than sum of individual initial values of point
|
||||||
assert!(point.value < iv);
|
loop_in_path = true
|
||||||
}
|
|
||||||
}
|
|
||||||
all_points.insert(point.clone());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
pub fn test_multiple_drones() {
|
|
||||||
let grid = Grid::new(100);
|
|
||||||
let paths_result = find_optimal_path_for_n_drones(grid.clone(), 4, 100, 10, 1000);
|
|
||||||
|
|
||||||
let mut all_points: HashSet<Point> = HashSet::new();
|
|
||||||
|
|
||||||
for path in paths_result.paths.iter() {
|
|
||||||
for point in path.points.iter() {
|
|
||||||
if all_points.contains(point) {
|
|
||||||
let iv = grid.get_initial_value(point.x, point.y);
|
|
||||||
assert!(point.value < iv);
|
|
||||||
}
|
}
|
||||||
all_points.insert(point.clone());
|
all_points.insert(point.clone());
|
||||||
}
|
}
|
||||||
|
if loop_in_path {
|
||||||
|
println!("check");
|
||||||
|
let max_sum: f32 = opt
|
||||||
|
.points
|
||||||
|
.iter()
|
||||||
|
.map(|p| grid.get_initial_value(p.x, p.y))
|
||||||
|
.sum();
|
||||||
|
assert!(max_sum > opt.value());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use std::{
|
||||||
sync::{Arc, Mutex},
|
sync::{Arc, Mutex},
|
||||||
};
|
};
|
||||||
|
|
||||||
const RECOVERY_FACTOR: f32 = 0.01;
|
const RECOVERY_FACTOR: f32 = 0.1;
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
@ -105,6 +105,7 @@ impl Path {
|
||||||
Self { points, value }
|
Self { points, value }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// length = age of the path
|
||||||
pub fn length(&self) -> usize {
|
pub fn length(&self) -> usize {
|
||||||
self.points.len()
|
self.points.len()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue