エージェントシステム

概要と主要な概念

エージェントシステムは2つの主要な要素で構成されます。

  1. オブジェクト、またはエージェントのセット
  2. 動作のセット

エージェントシステムはエージェント間の継続的な近接関係を保持し、各エージェントは同時に1つ以上の動作をアクティブにできます。これらの動作により、エージェントは周辺の他のエージェントに基づいて決定を行うことができます。

エージェントシステムとエージェントベースのモデル化の相違

FlexSimのエージェントシステムは、エージェントベースのモデル化と密接に関係していますが、正確に同じではありません。エージェントベースのモデル化について、万人に受け入れられる定義は困難ですが、エージェントベースのモデル化は多くの場合、次のうち1つ以上の要素が含まれています。

  • エージェントベースのモデル化は、自律的なエージェントのセットで構成されている - オブジェクト指向の観点から、これらのエージェントは本質的にオブジェクトです。
  • エージェントは何かのルールまたは意思決定ロジックのセットに従って動作する - これらのルールは単純な場合もありますが、単純であることを求められているわけではありません。動作マッピングも異種混合で動的な可能性があります。各エージェントには隣接エージェントとは異なるルール/動作のセットが存在する可能性があり、動作を動的に取得および破棄する可能性もあります。
  • エージェントは周囲の環境を認識する - これは空間的な認識、つまり空間的に近い他のエージェントを認識することも、家族や職業上の関係など他の種類のエージェント間認識のこともあります。これらのエージェント認識環境は多くの場合、エージェントのトポロジと呼ばれます。
  • エージェントの動作は一般に、エージェントの観点から定義される - 言い換えれば、エージェントベースのモデル化は本質的にオブジェクト指向です。
  • エージェントベースのモデル化には、非常に多くの数のエージェントが関与することがある - エージェントベースのモデル化では多くの場合、人口の力学を分析し、多くのエージェントが他の多くのエージェントと相互に連携します。

FlexSimはエージェントモジュールの導入前に、すでにエージェントベースのモデル化の多くの要素について高い能力を保有していました。たとえば、オブジェクト処理フローを使用して、オブジェクト指向またはエージェントベースの観点で簡単にロジックを定義できます。さらに、オブジェクトやトークンから、別のオブジェクトやトークンを指すラベルを使用し、空間以外のトポロジを簡単に定義できます。また、FlexSimは非常に高いスケーラビリティを持ち、多数のエージェントをシミュレートできます。エージェントを表すために完全な3Dオブジェクトではなく、処理フローの軽量トークンを使用すると、特にスケーラビリティが高くなります。最後に、FlexSimのAGVコンベヤA*の移動メカニズムはすべて、特定の問題ドメイン、たとえばコンベヤシステムやAGV移動システムなどの中で、高忠実度の近接性に応じた動作を提供します。

FlexSimの新しいエージェントシステムでは、これまで利用可能であった機能に加えて、エージェントの環境認識を行うためのスケーラブルで汎用の、空間的なコンポーネントを使用できます。エージェントシステムは、すべてのエージェントの場所について境界容量階層を保持します。このデータ構造により、オブジェクトと空間的に隣接した近傍オブジェクトを、よりスケーラブルに検出できます。従来は、空間的な近接性を検出するには、オブジェクトの場所を、モデル全体に含まれる他のすべてのオブジェクトと比較する必要がありました。エージェントの数が数千に達すると、この方法は計算量から非現実的になります。しかし、境界容量階層を使用すると、空間的な近接性をはるかに効率的に検出できるようになり、エージェントの数をより簡単に増やすことができます。

近接性の計算

近接検出メカニズムは、エージェントの中心から、近接エージェントの境界ボックスで最も近いポイントまでの距離を測定し、近接距離を計算します。

各エージェントは、近接エージェントのそれぞれとの間で、独自の近接計算を行います。言い換えると、エージェントの中心と近接エージェントの境界ボックスとの間で近接計算が行われるため、エージェントと近接エージェントとの間の近接計算は、近接エージェントとそのエージェントとの間の近接計算とは多少異なる可能性があります。

この近接計算は、「静的な」近接エージェントとの間でも行われます。静的なエージェントとは、動作が何も割り当てられていないエージェントです。この最も一般的な例は、A*の壁やバリアです。これらは、他のエージェントから検出可能な環境を構成するので、技術的にはエージェントですが、自分自身では何の動作も行わないため静的です。言い換えると、アクティブエージェントは動作の一部として壁やバリアとの近接性を計算しますが、それらのバリア自体は何の動作も行わないため、逆の計算は行われません。

[動作]タブ

上述のように、エージェントシステムはエージェントのセットと動作のセットで構成されます。個別のエージェントは、同時に1つ以上のアクティブな動作を持つことができ、それらの動作は動的にアクティブ化および非アクティブ化できます。エージェントシステムを構成する動作は、[動作]タブで定義できます。

動作の追加、削除、名前の変更

上部のフィールドと、その横にあるコントロールを使用して、システムの一部である動作に対して選択、作成、削除、名前の変更、順序の変更を行えます。 ボタンをクリックすると、新しい動作を追加できます。テキストフィールドボックスをクリックすると、動作の名前を変更できます。上および下矢印を使用して、リスト内で動作の順序を変更できます。 ボタンは動作を削除します。

FlexSimのエージェントの動作には、近接動作とソーシャルフォース動作の2種類があります。

近接動作

近接動作は、エージェントと近接エージェントとの間の近接性を検出する単純な動作です。

近接動作の詳細については、「近接動作」を参照してください。

ソーシャルフォース動作

ソーシャルフォース動作は、環境における近接エージェントに基づいてエージェントをさまざまな方向に「プッシュ」する力のセットを定義します。この動作は、ソーシャルフォースのモデル化と呼ばれる方法論に従います。

ソーシャルフォース動作の詳細については、「ソーシャルフォース動作」を参照してください。

[エージェント]タブ

[エージェント]タブには、現在のシステムの一部であるすべてのエージェントのリストに加えて、それぞれの動作について、シミュレーションの開始時にそのエージェントでその動作をアクティブにすべきかどうかの設定が含まれています。

[エージェント]列

[エージェント]列には、3Dオブジェクトエージェントのパス名が表示されます。

[動作]列

システムの各動作について、シミュレーションの開始時にその動作をアクティブにすべきかどうかを示す列がテーブルに表示されます。この列のセルをクリックすると、列の横にメニュー選択矢印が表示されます。[オン]または[オフ]を選択できます。

[一般]タブ

[一般]タブには、次のプロパティがあります。

有界階層を表示

このチェックボックスをオンにすると、近接システムにおけるエージェントの有界階層ワイヤフレームが表示されます。

エージェント状態情報を表示

このチェックボックスをオンにすると、エージェント3Dオブジェクトの周囲に境界ボックスワイヤフレームが描画され、定義済みの近接半径を示す円がエージェントの周囲に描画されます。

XY平面のみ距離と勢力を解決

このチェックボックスをオンにすると、近接測定がXおよびY軸に沿ってのみ解決されるようになります。この場合、エージェントの近接有界は筒状で、エージェントと同じ高さ、動作によって定義された半径になります。さらに、ソーシャルフォース動作の力はXY平面に固定されます。チェックボックスをオフにすると、エージェントの近接有界は中心の周囲で動作によって定義された半径を持つ球形になります。デフォルトではチェックボックスはオンです。

他のFlexSimロジックとの統合

FlexSimモデルの他の要素、たとえば処理フロー統計コレクションなどを、イベントリスニングによってエージェントシステムの機能と統合できます。エージェントシステムの初期リリース時点では、エージェントと動作イベントをリッスンするには、ツリービューでサンプリングするのが最良の方法です。

エージェントイベントのリッスン

個別のエージェントで近接動作が有効なら、そのエージェントの近接イベントをリッスンできます。これは、エージェントのロジックを処理フローに定義する場合は特に便利です。 特定のエージェントの近接動作イベントをリッスンするには、次の手順に従います。

  1. 処理フローに、[イベントトリガーソース]または[イベントを待つ]アクティビティを追加します。
  2. イベントのターゲットオブジェクトを定義するには、[オブジェクト]フィールドでAgent()コンストラクターを呼び出し、エージェントオブジェクトを渡します。オブジェクト処理フローでは、これは現在、またはトークンのラベル値の可能性があります。
  3. ターゲットイベントを定義するには、まずツリービューを開き、モデル内のエージェントシステムを見つけて、エージェントシステムから相対位置で>variables/agentsにあるエージェントのリストを展開します。
  4. リストを展開したら、処理フローアクティビティのプロパティにある ボタンを押し、リストのエージェントの1つをクリックします。On Enter Proximityなどのイベントのリストが表示されます。
  5. 目的のイベントを選択します。

動作イベントのリッスン

近接動作すべてのイベントをリッスンすることもできます。これは、統計収集で特に便利です。統計コレクターの近接動作イベントをリッスンするには、次の手順に従います。

  1. ツールボックスに統計コレクターを追加します。
  2. ターゲットイベントを定義するには、まずツリービューを開き、モデル内のエージェントシステムを見つけて、エージェントシステムから相対位置で>variables/behaviorsにある動作のリストを展開します。
  3. リストを展開したら、統計コレクターのプロパティにある ボタンを押し、リストの動作の1つをクリックします。On Enter Proximityなどのイベントのリストが表示されます。
  4. 目的のイベントを選択します。

これで、近接動作全体に関連付けられているイベントをリッスンするようになります。