ここから本文です

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

neorasberryさん

2011/11/202:36:11

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

以下の仮定をもとにアリの挙動をモデリングした時のプログラムはどのようになりますか?よければプログラム例を教えていただけたら嬉しいです。

①一次元で50程の格子の上に蟻1と蟻2がそれぞれ20、30のあたりの場所に居る
②蟻1が左(0)に向かって進み始める、蟻1が踏んだ場所にはフェロモンが残る
③蟻2はランダムな動きをしているが、蟻1が残したフェロモンを見つけると蟻1を追いかけるようにフェロモンをたどる

言語はCで考えています。後々二次元でプログラミングしたいのですが、まず一次元の簡単な例から教えていただける方は居られませんか?よろしくお願いします。

閲覧数:
1,120
回答数:
2

違反報告

ベストアンサーに選ばれた回答

編集あり2011/11/210:36:27

ランダムな動きだと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〜1件/1件中

yurugoaさん

2011/11/222:20:37

モデリングが不完全なのでプログラム作成は不可能じゃないでしょうか?
そもそも格子は二次元であると思いますが、「一次元で50程の格子」とは何でしょうか?
たんに一次元(数直線)上の0から+50程度の範囲を想定して、一動作ごとに隣の整数値の地点に移動し、蟻1はこの整数値の地点「のみ」にフェロモンを残すということでしょうか?
格子というのが、0~1、1~2、2~3というものだと考えているのだとしても、単に表現の違いだけで上に挙げた整数値の地点の考え方と数学的には同値でしかなく、二次元に拡張しても同じことです。

> 蟻1が残したフェロモンを見つけると蟻1を追いかけるようにフェロモンをたどる
の「フェロモンを見つける」は良いとして、「蟻1を追いかけるように」「フェロモンをたどる」という動作の判断材料は何でしょうか?
「蟻1を追いかけるように」ということは、フェロモンを見つけた位置からどの方向に蟻1が居るのかを推定することであり、何から判断するのでしょうか?
蟻2の直前の移動方向を用いてよいならば、考えているのが一次元なので一度フェロモンを見つけたらその時点でそれ以降の移動方向が固定(常にフェロモンがある地点へ移動)されてしまいますが、それでよいのですか?
蟻1は常に左(0方向)へ進んでいるとすると、蟻2が蟻1に追いつくこともないですがそれで構わないのでしょうか?

一次元で考えているからこのような不具合的なことが生じるのだし、一次元の場合を二次元に応用するメリットなどあり得ないので、最初から二次元の場合で考えるべきじゃないですか?

二次元の場合は、直前の移動方向だけでは判断ミスが生じて、ループ動作(同じ地点を堂々巡り)となる可能性があるので、フェロモンがある地点に過去に到達したことがあるかとか、フェロモンがある地点からの各4方向へ移動の有無といった、ようはマッピングをすることが有効手段ですが、どの程度までのマッピングを想定しているのでしょうか?

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。