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

Metapopulációs modell „sub-populáció” klasszikus epidemiológiai keretben.

A következő metapopulációs modell minden vármegye egy „sub-populáció” klasszikus epidemiológiai keret. SEIR dinamika S → E → I → R lappangási időt is modellez és hálózati terjedés, mobilitási gráf
inter-county diffúzió  gravitációs modell nagy népesség → erősebb kapcsolat realista közlekedési proxy, látható hogy Budapest gyorsan „seedeli” a fertőzést Pest + környező megyék gyorsan követik
keleti régiók később kapják el hullámszerű terjedés.

-------------
import numpy as np
import matplotlib.pyplot as plt

print("=" * 80)
print("MAGYARORSZÁG VÁRMEGYEI JÁRVÁNYHÁLÓZAT MODELL")
print("Metapopulációs SEIR + mobilitási gráf")
print("=" * 80)

# -----------------------------
# 1. VÁRMEGYÉK (NODOK)
# -----------------------------
counties = [
    "Budapest","Pest","Fejér","Győr-Moson-Sopron","Komárom-Esztergom",
    "Veszprém","Vas","Zala","Somogy","Baranya","Tolna","Bács-Kiskun",
    "Csongrád-Csanád","Jász-Nagykun-Szolnok","Heves","Nógrád",
    "Borsod-Abaúj-Zemplén","Szabolcs-Szatmár-Bereg","Hajdú-Bihar","Békés"
]

n = len(counties)

# population (arányosított becslés)
pop = np.random.randint(200_000, 1_800_000, size=n)
pop[0] = 1_700_000  # Budapest

print(f"Vármegyék száma: {n}")

# -----------------------------
# 2. MOBILITÁSI HÁLÓ (SZOMSZÉDSÁGI MÁTRIX)
# -----------------------------
adj = np.zeros((n, n), dtype=float)

for i in range(n):
    for j in range(i + 1, n):
        weight = (pop[i] * pop[j]) / 1e12
        if np.random.rand() < 0.4:
            adj[i, j] = weight
            adj[j, i] = weight

# -----------------------------
# 3. SEIR ÁLLAPOTOK
# -----------------------------
S = pop.astype(float)
E = np.zeros(n)
I = np.zeros(n)
R = np.zeros(n)

# kezdeti fertőzés
I[0] = 500
S[0] -= 500

# paraméterek
beta = 0.35
sigma = 0.2
gamma = 0.1

T = 200
history_I = []

print("\nSzimuláció indul...")

# -----------------------------
# 4. DINAMIKA
# -----------------------------
for t in range(T):
    new_S = S.copy()
    new_E = E.copy()
    new_I = I.copy()
    new_R = R.copy()

    # lokális SEIR dinamika
    for i in range(n):
        infection_force = beta * I[i] / max(pop[i], 1)

        new_exposed = infection_force * S[i]
        new_infected = sigma * E[i]
        new_recovered = gamma * I[i]

        new_S[i] -= new_exposed
        new_E[i] += new_exposed - new_infected
        new_I[i] += new_infected - new_recovered
        new_R[i] += new_recovered

    # mobilitási terjedés a hálózaton
    for i in range(n):
        for j in range(i + 1, n):
            flow = adj[i, j]
            if flow > 0:
                move_I = flow * (I[i] - I[j]) * 0.01
                new_I[i] -= move_I
                new_I[j] += move_I

    S, E, I, R = new_S, new_E, new_I, new_R
    history_I.append(I.copy())

    if t % 20 == 0:
        print(f"t={t:3d} | összes fertőzött: {np.sum(I):.0f}")

print("\nSzimuláció befejezve.")

# -----------------------------
# 5. EREDMÉNY
# -----------------------------
history_I = np.array(history_I)

plt.figure(figsize=(12, 6))

for i in range(n):
    if i in [0, 1, 16, 17]:
        plt.plot(history_I[:, i], label=counties[i])

plt.title("Vármegyei járványdinamika (SEIR hálózatmodell)")
plt.xlabel("Idő")
plt.ylabel("Fertőzöttek")
plt.legend()
plt.grid()
plt.show()

# -----------------------------
# 6. TOP VÁRMEGYÉK
# -----------------------------
final_I = I
top = np.argsort(final_I)[-5:][::-1]

print("\nLEGJOBBAN ÉRINTETT VÁRMEGYÉK:")
for idx in top:
    print(f"{counties[idx]} -> {final_I[idx]:.0f} fertőzött")
------------------
================================================================================
MAGYARORSZÁG VÁRMEGYEI JÁRVÁNYHÁLÓZAT MODELL
Metapopulációs SEIR + mobilitási gráf
================================================================================
Vármegyék száma: 20

Szimuláció indul...
t=  0 | összes fertőzött: 450
t= 20 | összes fertőzött: 3155
t= 40 | összes fertőzött: 29906
t= 60 | összes fertőzött: 276816
t= 80 | összes fertőzött: 2098533
t=100 | összes fertőzött: 5707031
t=120 | összes fertőzött: 2956976
t=140 | összes fertőzött: 701823
t=160 | összes fertőzött: 137355
t=180 | összes fertőzött: 25783

Szimuláció befejezve.

LEGJOBBAN ÉRINTETT VÁRMEGYÉK:
Pest -> 305 fertőzött
Budapest -> 300 fertőzött
Hajdú-Bihar -> 298 fertőzött
Borsod-Abaúj-Zemplén -> 298 fertőzött
Bács-Kiskun -> 296 fertőzött
------------


Nincsenek megjegyzések:

Megjegyzés küldése