2026. június 29., hétfő

Nagel–Schreckenberg-modell alkalmazása

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