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

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

« 遺伝的アルゴリズムで育てる「お掃除ロボット」 その2 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その4 ~遺伝子の作成~ »

2018年2月28日 (水)

遺伝的アルゴリズムで育てる「お掃除ロボット」 その3 ~1次元配列で2次元マップを作る~

今回は、1次元配列で2次元マップを作る方法を紹介。

2次元配列の代わりに一次元配列を使って2次元マップを作る場合、
XY座標を入れたら一次元配列のどの要素になるか、つまり配列のインデックスを返す関数があると便利だ。今後の基礎となる機能なので、確実に検証したい。

robotを動かすマップは16x16マスくらいは欲しいが、最初からその大きさでデバッグすると効率が悪い。そこで、4x4マスの極小サイズできちんと検証する。


一次元配列を2次元マップにするとどうなるのか、
インデックスを4x4マスに並べてみるといい。

ここで、(X,Y)が(1,1)と与えられたら、インデックスは5となる。

これは、”index = X+W*Y”

として表される。ただしW=4。

ちなみに、この関数はお絵かきツールのために作った関数の使いまわし。
XYがmapの範囲外だった場合は、-1を返すようになっている。

mapの外に出ようとしてもせき止められるように処理するのに使える。




お絵かきツールを最初に作ったときに、この関数を十分に確認しないまま塗りつぶし機能やらGUIやらを載せたので、常にグラグラと不安定な動作しかできなかった。

最初の土台が肝心なので、時間がかかっても確実に。




//
//int x,yを別々にメンバにすると見通しが悪いので、
//構造体にしてまとめた。
//
typedef struct {
    int x;
    int y;
}point_t;

//
//関数プロトタイプ
// XY座標をmapのインデックスに変換する関数。
//
int getIndex(point_t p);

//
//戻り値:map[]のインデックスを返す。
//        もしmapの外に出ていたら-1を返す。
//
int getIndex(point_t p) {
    if (
        (p.x < 0 || W - 1 < p.x) ||
        (p.y < 0 || H - 1 < p.y)
        ) {
        return -1;
    }
    return p.x + p.y * W;
}

検証に使ったコードはこちら。今回のロボットの課題には使わないのだが、mapの範囲から出たら-1を返す機能も併せて検証するために、-4~W+4までの範囲でループを回している。

	point_t p;
	
	for (int i = -4; i < H + 4; i++) {
		for (int j = -4; j < W + 4; j++) {
			p.x = j;
			p.y = i;
			int idx = getIndex(p);
			printf("%2d,", idx);
		}
		puts("");
	}

printfもフォーマットをうまく使えば表みたいに出力できる。検証データをこうやって一覧にすると見やすくて楽。

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1, 0, 1, 2, 3, 4, 5, 6, 7,-1,-1,-1,-1,
-1,-1,-1,-1, 8, 9,10,11,12,13,14,15,-1,-1,-1,-1,
-1,-1,-1,-1,16,17,18,19,20,21,22,23,-1,-1,-1,-1,
-1,-1,-1,-1,24,25,26,27,28,29,30,31,-1,-1,-1,-1,
-1,-1,-1,-1,32,33,34,35,36,37,38,39,-1,-1,-1,-1,
-1,-1,-1,-1,40,41,42,43,44,45,46,47,-1,-1,-1,-1,
-1,-1,-1,-1,48,49,50,51,52,53,54,55,-1,-1,-1,-1,
-1,-1,-1,-1,56,57,58,59,60,61,62,63,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,

次は遺伝子を処理する部分を実装

次回に続く

« 遺伝的アルゴリズムで育てる「お掃除ロボット」 その2 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その4 ~遺伝子の作成~ »

C言語」カテゴリの記事

コメント

コメントを書く

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

トラックバック

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

この記事へのトラックバック一覧です: 遺伝的アルゴリズムで育てる「お掃除ロボット」 その3 ~1次元配列で2次元マップを作る~:

« 遺伝的アルゴリズムで育てる「お掃除ロボット」 その2 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その4 ~遺伝子の作成~ »