2

我正在使用 MESA 来模拟 COVID-19 的传播。我想删除死掉的代理,但是当我在网络上运行它时,即使我将死亡率设置为 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”列表中。然后,在您的模型中的 step 函数中,在您的所有代理都已步进后完成,您应该具有以下内容:

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”,然后将其从网格中删除)调度程序,然后将其从终止列表本身中删除。

你的特工现在应该成群结队地死去!

于 2020-09-07T04:19:34.033 回答