アリの挙動のプログラムが分かりません。

アリの挙動のプログラムが分かりません。 以下の仮定をもとにアリの挙動をモデリングした時のプログラムはどのようになりますか?よければプログラム例を教えていただけたら嬉しいです。 ①一次元で50程の格子の上に蟻1と蟻2がそれぞれ20、30のあたりの場所に居る ②蟻1が左(0)に向かって進み始める、蟻1が踏んだ場所にはフェロモンが残る ③蟻2はランダムな動きをしているが、蟻1が残したフェロモンを見つけると蟻1を追いかけるようにフェロモンをたどる 言語はCで考えています。後々二次元でプログラミングしたいのですが、まず一次元の簡単な例から教えていただける方は居られませんか?よろしくお願いします。

C言語関連1,279閲覧

ベストアンサー

このベストアンサーは投票で選ばれました

0

ランダムな動きだとBが10マス連続で左にいきそうにないので 8割左に移動するようにしてみました。(srandしていませんので毎度同じパターンになります) #include <stdio.h> #include <stdlib.h> #include <string.h> void MoveA(int *n, unsigned char *p) { *n += (*n>0)?(-1):(0); p[*n] = 0x01; } void MoveB(int *n, unsigned char *p) { if( *n == 0 ) (*n)++; else if( *n >= 49 ) (*n)--; else if( p[*n] ) { p[*n] = 0x00; if(p[*n-1])(*n)--; else if(p[*n+1])(*n)++; else (rand()%5)?((*n)--):((*n)++); } else (rand()%5)?((*n)--):((*n)++); } int main() { unsigned char ucRoad[50]; int nAntA = 20, nAntB = 30; memset(ucRoad,0,sizeof(ucRoad)); while(nAntA != nAntB) { MoveA(&nAntA, ucRoad); MoveB(&nAntB, ucRoad); } return 0; }

その他の回答(1件)

0

モデリングが不完全なのでプログラム作成は不可能じゃないでしょうか? そもそも格子は二次元であると思いますが、「一次元で50程の格子」とは何でしょうか? たんに一次元(数直線)上の0から+50程度の範囲を想定して、一動作ごとに隣の整数値の地点に移動し、蟻1はこの整数値の地点「のみ」にフェロモンを残すということでしょうか? 格子というのが、0~1、1~2、2~3というものだと考えているのだとしても、単に表現の違いだけで上に挙げた整数値の地点の考え方と数学的には同値でしかなく、二次元に拡張しても同じことです。 > 蟻1が残したフェロモンを見つけると蟻1を追いかけるようにフェロモンをたどる の「フェロモンを見つける」は良いとして、「蟻1を追いかけるように」「フェロモンをたどる」という動作の判断材料は何でしょうか? 「蟻1を追いかけるように」ということは、フェロモンを見つけた位置からどの方向に蟻1が居るのかを推定することであり、何から判断するのでしょうか? 蟻2の直前の移動方向を用いてよいならば、考えているのが一次元なので一度フェロモンを見つけたらその時点でそれ以降の移動方向が固定(常にフェロモンがある地点へ移動)されてしまいますが、それでよいのですか? 蟻1は常に左(0方向)へ進んでいるとすると、蟻2が蟻1に追いつくこともないですがそれで構わないのでしょうか? 一次元で考えているからこのような不具合的なことが生じるのだし、一次元の場合を二次元に応用するメリットなどあり得ないので、最初から二次元の場合で考えるべきじゃないですか? 二次元の場合は、直前の移動方向だけでは判断ミスが生じて、ループ動作(同じ地点を堂々巡り)となる可能性があるので、フェロモンがある地点に過去に到達したことがあるかとか、フェロモンがある地点からの各4方向へ移動の有無といった、ようはマッピングをすることが有効手段ですが、どの程度までのマッピングを想定しているのでしょうか?