|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第402回 AYGON1 ニューロンの基礎 発行 2003年12月1日(月曜日) 発行数 約3200 {magclick} {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンはまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・このメールマガジンは、横60文字で作成しています。 また、インデントはすべて半角スペース4つで構成しています。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、まぐまぐさんのホームページでお願いします。 ・まぐまぐさんのバックナンバー(下欄参照)を活用して下さい。 ・ここは私の復習の場です。内容は約1ヶ月内外に私が勉強した 内容になっています。最新の技術があれば、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 少し、時間が空いてしまいました。 別に、ガンダムに忙しかったわけではありません。 実は。。。 まぁそれはともかく、前回の回答について1点訂正があります。 秋の夜長にギレンの野望を楽しんでいたのですが(やっぱり ガンダムをやっていました^^)、そのときに解答が間違っていた ことに気がつきました。 第1問とその回答を再掲します。 /*========================================================*/ 第1問 行動可能範囲計算についての問題です。 以下の関数をご覧ください。 void m( int x, int y, int p ) { b[ x ][ y ] = p; p -= l[ x ][ y ]; if( p < 0 ) return; if( y > MIN && b[ x ][ y - 1 ] < p ) m( x, y - 1, p ); if( y < MAX && b[ x ][ y + 1 ] < p ) m( x, y + 1, p ); if( x > MIN && b[ x - 1 ][ y ] < p ) m( x - 1, y, p ); if( x < MAX && b[ x + 1 ][ y ] < p ) m( x + 1, y, p ); } ご存知、シミュレーションゲームにて、ユニットの行動可能範囲 を計算する関数です。 b は行動可能範囲と最短経路を記録する2次元配列です。 l は行動に際しての進入ロスを示す2次元配列です。 MIN とMAX は座標が取りうる最小と最大をあらわすマクロです。 さて、ここで問題です。 この関数は、方眼状のマップについての行動可能範囲を計算する ものです。 しかし、「機動戦士ガンダムギレンの野望」でのマップは六角形 であり、この関数を直接使うことはできません。 そこで、この関数を六角形状のマップでも使えるように改造して ください。 /*========================================================*/ void m( int x, int y, int p ) { b[ x ][ y ] = p; p -= l[ x ][ y ]; if( p < 0 ) return; if( y > MIN && b[ x ][ y - 1 ] < p ) m( x, y - 1, p ); if( y < MAX && b[ x ][ y + 1 ] < p ) m( x, y + 1, p ); if( x > MIN && b[ x - 1 ][ y ] < p ) m( x - 1, y, p ); if( x < MAX && b[ x + 1 ][ y ] < p ) m( x + 1, y, p ); if( x > MIN && y < MAX && b[x-1][y+1]<p ) m( x-1,y+1,p); if( x < MAX && y < MAX && b[x+1][y+1]<p ) m( x+1,y+1,p); } これでいい、はずです。2行追加されただけですね。 六角形のマップは、実は方眼状のマップの奇数列を半マス下に ずらしただけなのです。 方眼のマップ 0 1 2 3 4 5 6 7 8 6角形のマップ 0 2 1 3 5 4 6 8 7 という感じです。 4番のマスに注目してください。 上下左右に動いた場合、1,7,3,5に移動します。 これは6角形の場合でも同じです。 さらに6角形の場合は、6と8にも移動できます。 だから、上下左右に対する分岐のところで、左下と右下のものを 追加するだけで、6角形に対応したことになります。 偶数列を半マス下げる場合、左上と右上になります。 もちろん同様に、奇数行を半マスずらすのであれば、上下左右に 左上と左下、偶数行ならば右上と右下への分岐を追加することに なりますね。 なお、2次元配列の形を変える必要はありません。 /*========================================================*/ というものだったのですが、 > 六角形のマップは、実は方眼状のマップの奇数列を半マス下に >ずらしただけなのです。 この部分が違います。奇数行を半マス右にずらした、という のが正しいです。 そして追加する分岐のルーチンは、右上と右下の2つというのが 正しい正解となります。 以上、お騒がせしました。 {magclick} /*========================================================*/ 今回のお題 << AYGON1 ニューロンの基礎 >> /*========================================================*/ さて、囲碁アルゴリズムでニューロンを使おうと思います。 ニューロンは、人工知能のアルゴリズムに出てくるプログラム なので、知らない人が多いかと思います。 そこで、簡単に基礎だけ紹介します。 /*========================================================*/ ニューロンというのは、もともとは神経細胞のことです。 人工知能のプログラムにおいて、神経細胞の動きをプログラムで 再現しようというアイデアがあり、そこで神経細胞の仕組みと動き をプログラムで表現したアルゴリズムそのものをニューロンと いうようになりました。 ニューロンは人工知能だけでなく、分散型の計算システムとして 利用されることもあるアルゴリズムです。 ちなみにスペルは neuron です。 ニューロ(neuro)ということもありますが、こちらは形容詞、 なのかな? ニューロコンピュータとかに使います。 でも後ろにネットワークをつけるときには、ニューラル ネットワークといいます。むずかしいですね。 /*========================================================*/ ということで、ニューロンをプログラムで扱うには、人間の 神経細胞がどのようになっているかを知っている必要があります。 神経細胞は、信号を伝達して、腕を動かしたり、熱いという 反応を脳に伝えたりします。 神経細胞が構成する信号伝達のネットワークを、ニューラル ネットワークといいます。 神経細胞にはたくさんの触手が生えています。 それが隣の神経細胞の触手と合体して、道が1本形成されます。 この触手が何本あるのかというと、もう、何本もあります。 触手の数は決まっていません。というか、触手自体が分裂したり 消滅することによって、増えたり減ったりします。 この触手の多さは、神経のネットワークの複雑さを示します。 そしてまれに、この複雑さが「頭のよさ」に使われます。 脳みその神経細胞が染色された写真がよくありますよね? あれ です。 /*========================================================*/ 自転車に乗る練習をすると、数時間である程度乗れるようになり ますよね? あの時、触手が異常なスピードで分裂して、運動神経を複雑に しているのです。 数時間でネットワークが改善されるほど、分裂のスピードは早い のです。 年を取ると低下しますが、年寄りでもこの能力はあります。 /*========================================================*/ 神経細胞には、信号入力用の触手と、信号出力用の触手が あります。 信号入力用の触手は、ほかの神経細胞の信号出力用の触手に つながっています。入力用の触手は、大体数万本あります。 入力用の触手は、つながっているほかの神経細胞の出力用の触手 の信号の強さによって、自身の信号の強さを決めます。 信号出力用の触手は、ほかの神経細胞の信号入力用の触手に つながっています。出力用の触手は、1本です。この1本の触手に 周辺の神経細胞の入力用の触手がわさわさと集中してきます。 神経細胞は、入力用の触手に反応を感じると、それに応じて 出力用の触手の信号を変えます。 入力に対する出力の信号の求め方は決まっていますが、神経細胞 自身がこれを修正することができます。 触手の分裂・消滅によるネットワークの改善と、出力信号の 求め方の修正することを、学習機能、といいます。 /*========================================================*/ ノイマン型コンピュータ、という名称を聞いたことがあるかと 思います。普通のコンピュータのことです。 1つのCPUがせっせと働くのがノイマン型コンピュータです。 ノイマン型コンピュータ以外の種類のコンピュータを、総称して 非ノイマン型コンピュータといいます。 ニューロコンピュータは神経細胞1つ1つをCPUまたはそれ相応 のものとして、コンピュータを1つ組み立てます。 だからニューロコンピュータは、ノイマン型コンピュータとは まったくの別物です。つまりニューロンを扱うには、普通の パソコンでは駄目なのです。 普通のパソコンでニューロンを扱う場合、ニューロコンピュータ のシミュレーションをやっている、という感じになります。 /*========================================================*/ さいごに /*========================================================*/ 参考文献 図解人工知能入門 戸内順一著 日本理工出版会 文法生成アルゴリズムが面白い本です。分からないけど。 でも学生のころに読んだ本なので、内容は覚えていません^^ {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は12月2日(火曜日)に、第403回を送ります。 お題は「AYGON2 ニューロンの定義」 さて、ニューロンの仕組みを定義しましょう。どのように使えば いいのか、を考えます。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されます。 このメールマガジンの内容に文面の引用はありません。 めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容は、転用、流用、宣伝、リンク、 ゲームキューブごとF-ZEROお買い上げ なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ まぐまぐアイディー 0000020674 まぐまぐバックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ 登録と解除 http://www.mag2.com/m/0000020674.htm ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp めーらっくす <<過去ログがタイトル別になっています>> http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F |