3

おはようございます。私は AnyLogic プラットフォームを初めて使用し、会社のビジネス プロセスをマッピングするために使用したいので、AnyLogic プラットフォームの研究を開始しました。ツールのプロセス モデル ライブラリを使用してさまざまな部門をモデル化し、部門間の情報の流れがどのように実装されているかを調査することを計画しています。

私のダイアグラムは「ソース」要素とさまざまな「アセンブラー」要素で構成され、最後の要素 (アセンブラー) がゲートウェイとして機能することを望みます。状況をよりよく説明するために、簡単な図を同封します(例)

''sourceA'' と ''sourceB'' (異なる部門に置かれている) が、2 つのカスタム エージェントで実装された 2 つの異なるドキュメントを生成するとします (たとえば、''sourceA'' から生成されたエージェントには ''orderID'' パラメータがあり、エージェントは ''orderID'' パラメータを持っています)。 ''sourceB'' には ''qualityCheckID'' パラメーターがあります) は、アセンブラー コンポーネント (別の部門に配置されます) に到達する前に、それぞれのキューで伝達されます。部門が同期されていないため、高い確率でキューがシミュレーション中に整列されません (queue[10] = agent.orderID が 10 に設定され、queue[10] = agent.qualityIDCheck が 9 に設定されます)。アセンブラがゲートウェイとして機能して、''orderID'' が ''

ドキュメントを読むと、エージェントは空いているときにアセンブラー ポートに到達し、それ以外の場合はキューで待機することがわかりました。非同期化が原因で、アセンブラー ポートには、orderID が qualityCheckID と等しくないエージェントが存在する可能性があります。この場合、アセンブラーの出力が生成されることは望ましくありません。必要なエージェントがポートではなくキューにあるため、「アセンブラー」はキュー内を検索して、対応するエージェントが存在するかどうかを確認し、存在する場合はキューから削除する必要があります (間違ったエージェントをポートはこの最後のものをキューに入れ、出力を生成します)

このシナリオをどのように実装できるかを理解するのを手伝ってくれる人がいます。

4

1 に答える 1

1

おはようアンドレア。

これにはいくつかの代替手段があります。両方の ID が段階的に生成される場合 (1、2、3、....、N)、Match ブロックを使用すると、フローが同期されます。さらに、このブロックには既にキューが組み込まれているため、キュー要素を削除できます。

ただし、ID がランダムに生成される場合は、何らかの回避策を講じて、Java コードと関数を使用する必要がある場合があります。私がすることは次のとおりです。

キュー(次のブロックが利用可能になるとすぐにエージェントを送信する)を使用する代わりに、 Waitブロックを使用します (これはほとんどキューですが、要素を順序付けたり、必要になるまでエージェントを送信したりしません. AnyLogic の説明を読むと、明確になります)。

エージェントが待機ブロックに入るたびに、整数 (または注文パラメーターのタイプ) キーとエージェント値 (待機ブロックごとに 1 つ) を使用してLinkedHashMapまたはHashMapコレクションに追加します。これにより、情報へのアクセスが容易になります (特定のエージェントが存在するかどうかを確認するたびに Wait コンテンツ全体を検索するよりも)。次のステップは、他の待機ブロックに、アセンブリ タスクを実行するために必要な要素があるかどうかを確認することです。その場合は、それらすべて (および現在のエージェント) を解放します。

コードは次のとおりです。

入力時:

WaitBlockHashMap.put(agent.orderID, agent)
if (WaitBlockHashMap2.get(agent.orderID)!=null) { //if the matching element 
                                                  //is on the other Wait Block
    self.free(agent);
    WaitBlock2.free(WaitBlockHashMap2.get(agent.orderID));
}

また

WaitBlockHashMap.put(agent.qualityCheckID, agent)
if (WaitBlockHashMap2.get(agent.qualityCheckID)!=null) { //if the matching element 
                                                         //is on the other Wait Block
    self.free(agent);
    WaitBlock2.free(WaitBlockHashMap2.get(agent.qualityCheckID));
}

その待機ブロック内のエージェントのタイプによって異なります。

これがお役に立てば幸いです、ルイス

于 2016-10-04T09:18:34.740 に答える