Pick the entrance/exit to an access-restricted zone more intelligently. #574

Instead of just picking the intersectin closest to the origin or
destination, calculate the full path length, and take the one with the
shortest distance. This fixes some of the weird problems routing around
Broadmoor. Regenerate all prebaked data.

Also fix the original request for paths involving zones, so tracing it
later works.
This commit is contained in:
Dustin Carlino 2021-03-19 19:24:22 -07:00
parent cb4cd1b13a
commit a68af804e3
2 changed files with 49 additions and 47 deletions

View File

@ -2286,24 +2286,24 @@
"compressed_size_bytes": 4372095
},
"data/system/gb/poundbury/prebaked_results/center/base.bin": {
"checksum": "159cd07b441955faea15049a0719918b",
"uncompressed_size_bytes": 2834055,
"compressed_size_bytes": 832169
"checksum": "bac42491b3494e52830da0b934fb2be6",
"uncompressed_size_bytes": 2834522,
"compressed_size_bytes": 832204
},
"data/system/gb/poundbury/prebaked_results/center/base_with_bg.bin": {
"checksum": "31b0bdd18a0d5a29c772e525fcca3d6a",
"uncompressed_size_bytes": 6786336,
"compressed_size_bytes": 2205554
"checksum": "31747d2feadf64b0870323bcbf3eb77a",
"uncompressed_size_bytes": 6786922,
"compressed_size_bytes": 2205528
},
"data/system/gb/poundbury/prebaked_results/center/go_active.bin": {
"checksum": "1b0af27d3e279816d39f5b73f9bf4a76",
"uncompressed_size_bytes": 2772035,
"compressed_size_bytes": 796117
"checksum": "e9bb647877f6bbb6d73308421228d9db",
"uncompressed_size_bytes": 2771963,
"compressed_size_bytes": 795919
},
"data/system/gb/poundbury/prebaked_results/center/go_active_with_bg.bin": {
"checksum": "847a663758fc76221ec26bae6551c4ed",
"uncompressed_size_bytes": 6714395,
"compressed_size_bytes": 2173020
"checksum": "7ec448c981a95f6d8b4b8a98e3944a42",
"uncompressed_size_bytes": 6714323,
"compressed_size_bytes": 2172962
},
"data/system/gb/poundbury/scenarios/center/base.bin": {
"checksum": "0dc5e7cedeeda0e18704fcf0c9eb8f75",
@ -2736,14 +2736,14 @@
"compressed_size_bytes": 26933516
},
"data/system/us/seattle/prebaked_results/arboretum/weekday.bin": {
"checksum": "24fe3a9df3610d1db557a4425e3bd3db",
"uncompressed_size_bytes": 18358337,
"compressed_size_bytes": 6593871
"checksum": "1d308cdfa7e4853729274165b8bf3bac",
"uncompressed_size_bytes": 18360009,
"compressed_size_bytes": 6597446
},
"data/system/us/seattle/prebaked_results/lakeslice/weekday.bin": {
"checksum": "95848187af817d99412a5d9857cb818b",
"uncompressed_size_bytes": 64544192,
"compressed_size_bytes": 24040105
"checksum": "5b2b576cb71fb870bda54cc6e153a41c",
"uncompressed_size_bytes": 64596535,
"compressed_size_bytes": 24053905
},
"data/system/us/seattle/prebaked_results/montlake/car vs bike contention.bin": {
"checksum": "11d45186274bff88661c3eccb318aed0",
@ -2751,14 +2751,14 @@
"compressed_size_bytes": 1741
},
"data/system/us/seattle/prebaked_results/montlake/weekday.bin": {
"checksum": "f668cdc23cb8c763ec1a68f5b13ddfa5",
"checksum": "06eec80a205a99e1d96da6bd2231c4a5",
"uncompressed_size_bytes": 8560028,
"compressed_size_bytes": 2955322
"compressed_size_bytes": 2955530
},
"data/system/us/seattle/prebaked_results/phinney/weekday.bin": {
"checksum": "e59ef0f759ca536afbd59db14c340f37",
"uncompressed_size_bytes": 32583330,
"compressed_size_bytes": 12306561
"checksum": "271cbd15721101a3dcf6355bf9e9c79c",
"uncompressed_size_bytes": 32575127,
"compressed_size_bytes": 12305494
},
"data/system/us/seattle/prebaked_results/qa/weekday.bin": {
"checksum": "1f72209378521ff11b9743c740800373",
@ -2766,9 +2766,9 @@
"compressed_size_bytes": 3184023
},
"data/system/us/seattle/prebaked_results/rainier_valley/weekday.bin": {
"checksum": "e5fc47008c70becca4a13cf6b547a83f",
"uncompressed_size_bytes": 13931544,
"compressed_size_bytes": 4910521
"checksum": "197d0c2b5793e66c6d7d2c09ff740c68",
"uncompressed_size_bytes": 13927740,
"compressed_size_bytes": 4907841
},
"data/system/us/seattle/prebaked_results/wallingford/weekday.bin": {
"checksum": "790c6bcbaf164983127ed9d4b39c0acc",

View File

@ -71,18 +71,18 @@ impl Pathfinder {
.allow_through_traffic
.contains(req.constraints)
{
let mut borders: Vec<&Intersection> =
zone.borders.iter().map(|i| map.get_i(*i)).collect();
// TODO Use the CH to pick the lowest overall cost?
let pt = req.end.pt(map);
borders.sort_by_key(|i| pt.dist_to(i.polygon.center()));
for i in borders {
if let Some(result) = self.pathfind_from_zone(i, req.clone(), zone, map) {
return Some(result);
// Calculate the entire path using every possible border, then take the one
// with the least total distance.
// TODO This is slow and doesn't account for the mode-specific cost.
let mut paths = Vec::new();
for i in &zone.borders {
if let Some(result) =
self.pathfind_from_zone(map.get_i(*i), req.clone(), zone, map)
{
paths.push(result);
}
}
return None;
return paths.into_iter().min_by_key(|p| p.total_length());
}
}
(None, Some(zone)) => {
@ -91,18 +91,18 @@ impl Pathfinder {
.allow_through_traffic
.contains(req.constraints)
{
let mut borders: Vec<&Intersection> =
zone.borders.iter().map(|i| map.get_i(*i)).collect();
// TODO Use the CH to pick the lowest overall cost?
let pt = req.start.pt(map);
borders.sort_by_key(|i| pt.dist_to(i.polygon.center()));
for i in borders {
if let Some(result) = self.pathfind_to_zone(i, req.clone(), zone, map) {
return Some(result);
// Calculate the entire path using every possible border, then take the one
// with the least total distance.
// TODO This is slow and doesn't account for the mode-specific cost.
let mut paths = Vec::new();
for i in &zone.borders {
if let Some(result) =
self.pathfind_to_zone(map.get_i(*i), req.clone(), zone, map)
{
paths.push(result);
}
}
return None;
return paths.into_iter().min_by_key(|p| p.total_length());
}
}
(None, None) => {}
@ -225,6 +225,7 @@ impl Pathfinder {
},
constraints: req.constraints,
};
let orig_req = req.clone();
req.start = if map.get_l(dst).src_i == i.id {
Position::start(dst)
} else {
@ -245,12 +246,13 @@ impl Pathfinder {
};
interior_path.extend(main_path);
let steps = walking_path_to_steps(interior_path, map);
return Some(Path::new(map, steps, req, Vec::new()));
return Some(Path::new(map, steps, orig_req, Vec::new()));
}
let mut interior_path = zone.pathfind(interior_req, map)?;
let main_path = self.simple_pathfind(&req, map.routing_params(), map)?;
interior_path.append(main_path, map);
interior_path.orig_req = orig_req;
Some(interior_path)
}