蟻の挙動をプログラムしてみた

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1174592376
これを見て面白そうなので作ってみた。言語はC++,ステップ数はヘッダとソー
スで1200行位。上記質問だと仕様がはっきりしないから自分なりにモデルを考
えた。
モデルを考えるとき問題になりそうなのは

Q1.蟻の進み方。ランダムウォークって言っても実際はどんな風にランダムなの?
Q2.エサ探しは何匹で出かけるの?
Q3.エサ探しは巣の近くと遠くで進み方が異なる?
Q4.エサ探しはいつ帰って来るの?永遠に探し続けるのは変だ。
Q5.誰かがエサを取ってきたときエサ取りに出かけるのは何匹か?
Q6.エサ探しの蟻がエサを見つけたとき,他のエサ探しの蟻がそれに反応するか?
Q7.蟻同士の重なりは?
Q8.巣に帰るとき自分の足跡を辿るのか仲間の足跡を辿るのか?
Q9.フェロモンは?

上記疑問点について自分なりに適当に考えてみた。

A1.進み方は確率を定義できるようにした。
A2.定数で定義。
A3.実際の蟻を見ていると最初は巣から離れるように進んでいくようだけど,近くと遠くで一緒の動作にした。
A4.巣からの歩数で一定数を超えたら帰巣する。
A5.定数で定義。エサ1の増量に対して出て行く蟻の数を定義する。
A6.反応しないことにした。エサ探しをしている蟻はエサ探しに専念する。
A7.蟻同士の重なりはなし。一つのマス目に1匹の蟻。
A8.仲間の足跡で一番巣に近いのを辿る。
A9.フェロモンは使わないことにした。足跡フェロモンは巣からの歩数で代用,食料フェロモン(あるとして)はエサからの歩数で代用。

今回のポイントと結果は以下の通り
・エサまでの行列は出来るか => 出来た
・行列は太くなるか => 太くならない
・ショートカットは出来るか => 偶然出来る
・最後に行列は消えるか => 消える
・デッドロックしないようにする => なんとかデッドロックは回避
・2箇所エサ場があるとき両方無くなるか => ダメだった。一箇所限定。

巣からエサ場までの行列はこんな感じになりました。




左上が巣で右下のピンクがエサ場です。黄色いのはエサを持って蟻が通った跡<br>
です。小さすぎて良く見えませんが,青い点がエサ取りに出かけた蟻,赤い点<br>
がエサを探している状態,緑が何も持たずに巣に帰り,薄い青がエサを持って<br>
帰る所です。<br>

不満点はエサの近くでの挙動です。実際の蟻を見ているとエサの周りを取り囲
むようになりますが,それが出来ない。

最初に作った状態より蟻っぽく見えてきたので公開します。

ソースファイルは ants-20111115.zip に置いておきます。使いたい人は自由に使ってください。ソースファイルにGUI部分は付いていません。

今回作成したプログラムは学術的な知見に基づいているわけではありません。

今回作成したプログラムと実際の蟻を見ての私の個人的な感想。

蟻について最近思ったこと。