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 的回答解决了您的问题,但请注意,混合 Person
和 Building
连接实际上是您的问题 'root cause':一般来说,在事物集合中混合类型由于您所看到的原因类型,这是一个设计缺陷(您的代理与其他 Person 代理或 Building 代理的连接可能是两种概念上不同的关系)。
在 AnyLogic 中,通过添加额外的 Link to agents
元素,每个代理可以有多个网络,而不仅仅是默认的 connections
网络。因此,举例来说,您的 Person
代理人可以有一个用于家庭关系(例如称为 family
连接到 Person
代理人)和一个用于他们 live/work 所在的地方(例如称为 workHomePlaces
连接到 Building
代理);显然我正在发明这些网络的可能用途。
然后您可以执行 family.getConnections()
和 workHomePlaces.getConnections()
之类的操作,避免您遇到的问题并获得概念上更正确的设计。
在帮助中,见
基于代理的建模 --> 代理交互 --> 定义自定义联系人链接。
我正在 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 的回答解决了您的问题,但请注意,混合 Person
和 Building
连接实际上是您的问题 'root cause':一般来说,在事物集合中混合类型由于您所看到的原因类型,这是一个设计缺陷(您的代理与其他 Person 代理或 Building 代理的连接可能是两种概念上不同的关系)。
在 AnyLogic 中,通过添加额外的 Link to agents
元素,每个代理可以有多个网络,而不仅仅是默认的 connections
网络。因此,举例来说,您的 Person
代理人可以有一个用于家庭关系(例如称为 family
连接到 Person
代理人)和一个用于他们 live/work 所在的地方(例如称为 workHomePlaces
连接到 Building
代理);显然我正在发明这些网络的可能用途。
然后您可以执行 family.getConnections()
和 workHomePlaces.getConnections()
之类的操作,避免您遇到的问题并获得概念上更正确的设计。
在帮助中,见 基于代理的建模 --> 代理交互 --> 定义自定义联系人链接。