에이전트 기반 SIR 모델 Python 예제

이 기사에서는 Python에서 에이전트 기반 모델링을 위해 개발한 라이브러리를 사용하여 Python에서 SIR 모델을 구현합니다. 즉, 기존 프레임워크를 사용하여 에이전트 기반 SIR 모델을 구현합니다.

에이전트 기반 SIR 모델 도입

SIR은 감수성 , 감염성 및 회복 성을 나타냅니다 . 아래 그림과 같이 SIR 모델에서 에이전트는 취약에서 감염으로, 감염에서 회복으로, 회복에서 취약으로 상태 전환을 경험할 수 있습니다.

장군님 모델

위 그림에 표시된 상태 전이는 일반적으로 임의의 분포와 특정 확률로 구현됩니다. 또한 모든 상태 전환을 허용할 필요는 없습니다. 예를 들어 이 기사에서는 에이전트가 복구된 상태에서 취약한 상태로 되돌아가는 것을 허용하지 않습니다. 아래는 이 기사에서 구현된 SIR 모델입니다.

이 기사의 에이전트 기반 Sir 모델에 사용된 Sir 모델

같은 방식으로 취약한 상태뿐만 아니라 회복된 상태에서 감염된 상태로의 폴백을 허용하는 SIR 모델을 공식화할 수도 있습니다.

Python의 에이전트 기반 모델링 프레임워크

에이전트 기반 모델링을 위한 프레임워크를 만들었습니다. 프레임워크는 시간이 지남에 따라 확장되고 업그레이드됩니다. 현재 에이전트, 시뮬레이션 환경 및 인구를 그리드 기반 모델에 배치할 수 있는 설정을 지원합니다. 시뮬레이션 결과는 SQLite 데이터베이스에 표준화된 형식으로 기록될 수 있으며 해당 데이터베이스에 저장된 데이터를 기반으로 시각화 및 애니메이션이 생성됩니다. 프레임워크는 사용자 정의 기능을 추가하기 위해 편집할 수 있는 여러 Python 파일(모듈)의 형태로 제공됩니다.

에이전트 기반 Sir 모델을 위한 프레임워크

프레임워크를 확인하고 싶다면 GitHub 에서 팔로우할 수 있습니다 . 여기 링크가 있습니다:

여기서 주목할 점은 프레임워크가 그리드 기반 에이전트 기반 모델링을 지원한다는 것입니다. 에이전트는 2D 그리드에서 상호 작용합니다. 이 2D 그리드는 시뮬레이션 환경을 용이하게 합니다. 모델 설정에 따라 하나 이상의 에이전트가 동일한 셀에 있을 수 있습니다. 에이전트는 지정된 이웃 내에서 다른 에이전트와 상호 작용할 수 있습니다. 이 문서에서 불활성화는 질병 전파를 의미하며 질병 확산을 초래합니다.

이 기사의 에이전트 기반 Sir 모델에 대한 그리드

에이전트에는 내부 역학, 변수 및 상태로 표시되는 속성과 기능이 있습니다. 에이전트의 내부 작동은 다른 에이전트와의 작업, 결정 및 상호 작용에 영향을 줍니다. 이러한 상호 작용은 상호 작용 환경의 영향도 받을 수 있습니다.

이제 Python에서 관련 ABM 모델 구현을 문서화하여 진행할 것입니다.

Python에서 에이전트 기반 SIR 모델 구현

아래 코드에서는 에이전트 기반 모델링 프레임워크를 사용합니다. 300번 반복되는 시뮬레이션 실행을 설정했습니다. 감염되기 쉬운 에이전트가 감염될 확률은 감염된 에이전트와 만날 때마다 7%입니다. 반면에 모든 반복에 대해 감염된 에이전트는 3%의 회복 확률을 갖습니다.

__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")

위의 에이전트 기반 SIR 모델 구현은 SQLite 데이터베이스에 저장된 결과를 생성합니다. 이 데이터베이스는 나중에 시각화에 사용됩니다. 이러한 시각화는 다른 분석가가 다른 시점에 별도의 스크립트로 구현할 수 있습니다. 즉, 모델 실행과 데이터 시각화는 데이터베이스에 의해 분리되는 두 개의 개별 활동입니다.

에이전트 기반 SIR 모델 시뮬레이션 결과

이제 드디어 그리드 기반 에이전트 기반 SIR 모델에서 생성된 결과를 검토할 수 있습니다. 아래는 이 시뮬레이션 실행 전반에 걸친 에이전트 위치의 시각화입니다.

아래 애니메이션은 시간이 지남에 따라 어떤 에이전트가 감염되었는지 보여줍니다. 애니메이션은 또한 에이전트 위치를 보여줍니다. 이 간단한 예에서 에이전트 위치는 정적입니다.

다음으로 시뮬레이션 시간 동안 에이전트 복구 애니메이션입니다.

아래 차트는 주어진 시뮬레이션 시간에 에이전트가 감염되거나 복구될 평균 가능성을 시각화합니다.

에이전트 복구는 모든 에이전트가 감염되지 않도록 합니다. 그러나 이 모델의 에이전트에는 정적 위치가 있습니다. 다른 시뮬레이션 실행에서는 동적 에이전트 위치 또는 일종의 확산/이동을 허용할 수 있습니다. 이것은 시뮬레이션 실행 전체에 걸쳐 감염된 에이전트의 총량을 증가시킬 가능성이 높습니다.

이 글에서 적용된 에이전트 기반 모델링 프레임워크는 추가적인 차트를 제공할 수 있다. 또한 시뮬레이션 결과는 사용자 정의 방식으로 분석할 수 있는 SQLite 데이터베이스에 저장된 상태로 유지됩니다. 그러나 이것은 코딩과 같은 몇 가지 추가 사용자 정의/적응이 필요합니다.

최종 발언 및 관련 내용

에이전트 기반 시뮬레이션 은 미시적 시스템 수준에서 에이전트 역학 및 상호 작용을 설명하여 복잡한 거시적 시스템 동작을 설명하려는 시뮬레이션 방법 입니다. 다소 추상적이며 복잡한 시스템을 이해하는 데 자주 사용되는 방법입니다. 복잡한 시스템은 복잡한 시스템보다 복잡하고 다른 한편으로는 혼돈 시스템보다 덜 복잡합니다. 거시적 수준에서 국내총생산(GDP)의 형태로 볼 수 있는 미국 경제는 복잡한 시스템의 한 예입니다. 에이전트 기반 모델은 예를 들어 미국 경제의 특정 현상 및 추세의 출현을 이해하는 데 사용할 수 있습니다.

이 기사에서 나는 최근에 매우 인기 있는 질병 확산 모델을 구현했습니다. 이것은 실제로 에이전트 기반 모델링이 자주 적용되는 또 다른 흥미로운 영역입니다. 에이전트 기반 모델링을 위한 프레임워크를 사용하여 에이전트 기반 SIR 모델을 구현했습니다. 프레임워크의 시각화 및 애니메이션 기능을 사용하여 시뮬레이션 결과를 검토했습니다. 프레임워크 자체는 다른 유형의 에이전트 기반 시뮬레이션 모델을 구현하는 데 사용할 수 있으며 프레임워크는 시간이 지남에 따라 업그레이드되고 정기적으로 확장됩니다.

다음은 에이전트 기반 시뮬레이션 과 관련된 몇 가지 다른 SCDA입니다 .

You May Also Like

Leave a Reply

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.