2018年11月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

Amazonウィジェット

  • お気に入り
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

« 遺伝的アルゴリズムでお掃除ロボットの成長を見守る。 人工知能のプログラムを作った話。 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その3 ~1次元配列で2次元マップを作る~ »

2018年2月21日 (水)

遺伝的アルゴリズムで育てる「お掃除ロボット」 その2

遺伝的アルゴリズムは遺伝子の作りが肝のような気がしたので、
遺伝子の構造体から考えた。

遺伝子は塩基なるものが入っていて、
その配列によって成り立っている。

今でいうと、塩基はロボットの行動パターンを決めている。
右に5マス進む。上に3マス進む。という情報を1セットにして塩基にし、
遺伝子として配列にすれば、
中身を順番に実行することによってその遺伝子の持つ動きを再生できる。

そこでこんな構造体を作った。

typedef struct{
	dir_t dir;//direction
	int num;//numOf movement
}gen_t;

次に、
上記遺伝子を持ったロボット本体の構造体を考えてみた。
ロボットはxyに移動できるので座標を持たせ、
移動のためのLifeを持たせた。
itemはゴミの取得個数を記録する。

typedef struct{
	//value
	int life;
	int item;
	double scr;
	//position
	int x;
	int y;
	//parameter
	gen_t gen[GEN_LEN];
}indiv_t;

とりあえずここまで書いてしまってから、これらの構造体を使って、具体的にコーディングしていった。


main関数の中身を下書きで書いてみた。
メインループをコメントだけで書いてから、その中身を実装で埋めていくと、どこで何が必要になるかがわかりやすい。

main(){
	srand(time(NULL)); //乱数のシードをtimeで設定

	indiv_t ind;
	
	//マップの読み込み。ファイルから
	readMap();
	
	//世代分だけループを回す。
	for(int e=0 ; e < EXEC_LEN; e++){
	
		//robotの数だけ試行
		for(int n=0;n < INDIV_LEN; n++){
		
			//robotを生成
			makeRobot(&ind);
			
			//robotを試行する。
			while (1) {
				execRobot(&ind);
				draw();
				
				Sleep(100);

				if (ind.life < 1) {
					break;
				}
			}
		}
		
		//試行した結果からrobotをscore順にソート
		sortRobot(robots[]);
		
		//上位のrobotを取り出し、交配を実行
		kouhai(robots[],TOP_LEN);
	}
	
}

次はマップの作り方について。 次回に続く。

« 遺伝的アルゴリズムでお掃除ロボットの成長を見守る。 人工知能のプログラムを作った話。 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その3 ~1次元配列で2次元マップを作る~ »

C言語」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/518723/66383151

この記事へのトラックバック一覧です: 遺伝的アルゴリズムで育てる「お掃除ロボット」 その2:

« 遺伝的アルゴリズムでお掃除ロボットの成長を見守る。 人工知能のプログラムを作った話。 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その3 ~1次元配列で2次元マップを作る~ »