6

「ant-farm シミュレーター」を Erlang にプロパティ ポートする方法を考えています。基本的な概要は次のとおりです。

1) 100x100 の「スロット」の世界を定義する

2) アリは 1 つのスロットを占有します

3) アリのコロニーは位置 50,50 を占めています

4) 食べ物はマップ上にランダムに配置されます

5) アリは一度に 1 スペース移動して餌を探し、コロニーに戻します。

6) 一度にスロットに入れることができるオブジェクトは 1 つだけです。

この問題の目標は、システムを可能な限り並行に保つことです。Clojure では、上記の問題は、それぞれが 1 つのアリに対して AI を実行するエージェントのスレッド プールを持つことで解決されます。次に、これらのアリはトランザクションを介してグローバル状態を更新します。

私が考え続けているのは、そのグローバルな状態です。「ゲームの世界」をどう構築していくか。

私が最初に考えたのは、アリごとに Erlang プロセスを作成し、次にマップ内のスロットごとにプロセスを作成することです。移動するために、アリは次のことを行います。

1) アリは現在のスロットを「北に移動したい」と伝えます。

2) スロットはスロットを北に呼び出し、「内容を更新して、ant "pid" を含めるようにしてください」と伝えます。

3) 北のスロットに既にアリがいる場合は、「拒否」応答を送信し、アリを含むスロットに (そしてアリに) 細流します。更新が機能する場合、"granted" がチェーンに送信され、ant は内部状態を更新します。

この方法で唯一気に入らない点は、移動プロセス中に、トランザクション全体が完了するまで、ant、そのスロット、およびターゲット スロットがすべて「ロック」されることです。これにより、デッドロックが発生する可能性があります。つまり、2 匹のアリが同時に場所を交換しようとしている可能性があり、各スロットは他のスロットを待っています。

誰でもより良い解決策を提案できますか?

- -編集 - -

デッドロックの問題を順を追って説明します。

1) Ant 1 がスロット A にスロット 2 への「北への転送」を要求する 2) Ant 2 がスロット B にスロット 1 への「南への転送」を要求する 3) スロット 1 がスロット 2 に転送要求を送信し、応答を待つ 4) スロット 2スロット1に転送要求を送信し、応答を待ちます

コードの観点からは、これは実装が簡単ですが、各スロットは他のスロットからの応答のみをリッスンするため、デッドロックも発生します。「正しい方法」は、転送中にすべての転送要求を自動的に拒否することだと思います。

4

2 に答える 2

1

移動先のスロットにアリをキャストさせ、移動の許可を求めます。その後、アリはキャストの応答を待ち、移動が成功したかどうかを伝えます。移動が成功した場合、アリは自身の状態を更新して、新しいスロットにいることを示します。失敗した場合は、検索ロジックをもう一度実行します。A と B がスロットを交換しようとすることになった場合、デッドロックは発生しませんが、両者は他のオプションを探す必要があると考えます。

グリッドが非常に占有されている場合は、スロットでポーリング ロジックを実行し、近隣のアリに許可を与えて、ロジックがそこに導く場合は入ることができることを伝えます。(グリッド上に 50x50-2 のアリがいると想像してください。なぜこれがロジックの良い変更になるのかがわかるでしょう。)

絶対に、積極的に、間違いなく電話なしでは生きていけない場合を除き、電話は絶対に使用しないでください。そして、同じタイプのプロセスが相互に呼び出しを行う可能性がある場合、または相互に呼び出しを行うことができるタイプのプロセスが発生する可能性がある場合は、それらを取り除くために非常に努力してください。

于 2012-04-23T23:24:43.667 に答える
0

北上に失敗したら、次は別の方向に行くのではないでしょうか?デッドロックはどこにありますか?

フィールドがかなり混み合っている場合、飢餓は想像できますが、行き詰まりはありません。

于 2012-04-23T18:55:29.300 に答える