我正在使用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)发布于 2020-09-07 12:19:34
我是一个业余程序员,使用Mesa完成我的本科论文工作,我发现了你的问题(这也是我的问题)。
首先,代码的错误:您的代码只从调度程序中删除“失效”的代理,而不是模型本身。你所做的一切就是阻止你的“死代理”更新。您需要使用“grid.remove_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)你的代码应该是这样排序的:首先,让模型步进。这将防止激活顺序中出现错误。然后,对于"kill agents“列表中的每个代理,将其从网格中删除(请注意,"remove_agent”函数是" grid“的子函数,而不是更常用的"MultiGrid",然后将其从调度程序中删除,然后从删除列表中删除。
你的特工现在应该成群结队地死去!
https://stackoverflow.com/questions/62821720
复制相似问题