Nクイーン問題をニューラる2
今回は、ソースコードを公開すると言うことできれいで見やすくをもっとうに書きました(つもりです)。皆さんが、コンパイラを持ってはいらっしゃらないと思いましたので、LSI C-86 Ver 3.30 試食版でいけるように作りました。って乱数のとこしか変えていないけど。乱数の初期化にある値を入れないといけないのでちょっとつらいです。ボーランド系のコンパイラを使ってると種を入れない初期化ができるんですけどねえ。いい方法を知っておられる方おられたら、連絡ほしいです。
ヒステリシス−マッカロック・ピッツ(HMP)ニューロンとマキシマム(MAX)ニューロンの違いを見てみましょう。
N_Queen.c より
for ( y = 1; y <= NValue; y++ )
{
for ( x = 1; x <= NValue; x++ )
{
U[x][y] += dU( x, y );
if ( U[x][y] > UMAX )
U[x][y] = UMAX;
if ( U[x][y] < -UMAX )
U[x][y] = -UMAX;
if ( U[x][y] > UTP )
V[x][y] = 1;
if ( U[x][y] < LTP )
V[x][y] = 0;
}
}
N_QueenM.c より
for ( y = 1; y <= NValue; y++ )
{
/*------------------------------------------------*/
/*
横で一番Uの値が大きいものを探す
*/
/*------------------------------------------------*/
t = 1;
tU = U[t][y];
for ( x = 1; x <= NValue; x++ )
{
U[x][y] += dU( x, y );
if ( tU < U[x][y] )
{
t = x;
tU = U[x][y];
}
}
for ( x = 1; x <= NValue; x++ )
V[x][y] = 0;
if ( U[t][y] > 0 )
V[t][y] = 1;
}
HMPニューロンの方は、一つ一つdUを足した後にVを変化させていますが、MAXの方は、横一列のUを変化させた後にそれ列で一番Uの値が大きなニューロンを発火させ、それ以外は、発火させないようにします。つまり、横の列をひとかたまりとして一つのニューロンだと見なすのです。そうすることで、横の列は、Uがすべて0でない限りは、どれか一つだけが発火している状態を作ることができます。HMPとMAXとを比べるとどちらもさほど解まで到達する時間は、Nクイーン問題に関しては変わらない見たいです。もしかしたら、パラメータによっては、大きく変化することもあり得るかもしれませんが。
LSI C-86 Ver 3.30 試食版 (401KB)
DOS汎用のCコンパイラ。使い方のわからない方は、こちらへ。
ファイルの説明:
N_Queen.lzh
を解凍すると次のファイルが出てきます。実行ファイルは、DOS汎用でどこでも動くと思います。
N_Queen.c ヒステリシス−マッカロック・ピッツニューロンを用いたもの
N_Queen.exe 上記の実行形式ファイル
N_QueenM.c マキシマムニューロンを使ったもの
N_QueenM.exe 上記のファイルの実行形式ファイル
次回からは、ずっとテクニック集といったものになると思います。しかし、全部こなすと相当な力が付くと思います。ニューラル表現や動作式などは、ある程度簡単に作れるようになるのではないかと思います。次回は、クロスバ・スイッチ問題というのをやる予定です。これからは、ソースもいっしょに公開していきたいと思います。