Jaotada liikumised väljapääsupunktide vahel nii, et ühtegi sihtpunkti ei eelistata a priori — sarnaselt jõgikonna vee liikumisele. See on gravitatsioonimudeli (gravity model) põhiolemus.
Klassikalises gravitatsioonimudelis on kahe piirkonna vaheline liikumine võrdeline nende "masside" (rahvastiku) korrutisega ja pöördvõrdeline kauguse/kulu astmega:
T_ij ∝ (P_i · P_j) / f(c_ij)
Selles rakenduses on igal teede sõlmel:
unified = nx.Graph()
weight = length * impedance_factor
Iga tee klass on kaalutud impedantsi kordajaga (kõrgem = aeglasem/vähem eelistatud):
| Tee klass | Impedants |
|---|---|
| motorway, trunk | 1.0 |
| primary | 1.1 |
| secondary | 1.3 |
| tertiary | 1.8 |
| residential, unclassified, service | 4.0 |
| track | 5.0 |
GRAVITY_ALPHA = 1000 # meetrit log-rahvastiku ühiku kohta
adjusted_cost = path_impedance - alpha * log(population + 1)
Suurem teenindusala rahvastik vähendab efektiivset kulu (tõmbab trippe juurde):
alpha * ln(1001) ≈ 6.9 km kompensatsioonalpha * ln(101) ≈ 4.6 km kompensatsioonIga sõlme jaoks leitakse Dijkstra'ga kulu igast väljapääsupunktist, kohandatakse gravitatsiooniga, ja parim = argmin(adjusted_cost):
best_exit = argmin(adjusted_cost) # gravitatsiooniga kohandatud
nearest_exit = argmin(impedance) # lihtsalt lähim (võrdluseks)
switched = best_exit != nearest_exit
switched näitab, kus gravitatsioon muudab valikut (sõlm kuulub "loogiliselt" kaugemasse, aga suuremasse keskusesse).
{prefix}_gravity_node_exits.csv — iga sõlm: best_exit, impedance_to_exit, gravity_value, switched{prefix}_gravity_segment_exits.csv — iga lõik: best_exit, impedance_to_exit, assignment_typeMõlemad on võrdlusena: gravitatsioon annab realistlikuma liikluskoormuse, lähim-alus on lihtsam ja läbipaistvam.
Skript: pipeline/gravity_exit_analysis.py
Loeb: {prefix}_pop_catchment.csv (rahvastik väljapääsupunkti kohta)
Kirjutab: {prefix}_gravity_node_exits.csv, {prefix}_gravity_segment_exits.csv