0

私は、エージェントベースの流行モデルを使っています。アイデアは、個々のエージェントが自分のネットワークで観察しているもの(距離ベース)に基づいて意思決定を行うというものです。感染した連絡先、特定の動作を示す連絡先などを動的に更新する各エージェント内の機能がいくつかあります。AnyLogic:ネットワークモデルの計算性能を改善する

以下のコードは、エージェントのネットワーク内の感染した連絡先を数えるためのコードです。

int infectedConnections = 0; 

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

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

return infectedConnections ; 

エージェントネットワーク内の他の機能を表す他のエージェントの数をカウントする機能が少なくとも3つ以上あります。さて、これは私が<人のエージェントを持っているときにうまくいくようですが、エージェントの人口を約1,000人に増やすと、モデルは非常に遅くなります。私は少なくとも5,000人のエージェントをシミュレートしようとしていますが、この時点でモデルは初期化さえしません。

より多くの集団に対してAnylogicのネットワーク統計を追跡するための計算上効率的な方法がありますか?

+0

この質問にはより良いタイトルを付けることができます。現時点では非常に一般的/曖昧です。 –

答えて

2

5000エージェントではデフォルトのメモリ量では不十分なため、モデルは初期化されません。各エージェントが他のすべてのエージェント(各エージェントごとに4999接続)に接続されている場合は、1.300Mb以上のRAMが必要ですが、デフォルトのシミュレーション実験では512MbのRAMしか割り当てられません。実験のプロパティのメモリ量を変更します。その後、5000エージェントすべてに対して約1秒でコードが実行されます。言い換えれば、1秒ごとに統計を収集する場合、最大実行速度は1リアル秒あたり約1モデル秒です。

のJavaストリームAPIを使用してコードを書き換える場合は、それを増やすことができます return (int)getConnections().stream() .filter(a -> (Person)a).IsCurrentlyInfected()) .count();

をし、その後、1機種秒を0.5秒リアル(×2ゲイン)で実行されます。統計収集が(Javaコードで作成された複数のスレッドを使用して)並行して実行される場合は、PC上のコア数に応じてそれぞれの利得を得ることができます。 とにかく、これは計算上の複雑さの問題ですので、アプローチ(see @pjs answer)を変更する必要があります。そうしないとパフォーマンスが低下します。

+0

初期化の問題についての良い答えです。 – pjs

1

私が見たエージェントベースのモデルでは、1000と5000の間の何かが落ち込んでしまったという結果がよくあります。これは基本的な計算の複雑さの問題です。 Nエージェントの場合、双方向相互作用の数はN.choose.2であり、O(N^2)である。 5000エージェントは、1000エージェントの約25倍の労力を要します。

ローカリゼーションでいくつかのスタントを引き出すことができます。基本的には、特定のエリアのエージェントが他のエリアのエージェントと対話できないという事実に基づいて、異なるプレイエリアにサンドボックスを分割するので、インタラクションのサブセットを確認するだけです。可能であれば、N個のエージェントをk個の独立したグループに分けることは、実行時間においてO(k)倍の改善をもたらす。

また、タイムステップフレームワークから離れて、問題のイベントベースの設計を行うこともできます。このアプローチの例はthis paperにあります。

0

他の回答はカバーとして、あなたの質問は、実際には2つの質問です:

  • メモリ使用量とエージェントの数が増加するにつれて増加し、合計ネットワーク接続によるモデル速度「を根底」;

  • あなたの統計収集の効率。

私は誰がそれを言及していない驚いているが、後者のための明白な選択肢があなただけの現在の感染数に統計情報を維持している場合は、その理由だけで薬は、彼らのように、関連するカウントを更新していない、ということです感染状態の入力/退出(AnyLogicのステートチャートを使用して「実際の」状態を使用するか、その他の方法でそれを表現するかなど)同様に、他のネットワークで送信された状態の変化に関する統計情報も同様です...

+0

全体的に同じ数の操作が実行されるため、実行がスムーズになりますが、合計時間は同じになります。 –

+0

@ GregoryMonahovどうすれば同じことができますか?彼が書いたことから、毎日のカウントを計算するために、(追加のループなしで変更が発生したときにそれらを更新するのではなく)すべてのルーピングを行う*余分な毎日のイベントがあるようです。私たちは問題を別に見ていますか? –

+0

私があなたの提案を正しく理解している場合、各エージェントは感染した旗の変更について、接続している他のエージェントに通知する必要があります。 Imagingeは、それらを同時に更新します(モデル・ロジックの一部であり、統計収集の一部ではありません)。感染の更新時に各接続エージェントに送信された「通知」の場合と、各エージェントごとに現在の計算の場合の操作数は同じです。 –

関連する問題