Internal Record

[EXAMPLE] AED Placement Optimization

Classical · GPU Simulated Annealing · 120 variables · 2026-08-15

Illustrative fixture covering every optional field and figure type in schema v1.

5-minute reachability

61.2%→87.4%+26.2pp
Average response time
6.8 min→4.1 min-2.7 min

Problem

Illustrative problem used only to exercise every field the schema supports. Not a real deployment.

Objective: Maximize simulated population coverage within a 5-minute response radius.

120 candidate sites, 8400 synthetic demand points.

  • Budget caps total site count at 120.
  • At least one site per district.

Approach

GPU Simulated Annealing

Classical

Chosen for fast iteration during the design phase; revisits candidate placements in seconds rather than the ~1 hour a commercial MILP solver needed at this scale.

iterations50000
replicas128
AlternativeWhy not
Gurobi3600s to converge to the reported gap; too slow for interactive exploration.

Figures

Convergence

-120.5-552.2-983.9-1415.5-1847.2050100150200IterationEnergy
Best

Coverage

Synthetic Data
Demand
Selected

Parameter sweep

1510100150200
Best Energy: -1847.2 to -1780.5

Solver comparison

0.812Greedy0.873GPU SA

Site detail

SiteCoverage
A-1423
B-0218

Configuration comparison

Current

Sites

Optimized

Sites

Map overview

Illustrative map of candidate and selected sites over a synthetic service area.

Source data: map-points.csv

Implementation notes

Penalty weights were tuned by grid search; see `parameters` for the final values.

Reliability

Runs
30
Median
86.65
Range
84.2 – 88
Success rate
93%

Optimality

Bound
-1863.44
Achieved
-1847.23
Gap
0.87%

Within 1% of the theoretical bound; further compute has limited marginal benefit.

Value

  • Illustrative avoided cost3,360,000 TWD

    illustrative

    Illustrative figure for schema testing only, not a real cost model.

Internal estimate for schema-testing purposes; not independently verified.

Internal Notes

What worked: GPU batching across replicas gave a large wall-clock speedup over sequential runs.

What didn't: Early penalty weights were too aggressive and collapsed the search early.

Next time: Start the parameter sweep earlier in the process.

Reproduce

Commit
a3f9c21
Repository
https://github.com/example/example-repo
Command
python experiment/aed.py --config configs/example.yaml