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