AnyLogic 基于代理的建模:ClassCastException

AnyLogic agent-based modelling: ClassCastException

我正在 AnyLogic 中使用基于主体的传染病流行病学模拟。我的模型中有两种代理类型——人员和建筑物。我正在尝试编写一个函数来计算代理类型 'Person' 在任何给定时间点具有的传染性接触的数量。下面是我的函数代码:

int infectedConnections = 0;

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

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

return infectedConnections ;

代码编译没有任何错误,但在 运行 期间,它抛出 java.lang.ClassCastException 消息:model.Building cannot be cast to model.Person.

当我仅使用一种代理类型(即 'Person')尝试相同的代码时,模型 运行 很好,函数 returns 是正确的值。有人可以告诉我如何纠正我的代码,以便我能够 运行 'Person' 的功能吗?

如果您只想忽略 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;

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

尽管 Rob 的回答解决了您的问题,但请注意,混合 PersonBuilding 连接实际上是您的问题 'root cause':一般来说,在事物集合中混合类型由于您所看到的原因类型,这是一个设计缺陷(您的代理与其他 Person 代理或 Building 代理的连接可能是两种概念上不同的关系)。

在 AnyLogic 中,通过添加额外的 Link to agents 元素,每个代理可以有多个网络,而不仅仅是默认的 connections 网络。因此,举例来说,您的 Person 代理人可以有一个用于家庭关系(例如称为 family 连接到 Person 代理人)和一个用于他们 live/work 所在的地方(例如称为 workHomePlaces 连接到 Building 代理);显然我正在发明这些网络的可能用途。

然后您可以执行 family.getConnections()workHomePlaces.getConnections() 之类的操作,避免您遇到的问题并获得概念上更正确的设计。

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