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