基于AnyLogic代理的建模:ClassCastException

时间:2017-11-13 15:40:06

标签: java simulation anylogic agent-based-modeling agents

我正在使用AnyLogic中基于代理的传染病流行模拟。我的模型中有两种代理类型 - 人和建筑。我正在尝试编写一个函数来计算代理人键入的传染性联系人的数量' Person'在任何给定的时间点都有。下面是我的函数代码:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]

RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*) index.php

RewriteCond %{HTTP:Authorization}  !^$
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]

代码编译时没有任何错误,但在运行时,它会抛出一个带有消息的java.lang.ClassCastException: model.Building无法强制转换为model.Person。

当我只用一种代理类型(即' Person')尝试相同的代码时,模型运行正常,函数返回正确的值。有人可以告诉我如何纠正我的代码,以便我能够运行“人物”的功能。请?

2 个答案:

答案 0 :(得分:1)

如果您只想忽略Building类型的代理,那么您可以执行以下操作:

int infectedConnections = 0;

if (getConnections() != null) {
    for (Agent a : this.getConnections())
    {
        if(a instanceof Person) {
            Person p = (Person) a;

            if (p.IsCurrentlyInfected()) {
               infectedConnections++;
            }
        }
    }
}
return infectedConnections;

问题是如果(Person) a;是建筑物而不是人物,a将会失败。

答案 1 :(得分:0)

虽然Rob的回答可以解决您的问题,但请注意,混合PersonBuilding连接确实是您问题的“根本原因”:通常,在一系列事物中混合类型是一种设计您所看到的原因类型的缺陷(可能是您的代理与其他人员代理或建筑代理的关系是两个概念上不同的关系)。

在AnyLogic中,您可以为每个代理设置多个网络,而不仅仅是默认的connections网络,方法是添加额外的Link to agents元素。因此,例如,您的Person代理可以有一个用于家庭关系(例如称为family连接到Person代理),另一个用于他们居住/工作的地方(例如称为{{1}连接到workHomePlaces代理商);显然,我正在发明这些网络的可能目的。

然后,您可以执行Buildingfamily.getConnections()之类的操作,避免遇到您遇到的问题,并采用更具概念正确性的设计。

在帮助中,请参阅 基于代理的建模 - >代理互动 - >定义自定义联系人链接。