El modelo SIR basado en agentes (Python)

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.

señor general modelo

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.

modelo sir utilizado para el modelo sir basado en agentes de 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.

marco para el modelo sir basado en agentes

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.

cuadrícula para el modelo sir basado en agentes de este artículo

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 :

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.