2017-11-13 17 views
0

私は、AnyLogicの感染症の流行に関するエージェントベースのシミュレーションを行っています。私のモデルにはPersonとBuildingという2つのエージェントタイプがあります。私は、エージェントタイプ 'Person'が任意の時点で持っている感染性連絡先の数を数える関数を記述しようとしています。以下は、関数の私のコードです:AnyLogicエージェントベースのモデリング:ClassCastException

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」の機能を実行できるように、コードを修正する方法を教えてもらえますか?あなただけのタイプのビルのエージェントを無視したい場合は、次の操作を行うことができ

答えて

1

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;が失敗するということです。

+0

これはまさに私が探していたものです。どうもありがとうございました! – crabcanon

0

ロブの答えは混合PersonBuildingの接続を持つことは、本当にあなたの問題の「根本原因」であることに注意して、あなたの問題を解決するが:一般的に、物事のコレクションに種類を混合することの理由あなたのタイプのための設計上の欠陥であります他のPersonエージェントやBuildingエージェントへのあなたのエージェントの接続は、2つの概念的に異なる関係です。

AnyLogicでは、要素を追加することで、デフォルトのconnectionsでなく、エージェントごとに複数のネットワークを設定できます。たとえば、Personエージェントには、家族関係(Personエージェントに接続するというとfamilyと呼ばれます)と、生きて働く場所(たとえばはBuildingエージェントに接続しています)の1つがあります。明らかに私はこれらのネットワークの可能な目的を発明しています。

次に、発生した問題を回避し、より概念的に正しいデザインを持つように、family.getConnections()workHomePlaces.getConnections()のようなことを行うことができます。

ヘルプでは、 エージェントベースのモデリング - >エージェントの対話 - >カスタム連絡先リンクの定義を参照してください。

+0

ありがとう、スチュワート。それは非常に便利です。 – crabcanon