En este artículo, implemento un modelo SIR en Python, utilizando una biblioteca que desarrollé para el modelado basado en agentes en Python. En otras palabras, uso un marco existente para implementar un modelo SIR basado en agentes.
Presentación del modelo SIR basado en agentes
SIR significa susceptible , infectado y recuperado . Como se ilustra en la siguiente figura, en un modelo SIR, los agentes pueden experimentar las siguientes transiciones de estado: de susceptible a infectado, de infectado a recuperado y de recuperado a susceptible.
Las transiciones de estado ilustradas en la figura anterior generalmente se implementan con una distribución aleatoria y alguna probabilidad específica. Además, no tiene que permitir todas las transiciones de estado. En este artículo yo, por ejemplo, no permitiré que los agentes retrocedan de su estado recuperado a un estado susceptible. A continuación se muestra el modelo SIR implementado en este artículo.
De la misma manera, también podría formular un modelo SIR en el que permita volver del estado recuperado al estado infectado, no solo al estado susceptible.
Marco de modelado basado en agentes en Python
Creé un marco para el modelado basado en agentes. El marco está destinado a ampliarse y actualizarse con el tiempo. Actualmente admite una configuración que permite que los agentes, el entorno de simulación y las poblaciones se coloquen en un modelo basado en cuadrículas. Los resultados de la simulación se pueden escribir en una base de datos SQLite en formato estandarizado, y las visualizaciones y animaciones se generan en función de los datos almacenados en esa base de datos. El marco viene en forma de varios archivos de Python (módulos) que se pueden editar para agregar funcionalidad personalizada.
Si desea consultar el marco, puede seguirlo en GitHub . Aqui esta el link:
Lo especial a tener en cuenta aquí es que el marco admite el modelado basado en agentes basado en cuadrículas. Los agentes interactúan en una cuadrícula 2D. Esta cuadrícula 2D facilita el entorno de simulación. Uno o varios agentes pueden estar ubicados en la misma celda, dependiendo de la configuración del modelo. Los agentes pueden interactuar con otros agentes dentro de un vecindario específico. En este artículo, las ineracciones se refieren a la transferencia de enfermedades, lo que resulta en la propagación de enfermedades.
Los agentes tienen atributos y funcionalidad, representados por dinámicas internas, variables y estados. El funcionamiento interno de un agente afecta sus acciones, decisiones e interacciones con otros agentes. Esas interacciones también pueden verse influenciadas por el entorno de interacción.
Ahora continuaré documentando la implementación del modelo ABM relevante en Python.
Implementación del modelo SIR basado en agentes en Python
En el siguiente código, hago uso del marco de modelado basado en agentes. Configuré una ejecución de simulación que dura 300 iteraciones. La probabilidad de que los agentes susceptibles se infecten es del 7% por cada encuentro con un agente infectado. Por cada iteración, un agente infectado, por otro lado, tiene un 3% de probabilidad de recuperarse.
__author__ = "Linnart Felkl"
__email__ = "LinnartSF@gmail.com"
if __name__ == "__main__":
print("demo starts")
import sys
from pathlib import Path
file = Path(__file__).resolve()
parent, root = file.parent, file.parents[1]
sys.path.append(str(root))
# remove the current file's directory from sys.path, unless already removed
try:
sys.path.remove(str(parent))
except ValueError:
pass
import data
import stats
import config
import framework
import random
import animation
# setup database manager and connection
db = data.Database("sqlite3", config.path_databasefile)
db_manager = data.Manager(db)
# create an empty environment
env = framework.Environment(1, True, 20, 20, db_manager) # Environment constructor implicitly resets environment table in database
# create initial population of healthy humans
pops = framework.Populations(amount = 1, env = env, db_manager = db_manager, attributes = ["infected","recovered"], datatypes = ["INTEGER","INTEGER"])
pops.add_population(name = "humans",
size = 200,
attributes = ["infected","recovered"],
datatypes = ["INTEGER","INTEGER"],
initialvals = [0, 0]
)
# randomly infect 5%
pop = pops.Populations["humans"]
sampleagents = pop.get_agents(int(0.05*pop.Size))
for agent in sampleagents: agent.Attributes["infected"] = 1
_prob_infection = 0.07
_prob_recovery = 0.03
# setup simulation
sim = framework.Simulation(300)
# make sure that environment and agents tables in database are setup at this time
pops.write_env_to_db(sim.Iteration)
pops.write_agents_to_db(sim.Iteration)
# execute simulation run, store every 10th run into the database
while sim.run():
# look at every agent
for agent in pop.get_agents():
if agent.get_attr_value("infected") == 1:
neighbours = env.get_neighbourhood(agent)
for neighbour in neighbours:
if neighbour.get_attr_value("infected") == 0 and neighbour.get_attr_value("recovered") == 0:
# this neighbour is not resistant and not infected; infect with specified probability
if random.uniform(0, 1) < _prob_infection: neighbour.set_attr_value("infected", 1)
# the infected agent recovers with a specified probability
if random.uniform(0, 1) < _prob_recovery:
agent.set_attr_value("recovered", 1)
agent.set_attr_value("infected", 0)
# update results in database, for agents and for environment
pops.write_agents_to_db(sim.Iteration)
pops.write_env_to_db(sim.Iteration)
pops.write_density_to_db(sim.Iteration)
# get dataframes with simulation results
humans_df = db_manager.get_populationdf(pop = "humans")
env_df = db_manager.get_environmentdf()
density_df = db_manager.get_densitydf()
# visualize simulation data
stats.set_fontsizes(8,10,12)
stats.plot_agentattr_lines("infected", humans_df)
stats.save_plot("infection_curves")
stats.plot_agentattr_lines("recovered", humans_df)
stats.save_plot("recovery_curves")
stats.plot_grid_occupation(env_df, ["humans"])
stats.save_plot("human_locations")
stats.plot_density_markersize(density_df, "infected", 50, "red")
stats.save_plot("infection_density")
stats.plot_density_markersize(density_df, "recovered", 50, "green")
stats.save_plot("recovery_density")
stats.plot_avgattr_lines(["infected","recovered"], humans_df)
stats.save_plot("avginfectedavgrecovered")
# create and save animations
animation.animate_density(
df = density_df,
filename = "infectionanimation",
attr = "infected",
defaultsize = 50,
color = "red",
tpf = 0.05
)
animation.animate_density(
df = density_df,
filename = "recoveryanimation",
attr = "recovered",
defaultsize = 50,
color = "green",
tpf = 0.05
)
# end program
db.close()
print("demo ends")
La implementación del modelo SIR basado en agente anterior genera resultados que se almacenan en una base de datos SQLite. Esta base de datos se usa luego para visualizaciones. Estas visualizaciones pueden implementarse en un script separado, por otro analista y en un momento diferente. Es decir, la ejecución del modelo y la visualización de datos son dos actividades separadas que la base de datos desacopla.
Resultados de la simulación del modelo SIR basado en agentes
Ahora puedo finalmente revisar los resultados generados por el modelo SIR basado en agentes basado en cuadrículas. A continuación se muestra una visualización de las ubicaciones de los agentes a lo largo de esta ejecución de simulación.
La siguiente animación muestra qué agentes se infectaron a lo largo del tiempo. Además, la animación muestra las ubicaciones de los agentes. En este ejemplo simple, las ubicaciones de los agentes son estáticas.
A continuación, una animación de la recuperación del agente a lo largo del tiempo de simulación.
El siguiente gráfico visualiza la probabilidad media de que un agente se infecte o se recupere, en el tiempo de simulación dado.
La recuperación de agentes garantiza que no todos los agentes estén infectados. Sin embargo, los agentes en este modelo tienen ubicaciones estáticas. En otra ejecución de simulación, podríamos permitir ubicaciones dinámicas de agentes, o incluso algún tipo de difusión/migración. Lo más probable es que esto aumente la cantidad total de agentes infectados durante la ejecución de la simulación.
El marco de modelado basado en agentes que se aplica en este artículo puede generar gráficos adicionales. Además, los resultados de la simulación quedan almacenados en una base de datos SQLite que se puede analizar de forma personalizada. Sin embargo, esto requeriría alguna personalización/adaptación adicional, es decir, codificación.
Observaciones finales y contenido relacionado
La simulación basada en agentes es un método de simulación que busca explicar el comportamiento de un sistema macroscópico complejo mediante la descripción de la dinámica y las interacciones de los agentes a nivel del sistema microscópico. Es un método bastante abstracto y se usa a menudo para comprender sistemas complejos. Los sistemas complejos son, bueno, más complejos que los sistemas complicados y, por otro lado, menos complejos que los sistemas caóticos. La economía estadounidense, visible a nivel macroscópico en forma de, por ejemplo, producto interno bruto, es un ejemplo de un sistema complejo. Los modelos basados en agentes pueden, por ejemplo, usarse para comprender la aparición de ciertos fenómenos y tendencias en la economía estadounidense.
En este artículo implementé un modelo recientemente muy popular para la propagación de enfermedades. De hecho, esta es otra área interesante en la que se aplica con frecuencia el modelado basado en agentes. Usando un marco para el modelado basado en agentes, implementé un modelo SIR basado en agentes. Las capacidades de visualización y animación del marco se utilizaron para revisar los resultados de la simulación. El marco en sí se puede utilizar para implementar otros tipos de modelos de simulación basados en agentes , y el marco se actualizará y ampliará periódicamente con el tiempo.
Aquí hay algunos otros SCDA relacionados con la simulación basada en agentes :
- Enlace : Métodos de simulación para analistas de SCM
- Enlace : Una ejecución de simulación simple basada en agentes visualizada usando Matplotlib
- Enlace : Modelado basado en agentes en Python
- Enlace : Desarrollo de un modelo de simulación simple basado en agentes en Python
- Enlace : visualización de matrices y cuadrículas 2D usando Matplotlib en Python
Ingeniero industrial especializado en optimización y simulación (R, Python, SQL, VBA)
Leave a Reply