Az alábbi program a közlekedéskutatásban széles körben használt Nagel–Schreckenberg-modellt valósítja meg. Ez egy celluláris automata alapú forgalmi modell, amely képes reprodukálni a spontán dugók kialakulását és a valós forgalom számos tulajdonságát. Ez a modell: a statisztikus fizikából származik; használatos a forgalomelméletben és a városi közlekedéskutatásban; képes spontán forgalmi dugók kialakulását modellezni; alkalmas intelligens közlekedési rendszerek vizsgálatára.
--------------
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
print("=" * 70)
print(" KÖZÚTI FORGALOMSZIMULÁTOR")
print("Nagel–Schreckenberg modell")
print("=" * 70)
# -----------------------------
# PARAMÉTEREK
# -----------------------------
UT_HOSSZ = 300 # útszakasz hossza (cellák)
AUTOK_SZAMA = 80 # járművek száma
MAX_SEBESSEG = 5 # maximális sebesség (cella/lépés)
LASSULASI_VALOSZ = 0.3 # véletlen lassulás valószínűsége
IDOLEPESEK = 500 # szimuláció hossza
print(f"Úthossz: {UT_HOSSZ} cella")
print(f"Járművek száma: {AUTOK_SZAMA}")
print(f"Maximális sebesség: {MAX_SEBESSEG}")
print(f"Véletlen lassulás p = {LASSULASI_VALOSZ}")
print()
# ---------------------------------
# JÁRMŰVEK INICIALIZÁLÁSA
# ---------------------------------
poziciok = np.sort(
np.random.choice(UT_HOSSZ, AUTOK_SZAMA, replace=False)
)
sebessegek = np.random.randint(
0,
MAX_SEBESSEG + 1,
AUTOK_SZAMA
)
# tér-idő diagram tárolása
history = []
# ---------------------------------
# FŐ SZIMULÁCIÓ
# ---------------------------------
for t in range(IDOLEPESEK):
uj_poziciok = np.zeros_like(poziciok)
uj_sebessegek = np.copy(sebessegek)
for i in range(AUTOK_SZAMA):
# 1. gyorsítás
if uj_sebessegek[i] < MAX_SEBESSEG:
uj_sebessegek[i] += 1
# 2. távolság a következő autóig
kov = (i + 1) % AUTOK_SZAMA
tav = (poziciok[kov] - poziciok[i]) % UT_HOSSZ
# 3. ütközés elkerülése
if uj_sebessegek[i] >= tav:
uj_sebessegek[i] = tav - 1
# 4. véletlen lassulás
if (uj_sebessegek[i] > 0 and
np.random.rand() < LASSULASI_VALOSZ):
uj_sebessegek[i] -= 1
# 5. mozgás
uj_poziciok[i] = (
poziciok[i] + uj_sebessegek[i]
) % UT_HOSSZ
# rendezés körpályán
sorrend = np.argsort(uj_poziciok)
poziciok = uj_poziciok[sorrend]
sebessegek = uj_sebessegek[sorrend]
# tér-idő diagram
allapot = np.zeros(UT_HOSSZ)
allapot[poziciok] = 1
history.append(allapot)
if t % 50 == 0:
atlag = np.mean(sebessegek)
print(
f"Idő: {t:3d} "
f"| Átlagsebesség: {atlag:.2f}"
)
print("\nSzimuláció befejezve.")
print("Diagram készítése...")
# ---------------------------------
# TÉR-IDŐ DIAGRAM
# ---------------------------------
history = np.array(history)
plt.figure(figsize=(12, 8))
plt.imshow(
history,
cmap='binary',
aspect='auto',
interpolation='nearest'
)
plt.xlabel("Útszakasz")
plt.ylabel("Időlépés")
plt.title(
"Közúti forgalom tér-idő diagramja\n"
"(Nagel–Schreckenberg modell)"
)
plt.colorbar(label="Jármű jelenléte")
plt.tight_layout()
plt.show()
# ---------------------------------
# STATISZTIKÁK
# ---------------------------------
print("\nÖSSZEGZÉS")
print("-" * 40)
print(f"Átlagos sebesség: {np.mean(sebessegek):.2f}")
print(f"Sebesség szórása: {np.std(sebessegek):.2f}")
print(f"Forgalomsűrűség: {AUTOK_SZAMA/UT_HOSSZ:.3f}")
if np.mean(sebessegek) < MAX_SEBESSEG / 2:
print("Állapot: Torlódásra hajlamos rendszer")
else:
print("Állapot: Szabad áramlás")
------------------
======================================================================
KÖZÚTI FORGALOMSZIMULÁTOR
Nagel–Schreckenberg modell
======================================================================
Úthossz: 300 cella
Járművek száma: 80
Maximális sebesség: 5
Véletlen lassulás p = 0.3
Idő: 0 | Átlagsebesség: 1.35
Idő: 50 | Átlagsebesség: 1.59
Idő: 100 | Átlagsebesség: 1.65
Idő: 150 | Átlagsebesség: 1.39
Idő: 200 | Átlagsebesség: 1.64
Idő: 250 | Átlagsebesség: 1.36
Idő: 300 | Átlagsebesség: 1.52
Idő: 350 | Átlagsebesség: 1.56
Idő: 400 | Átlagsebesség: 1.66
Idő: 450 | Átlagsebesség: 1.76
Szimuláció befejezve.
ÖSSZEGZÉS
----------------------------------------
Átlagos sebesség: 1.56
Sebesség szórása: 1.58
Forgalomsűrűség: 0.267
Állapot: Torlódásra hajlamos rendszer
Nincsenek megjegyzések:
Megjegyzés küldése