首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除MESA中的代理

删除MESA中的代理
EN

Stack Overflow用户
提问于 2020-07-10 02:48:42
回答 1查看 847关注 0票数 2

我正在使用MESA来模拟新冠肺炎扩散。我想删除已死的代理,但当我在web上运行它时,即使我将死亡率设置为100%,代理也从未减少。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2020-09-07 12:19:34

我是一个业余程序员,使用Mesa完成我的本科论文工作,我发现了你的问题(这也是我的问题)。

首先,代码的错误:您的代码只从调度程序中删除“失效”的代理,而不是模型本身。你所做的一切就是阻止你的“死代理”更新。您需要使用“grid.remove_agent(代理)”命令将其从网格中删除。您不希望将代理从现在拥有它的调度程序("model.schedule.remove(self)")中删除,因为这可能会扰乱将来代理的激活。

要解决此问题,首先必须将代理附加到已在代码中注释掉的"kill_agents“列表中。然后,在模型中的step函数中,在所有代理都已完成的情况下完成,您应该具有以下内容:

代码语言:javascript
复制
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",然后将其从调度程序中删除,然后从删除列表中删除。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62821720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档