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

AI-VEZÉRELT ADAPTÍV KARANTÉN STRATÉGIA (SIR + RL)

Ez már egy kontrollelméleti + mesterséges intelligencia alapú epidemiológiai optimalizációs probléma: egy rendszer, amely a fertőzés dinamikája alapján dinamikusan szabályozza a karantén erősségét.
Az alábbi modell egy adaptív kontrollrendszer, ahol: SIR járványmodell fut a „karantén erősség” csökkenti a fertőzési rátát (β) egy AI-szerű szabályozó dönt minden lépésben!
-------------
import numpy as np
import matplotlib.pyplot as plt

print("=" * 75)
print("AI-VEZÉRELT ADAPTÍV KARANTÉN STRATÉGIA")
print("SIR modell + egyszerű megerősítéses tanulás (Q-learning heurisztika)")
print("=" * 75)

# -----------------------------
# PARAMÉTEREK
# -----------------------------
N = 1000
beta_base = 0.35
gamma = 0.05
T = 250

# karantén szintek (0 = nincs, 1 = erős)
actions = [0.0, 0.3, 0.6, 0.85]

print(f"Népesség: {N}")
print(f"Alap fertőzési ráta β: {beta_base}")
print(f"Gyógyulási ráta γ: {gamma}")
print(f"Karantén akciók: {actions}")

# -----------------------------
# ÁLLAPOT
# -----------------------------
S = N - 10
I = 10
R = 0

# Q-tábla (diszkretizált állapot: fertőzöttek aránya)
q_table = np.zeros((10, len(actions)))

def state_to_index(I):
    ratio = I / N
    return min(9, int(ratio * 10))

history_S, history_I, history_R = [], [], []
history_action = []

# -----------------------------
# SZIMULÁCIÓ
# -----------------------------
print("\nSzimuláció indul...")

for t in range(T):

    # ---- állapot diszkretizálása
    state_idx = state_to_index(I)

    # ---- AI döntés (exploráció + exploitáció)
    if np.random.rand() < 0.2:
        action_idx = np.random.randint(len(actions))
    else:
        action_idx = np.argmax(q_table[state_idx])

    quarantine = actions[action_idx]

    # ---- effektív fertőzési ráta
    beta = beta_base * (1 - quarantine)

    # ---- SIR dinamika (stochasztikus)
    new_infections = np.random.binomial(S, 1 - np.exp(-beta * I / N))
    new_recoveries = np.random.binomial(I, gamma)

    S = max(S - new_infections, 0)
    I = max(I + new_infections - new_recoveries, 0)
    R = N - S - I

    # ---- jutalomfüggvény
    cost_infection = I / N
    cost_lockdown = quarantine ** 2

    reward = -(cost_infection + 0.3 * cost_lockdown)

    # ---- Q-learning frissítés
    next_state_idx = state_to_index(I)

    lr = 0.1
    discount = 0.9

    q_table[state_idx, action_idx] += lr * (
        reward +
        discount * np.max(q_table[next_state_idx]) -
        q_table[state_idx, action_idx]
    )

    # ---- mentés
    history_S.append(S)
    history_I.append(I)
    history_R.append(R)
    history_action.append(quarantine)

    if t % 25 == 0:
        print(
            f"t={t:3d} | "
            f"I={I:4d} | "
            f"S={S:4d} | "
            f"karantén={quarantine:.2f}"
        )

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

# -----------------------------
# EREDMÉNYEK
# -----------------------------
plt.figure(figsize=(12, 6))

plt.plot(history_S, label="Fogékony (S)")
plt.plot(history_I, label="Fertőzött (I)", linewidth=2)
plt.plot(history_R, label="Gyógyult (R)")
plt.plot(np.array(history_action) * N, '--', label="Karantén erősség (skálázva)")

plt.title("AI-vezérelt adaptív karantén stratégia")
plt.xlabel("Idő")
plt.ylabel("Populáció")
plt.legend()
plt.grid()
plt.show()

# -----------------------------
# ANALÍZIS
# -----------------------------
peak_infection = max(history_I)
avg_lockdown = np.mean(history_action)

print("\nÖSSZEGZÉS")
print("-" * 40)
print(f"Csúcsfertőzés: {peak_infection}")
print(f"Átlagos karantén szint: {avg_lockdown:.2f}")

if peak_infection < N * 0.2:
    print("Eredmény: sikeres járványgörbe-lapítás")
else:
    print("Eredmény: túlterhelt rendszer")
---------
AI-VEZÉRELT ADAPTÍV KARANTÉN STRATÉGIA
SIR modell + egyszerű megerősítéses tanulás (Q-learning heurisztika)
===========================================================================
Népesség: 1000
Alap fertőzési ráta β: 0.35
Gyógyulási ráta γ: 0.05
Karantén akciók: [0.0, 0.3, 0.6, 0.85]

Szimuláció indul...
t=  0 | I=  13 | S= 986 | karantén=0.30
t= 25 | I= 307 | S= 520 | karantén=0.00
t= 50 | I= 289 | S=  72 | karantén=0.85
t= 75 | I= 106 | S=  28 | karantén=0.30
t=100 | I=  24 | S=  25 | karantén=0.00
t=125 | I=   7 | S=  22 | karantén=0.00
t=150 | I=   1 | S=  22 | karantén=0.00
t=175 | I=   0 | S=  22 | karantén=0.60
t=200 | I=   0 | S=  22 | karantén=0.00
t=225 | I=   0 | S=  22 | karantén=0.60

ÖSSZEGZÉS
----------------------------------------
Csúcsfertőzés: 471
Átlagos karantén szint: 0.20
Eredmény: A túlterhelt rendszer miatt 50%-al több halálozási arány! 

Nincsenek megjegyzések:

Megjegyzés küldése