emergency: prioritize longer emergency routes
This commit is contained in:
1 parent
6508abdd77
commit
3a516fbce5
1 file changed
+19
-11
Vendored
+19
-11
@@ -3726,20 +3726,20 @@ function selectEmergencyRoutes() {
|
|||||||
emergencyStartCities = emergencyCollectCities();
|
emergencyStartCities = emergencyCollectCities();
|
||||||
var nets = emergencyNetworks();
|
var nets = emergencyNetworks();
|
||||||
var pool = [], seenChain = {}, poolMode = 'none';
|
var pool = [], seenChain = {}, poolMode = 'none';
|
||||||
var wantCandidates = Math.max(EMERGENCY_COUNT * 8, 800);
|
var targetPool = Math.max(EMERGENCY_COUNT * 3, 300);
|
||||||
var passes = [
|
var passes = [
|
||||||
{ minKm: EMERGENCY_MIN_KM, maxKm: EMERGENCY_MAX_KM, near: 1.2, mode: 'strict' },
|
{ minKm: EMERGENCY_MIN_KM, maxKm: EMERGENCY_MAX_KM, near: 1.2, mode: 'strict' },
|
||||||
{ minKm: EMERGENCY_MIN_KM * 0.55, maxKm: EMERGENCY_MAX_KM * 1.45, near: 1.8, mode: 'relaxed' },
|
{ minKm: EMERGENCY_MIN_KM * 0.65, maxKm: EMERGENCY_MAX_KM * 1.35, near: 1.8, mode: 'relaxed' },
|
||||||
{ minKm: 10, maxKm: 160, near: 3.0, mode: 'fallback' },
|
{ minKm: 15, maxKm: 160, near: 3.0, mode: 'fallback' },
|
||||||
{ minKm: 3, maxKm: 220, near: 6.0, mode: 'wide' },
|
{ minKm: 8, maxKm: 220, near: 6.0, mode: 'wide' },
|
||||||
{ minKm: 0.5, maxKm: 400, near: 12.0, mode: 'last-resort' }
|
{ minKm: 3, maxKm: 400, near: 12.0, mode: 'last-resort' }
|
||||||
];
|
];
|
||||||
for (var p = 0; p < passes.length && pool.length < wantCandidates; p++) {
|
for (var p = 0; p < passes.length && pool.length < targetPool; p++) {
|
||||||
var cell = Math.max(0.5, passes[p].near);
|
var cell = Math.max(0.5, passes[p].near);
|
||||||
var grid = emergencyBuildCityGrid(emergencyStartCities, cell);
|
var grid = emergencyBuildCityGrid(emergencyStartCities, cell);
|
||||||
for (var ni = 0; ni < nets.length && pool.length < wantCandidates; ni++) {
|
for (var ni = 0; ni < nets.length && pool.length < targetPool; ni++) {
|
||||||
var part = emergencyCollectMapCandidates(nets[ni].net, nets[ni].key, emergencyStartCities, grid, cell,
|
var part = emergencyCollectMapCandidates(nets[ni].net, nets[ni].key, emergencyStartCities, grid, cell,
|
||||||
passes[p].minKm, passes[p].maxKm, passes[p].near, wantCandidates, 180000);
|
passes[p].minKm, passes[p].maxKm, passes[p].near, targetPool, 220000);
|
||||||
for (var pi = 0; pi < part.length; pi++) {
|
for (var pi = 0; pi < part.length; pi++) {
|
||||||
var key = part[pi].netKey + ':' + part[pi].ci;
|
var key = part[pi].netKey + ':' + part[pi].ci;
|
||||||
if (!seenChain[key]) {
|
if (!seenChain[key]) {
|
||||||
@@ -3750,8 +3750,15 @@ function selectEmergencyRoutes() {
|
|||||||
if (part.length) poolMode = passes[p].mode + ':' + nets[ni].key;
|
if (part.length) poolMode = passes[p].mode + ':' + nets[ni].key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pool.sort(function (a, b) { return a.score - b.score; });
|
var goodKm = EMERGENCY_MIN_KM * 0.65;
|
||||||
var top = pool.slice(0, Math.max(EMERGENCY_COUNT * 12, 240));
|
var good = pool.filter(function (c) { return c.lenKm >= goodKm; });
|
||||||
|
var usePool = good;
|
||||||
|
if (usePool.length < EMERGENCY_COUNT) {
|
||||||
|
usePool = usePool.concat(pool.filter(function (c) { return c.lenKm >= EMERGENCY_MIN_KM * 0.35; }));
|
||||||
|
}
|
||||||
|
if (usePool.length < EMERGENCY_COUNT) usePool = pool;
|
||||||
|
usePool.sort(function (a, b) { return a.score - b.score; });
|
||||||
|
var top = usePool.slice(0, Math.max(EMERGENCY_COUNT * 6, 120));
|
||||||
emergencyShuffle(top);
|
emergencyShuffle(top);
|
||||||
var used = {}, cityUse = {}, routeFailures = [];
|
var used = {}, cityUse = {}, routeFailures = [];
|
||||||
for (var r = 0; r < top.length && emergencyRoutes.length < EMERGENCY_COUNT; r++) {
|
for (var r = 0; r < top.length && emergencyRoutes.length < EMERGENCY_COUNT; r++) {
|
||||||
@@ -3759,7 +3766,7 @@ function selectEmergencyRoutes() {
|
|||||||
var usedKey = cand.netKey + ':' + cand.ci;
|
var usedKey = cand.netKey + ':' + cand.ci;
|
||||||
if (used[usedKey]) continue;
|
if (used[usedKey]) continue;
|
||||||
var cityKey = cand.city ? (Math.round(cand.city.x * 4) + '_' + Math.round(cand.city.z * 4)) : 'none';
|
var cityKey = cand.city ? (Math.round(cand.city.x * 4) + '_' + Math.round(cand.city.z * 4)) : 'none';
|
||||||
if ((cityUse[cityKey] || 0) >= 3) continue;
|
if ((cityUse[cityKey] || 0) >= 2) continue;
|
||||||
used[usedKey] = true;
|
used[usedKey] = true;
|
||||||
cityUse[cityKey] = (cityUse[cityKey] || 0) + 1;
|
cityUse[cityKey] = (cityUse[cityKey] || 0) + 1;
|
||||||
var route = emergencyChainAtOffset(cand.net, cand.offset, cand.n);
|
var route = emergencyChainAtOffset(cand.net, cand.offset, cand.n);
|
||||||
@@ -3820,6 +3827,7 @@ function selectEmergencyRoutes() {
|
|||||||
startCities: emergencyStartCities.length,
|
startCities: emergencyStartCities.length,
|
||||||
poolMode: poolMode,
|
poolMode: poolMode,
|
||||||
candidates: pool.length,
|
candidates: pool.length,
|
||||||
|
goodCandidates: good.length,
|
||||||
candidateSample: top.slice(0, 5).map(function (c) {
|
candidateSample: top.slice(0, 5).map(function (c) {
|
||||||
return {
|
return {
|
||||||
netKey: c.netKey, ci: c.ci, lenKm: +c.lenKm.toFixed(1),
|
netKey: c.netKey, ci: c.ci, lenKm: +c.lenKm.toFixed(1),
|
||||||
|
|||||||
Reference in new issue
Block a user