Python 在MESA中删除代理

Python 在MESA中删除代理,python,mesa-abm,Python,Mesa Abm,我正在使用MESA模拟新冠病毒-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.Infe

我正在使用MESA模拟新冠病毒-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)
def条件(自身):
自我感染时间+=1

如果self.Infection\u time self.stage\u one和self.Infection\u time我是一个业余程序员,在我的本科论文工作中使用Mesa,我发现了你的问题(这也恰好是我的问题)

首先,代码中的错误:代码只从调度程序中删除“死”代理,而不是模型本身。你所做的就是阻止你的“死亡代理”更新。您需要使用“grid.remove\u agent(agent)”命令将其从网格中删除。您不希望将代理从当前的计划程序(“model.schedule.remove(self)”)中删除,因为它可能会扰乱未来代理的激活

要解决这个问题,首先必须将代理附加到您在代码中注释掉的“kill_agents”列表中。然后,在模型中的step函数中(该函数在所有代理完成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)
您的代码应该按如下顺序排列:首先,让模型单步执行。这将防止激活顺序中出现错误。然后,对于“kill agents”列表中的每个代理,将它们从网格中删除(注意,“remove_agent”函数是“grid”的子函数,而不是更常用的“MultiGrid”,然后将其从调度程序中删除,然后将其从kill列表本身中删除


您的代理现在应该成群结队地死去!

工作正常!我们始终需要从网格和调度程序中删除代理。