[英]AnyLogic agent-based modelling: ClassCastException
我正在與AnyLogic中基於代理的傳染病流行進行模擬。 我的模型中有兩種座席類型:“人”和“建築物”。 我正在嘗試編寫一個函數,該函數計算代理程序類型“人員”在任何給定時間點具有的傳染性接觸的數量。 下面是我的函數代碼:
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無法轉換為model.Person。
當我僅使用一種代理類型(即“ Person”)嘗試相同的代碼時,模型運行良好,並且該函數返回正確的值。 有人可以告訴我如何糾正我的代碼,以便能夠為“ Person”運行該功能嗎?
如果您只想忽略建築類型的代理,則可以執行以下操作:
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
是建築物而不是人,則將失敗。
盡管Rob的回答解決了您的問題,但請注意,混合使用Person
和Building
連接確實是您問題的“根本原因”:通常,由於您所看到的原因類型,在一組事物中混合類型是設計缺陷(並且您的座席與其他Person座席或Building座席的聯系可能是兩個概念上不同的關系)。
在AnyLogic中,通過向Link to agents
元素添加額外的Link to agents
每個代理可以具有多個網絡,而不僅僅是默認connections
。 因此,例如,您的Person
代理可以有一個用於家庭關系(例如,稱為family
連接到Person
代理),另一個可以用於他們居住/工作的地方(例如,稱為workHomePlaces
與Building
代理相連); 顯然,我正在發明這些網絡的可能目的。
然后,您可以執行諸如family.getConnections()
和workHomePlaces.getConnections()
,避免遇到的問題並在概念上更正確。
在幫助中,請參閱基於代理的建模->代理交互->定義自定義聯系人鏈接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.