4

可変数のエージェントを維持する必要がある C++ で記述されたシミュレーションがあり、それを適切に実装する方法を決定するのに苦労しています。すべてのエージェントは次のようになります。

class Agent{
public:
    Vector2f pos;
    float health;
    float data[DATASIZE];
    vector<Rule> rules;
}

次のように、シミュレーションで可変数のエージェントを維持する必要があります。

  1. エージェントの数に上限がないことが望ましい
  2. エージェントを簡単に追加できます
  3. ある条件下 (健康状態が 0 未満など) でエージェントを簡単に削除できます。
  4. すべてのエージェントを簡単に反復して何かを実行できます (健康など)。
  5. 多くの更新は多少コストがかかりますが、他のエージェントから完全に独立しているため、できれば openMP を使用して作業を並列化できます。
  6. (編集) エージェントの順序はまったく関係ありません

エージェントにはどのようなコンテナまたは設計原則を使用する必要がありますか? 今までベクトルを使っていましたが、この構造から消すのはかなり難しいと思います。物事は常に死ぬので、かなり頻繁に行う必要があります。私が見るべき代替手段はありますか?Listのようなものを考えたのですが、イテレータオブジェクトで連結リストとして実装されているので並列化できないのでしょうか?

ありがとうございました

4

4 に答える 4

5

死んだエージェントをリストに残して、再利用できるようにすることができます。コンテナーを縮小する心配はなく、ベクターの利点を保持できます。死んだ/再利用可能なエージェントへのポインタのスタックを個別に保持し、エージェントが死んだときにそれをプッシュし、1 つをポップして新しいエージェントを取り戻すことができます。

foreach Agent {
    if (agent.health > 0) // skip dead agents
        process rules
于 2010-08-30T19:25:16.160 に答える
3

今までベクトルを使っていましたが、この構造から消すのはかなり難しいと思います。物事は常に死ぬので、かなり頻繁に行う必要があります。

シミュレーションの各ステップで、実際に何人死ぬと予想されますか? 人間にとって「いつも」のように見えることは、コンピューターにとっては非常にまれであると見なすことができます. たとえば、シミュレーションの各ステップで数千のエージェントが処理されるが、数ステップごとに平均して 1 人のエージェントしか死亡しない場合、エージェントの死亡は軽微なインシデントです。このような数値では、プログラムは、死んだエージェントを処理するよりも、生きているエージェントの処理にはるかに多くの時間を費やします。エージェントの削除をより効率的にすると、通常のエージェントの反復と処理の効率が低下する場合 (ただし、エージェントの削除は比較的まれです)、それはおそらく悪いトレードオフです。

一方、シミュレーション ステップごとに多数のエージェントが生成されて消滅する場合は、それらのイベントを効率的に処理できるようにする必要があります。したがって、それは実際に扱うと予想される数値の種類に依存します.

私の一般的なアドバイスは、エージェントの総数と比較して、ステップごとにかなりの数のエージェントの死亡が実際に予想される場合を除き、(設計の残りの部分に適合する限り) std::vector を使用して続行することです。

于 2010-08-30T19:50:55.263 に答える
0

リストはかなりうまくいくはずです。要素を挿入または削除しても他のイテレータは無効にならないため、並列化できます(もちろん、削除される要素を指すイテレータを除く)。

後方トラバーサルが必要ない場合、slistはlistと同じくらい優れており、少し高速です。

要素の順序を気にしない場合は、setを使用してください。

于 2010-08-30T19:31:29.000 に答える
0

ビデオ ゲームのように四分木を使用します。次に、検索posも高速で、削除も高速です。(さらに、子ノード間で並列化できます)。

于 2010-08-30T19:54:31.037 に答える