我如何遍历人口以获取我最近的代理并动态检查代理的距离?

Posted

技术标签:

【中文标题】我如何遍历人口以获取我最近的代理并动态检查代理的距离?【英文标题】:How I can iterate through a population to get the nearest agent of mine and check agent's distance dynamically? 【发布时间】:2020-09-10 22:46:44 【问题描述】:

我正在尝试进行流行病传播建模,其中所有代理都在连续空间中移动。所有的代理都有一定的“fieldOfVision”区域。如果在“敏感”代理的这个“视野”内,另一个“暴露”的代理出现并停留 5 分钟或更长时间,那么该敏感代理也将成为“暴露”。如果该“暴露”代理出现并停留少于 5 分钟,则“易感”代理将保持“易感”状态。

我的代理的状态图如下:

最初,6 个代理将通过从 main 发送一些消息来“暴露”。由于代理也是行人类型的代理,在零时刻,没有代理接收消息。因此,我必须在模型启动 3 分钟后从 main 发送消息,以便有人收到消息。效果很好。

从“易感”状态的第一个转换动作如下。我将转换超时设置为 3.1 分钟,因为在 3 分钟时将首次出现一些暴露的代理。

如果附近或“fieldOfVision”内没有人,则将执行“noExposedNearby”转换,如下所示。

如果“fieldOfVision”内有人“暴露”,则“foundExposedNearby”转换将如下执行,并再次执行相同的循环,直到暴露的人离开“fieldOfVision”

如果暴露的人从“fieldOfVision”三角形离开,那么“exposedNearbyLeft”过渡 将如下执行并计算最终时间。

exposedNearbyLeft transition]5

然后“可能暴露”状态将计算“暴露”代理靠近该“易感”代理的总暴露时间,并检查它是否超过 5。如果超过 5 则 通过“enoughExposure”转换,否则它将通过“notEnoughExposure”并再次回到易感状态。

问题是,在 7 分钟后的运行期间,我收到此错误。看来,我的代码在一段时间后无法获得 pedX & pedY 的值。我的问题是如何继续该循环并查找最近的暴露代理和状态图的易感代理在彼此的“fieldOfVision”内的持续时间?有什么建议吗?

这是一篇很长的文章,需要通读。如果你已经走到这一步,首先我感谢你的耐心。此外,如果您能分享一些关于如何获取代理的动态距离以检查某人是否新暴露的想法,我将非常感激。非常感谢您的反馈。

【问题讨论】:

【参考方案1】:

正如 Felipe 所说,这是因为 thisPed 在您的代码中为空。

简单检查一下,不要执行这段代码,如下:

if (myPed != null) 
    your code doing stuff with myPed...;

当 myPed 为 null 时,您可以添加一个 else 部分来执行某些操作,但这取决于您的模型(即,如果这实际上永远不会发生,则抛出错误......)

【讨论】:

【参考方案2】:

实际发生的情况是 thisPed 为空,这可能是因为在 checkExposedNearby 转换期间未发现处于暴露状态的代理。

我没有看到所提供信息的其他选项。

【讨论】:

感谢 Felipe 的反馈。在那种情况下,你对我如何解决这个问题有什么建议吗?此外,当我运行模型时,在可视化表示中,它显示仍有一些处于暴露状态的代理在四处移动。所以,我不确定这是否是实际问题。 是的,但是错误发生在稍后...所以有一个 checkexposednearby 转换,那一刻没有人暴露并且 thisPed 为空...很久以后,再次检查 checkexposednearby...可能有暴露的人,但是 thisPed 已经为空,所以你会得到一个错误......然后,也许有暴露的人 也许你应该检查thisPed是否为null,如果是,再次找到最近的agent,如果没有人暴露,你应该做其他事情 很高兴能从 anylogic 中两位最博学的建模师那里获得一些见解。你的回答真的对我帮助很大。我的代码中还有其他一些漏洞。但最后我从你建议的解决方案中弄清楚了。感谢您的宝贵时间。 不用担心。感谢您为您的问题付出努力:)

以上是关于我如何遍历人口以获取我最近的代理并动态检查代理的距离?的主要内容,如果未能解决你的问题,请参考以下文章

如何在主代理的地图上放置嵌套代理

在生成代理时使用实际人口密度

创建代理并为其人口提供不同的 ID/名称,并在不同的时间停止每个 ID 延迟

创建单个驱动程序以使用代理遍历多个站点

代理继承和人口分组

代理模式-3(手写实现JDK动态代理)