|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第403回 AYGON2 ニューロンの定義 発行 2003年12月2日(火曜日) 発行数 約3200 {magclick} {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンはまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・このメールマガジンは、横60文字で作成しています。 また、インデントはすべて半角スペース4つで構成しています。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、まぐまぐさんのホームページでお願いします。 ・まぐまぐさんのバックナンバー(下欄参照)を活用して下さい。 ・ここは私の復習の場です。内容は約1ヶ月内外に私が勉強した 内容になっています。最新の技術があれば、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 先日、ガンダムエースの12月号がでましたよね。 ホワイトベースは現在、リマ。 リマ? ・・・ペルーの首都、だそうです。 ・・・・・・原作と道がずれてる・・・? {magclick} /*========================================================*/ 今回のお題 << AYGON2 ニューロンの定義 >> /*========================================================*/ 前回、ニューロンの基礎を紹介しました。 それを踏まえて、囲碁のアルゴリズムとしてどのように ニューロンを使おうか、ということについて考えて見ます。 /*========================================================*/ まずは目的から。 ニューロンを使うことによって、 「この形の時にはここに打つべきだ!」 という判断を行えることを目的とします。 簡単な図形判断ですね。 よって、ニューロンの入力は「現状の石の形」、出力は 「ここここ!」となります。 ニューロンの基礎に従い、入力はたくさん、出力は1つです。 /*========================================================*/ 1つのニューロンは盤面上の1目、としましょう。 盤面上は19*19=361目あります。つまりニューロンの 数は361個ということになります。 struct neuron_t neuron[ 19 ][ 19 ]; という感じですね。 1つのニューロンの中には、触手があります。とりあえず、 struct neuron_t { char blk[ 19 ][ 19 ]; char wht[ 19 ][ 19 ]; char sps[ 19 ][ 19 ]; }; という感じにしましょうか。 盤面上にある黒石と白石と空きの状態を読み取る、という感じ です。 入力用の触手が1つのニューロンに1083本ある、ということ になります。 1ニューロンあたり1083バイト、361ニューロン全体で 390963バイト、約400キロバイトですね。 これらの触手は、盤面上の石の状態を保持するテーブルに つながります。 ニューロンの基礎にて、入力用の触手ごとに、信号に対して反応 する強さが違う、という項目がありました。 このキャラの配列は、1083本の触手の、それぞれの反応の 強さを示します。 これによって、「おお、あそこが二間開きならここ打てここ!」 という反応ができるのではないでしょうか? /*========================================================*/ 先走って、プログラムを書いてみましょう。 int x = -1; // 打てポイント初期値 int y = -1; // 打てポイント初期値 int p = -1; // 最大パワー初期値 for( int i = 0; i < NUM; i++ ) { // 空きを探す盤面ループ for( int j = 0; j < NUM; j++ ) { // 空きを探す盤面ループ if( board[ i ][ j ] ) continue; // 盤面に石があれば無視 // この空き場所に打つ価値をニューロンに問いただす // int s = 0; // 打てパワー合計 for( int k = 0; k < NUM; k++ ) { // 盤面ループ for( int l = 0; l < NUM; l++ ) { // 盤面ループ if( board[ k ][ l ] == 0 ) { // 空きなら s += neuron[ i ][ j ].sps[ k ][ l ]; // 空きとして加算 } else if( board[ k ][ l ] < 0 ) { // 黒なら s += neuron[ i ][ j ].blk[ k ][ l ]; // 黒として加算 } else s += neuron[ i ][ j ].wht[ k ][ l ]; // 白として加算 } if( s > p ) { // このパワーが現在の最大パワーを越えるなら p = s, x = i, y = j; // 打てポイントと最大パワーを更新 } } } } こんな感じ? たのしみですねぇ。 ちなみに、上下左右反転と白黒反転の、合計8パターンを考慮 できるものにも改造できるはずです。楽しみですねぇ! /*========================================================*/ さいごに /*========================================================*/ 最近寒いですね。 そういえばこのメルマガ、いつの間にか5周年目となりました。 遅ればせながら、これからもよろしくお願い申し上げます。 ついでといっては何ですが、喪中ですので、この場を借りて 年末と新年のご挨拶とさせていただきます。 {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は12月3日(水曜日)に、第404回を送ります。 お題は「AYGON3 ニューロン構築の方法」 さて、ニューロンの仕組みを定義しました。が、どうやって 数値データを入れましょう? お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されます。 このメールマガジンの内容に文面の引用はありません。 めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容は、転用、流用、宣伝、リンク、 手入力 なんて大歓迎です。 {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 |