在MESA中删除代理

2024-05-16 09:37:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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)

Tags: self网络代理modeliftimedefresult
1条回答
网友
1楼 · 发布于 2024-05-16 09:37:50

我是一个业余程序员,在我的本科论文工作中使用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列表本身中删除

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

相关问题 更多 >