簡體   English   中英

基於AnyLogic代理的建模:ClassCastException

[英]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的回答解決了您的問題,但請注意,混合使用PersonBuilding連接確實是您問題的“根本原因”:通常,由於您所看到的原因類型,在一組事物中混合類型是設計缺陷(並且您的座席與其他Person座席或Building座席的聯系可能是兩個概念上不同的關系)。

在AnyLogic中,通過向Link to agents元素添加額外的Link to agents每個代理可以具有多個網絡,而不僅僅是默認connections 因此,例如,您的Person代理可以有一個用於家庭關系(例如,稱為family連接到Person代理),另一個可以用於他們居住/工作的地方(例如,稱為workHomePlacesBuilding代理相連); 顯然,我正在發明這些網絡的可能目的。

然后,您可以執行諸如family.getConnections()workHomePlaces.getConnections() ,避免遇到的問題並在概念上更正確。

在幫助中,請參閱基於代理的建模->代理交互->定義自定義聯系人鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM