2

COVID-19 の拡散をシミュレートするために MESA を使用しています。死亡したエージェントを削除したいのですが、Web上で実行すると、死亡率を100%にしてもエージェントが減りません。

def condition(self):
    self.Infection_time +=1
    if self.Infection_time <= self.stage_one:
        self.stage = 1
    elif self.Infection_time > self.stage_one and self.Infection_time <= self.stage_one+self.stage_two:
        self.stage = 2
    else:
        self.stage = 3
        result = 0#rand_pick([0 , 1],[0.1 , 0.9])
        if result == 0:
            model.schedule.remove(self)
            #self.model.kill_agents.append(self)
4

1 に答える 1

3

私は卒業論文で Mesa を使用しているアマチュア プログラマーであり、あなたの問題を理解しました (たまたま私の問題でもありました)。

まず、コードのエラー: コードでは、モデル自体ではなく、スケジューラから「死んだ」エージェントのみが削除されます。あなたがしたことは、「死んだエージェント」が更新されないようにすることだけです。「grid.remove_agent(agent)」コマンドを使用してグリッドから削除する必要があります。将来のエージェントのアクティベーションを台無しにする可能性があるため、現在あるスケジューラ ("model.schedule.remove(self)") からエージェントを削除したくありません。

これを修正するには、まず、コードでコメントアウトした「kill_agents」リストにエージェントを追加する必要があります。次に、すべてのエージェントがステップした後に完了するモデルのステップ関数で、次のようにする必要があります。

def step(self):
    self.schedule.step()
    for x in self.kill_agents:
        self.grid.remove_agent(x)
        self.schedule.remove(x)
        self.kill_agents.remove(x)

コードは次のように並べる必要があります。まず、モデルをステップさせます。これにより、アクティベーション オーダーのエラーを防ぐことができます。次に、「エージェントを殺す」リスト内のすべてのエージェントについて、それらをグリッドから削除します (「remove_agent」関数は、より一般的に使用される「MultiGrid」ではなく、「grid」のサブ関数であることに注意してください。スケジューラーである場合、それを kill リスト自体から削除します。

あなたのエージェントは今すぐ群れで死ぬべきです!

于 2020-09-07T04:19:34.033 に答える