kyori
を
次のように改良した。ただし,変数は main()
の前で定義し,
初期化は for(kai = 0; kai < kai_max ; kai++)
のすぐ前におく
必要がある。
/* 改良に用いた変数 */ double keika_z[2]; /* 周期を判定するために距離を格納する配列 */ int kuri,kuri1,kuri2,kuri3[2],kuri4; /* シナプス前抑制を制御する変数 */
/* 初期化 */ keika_z[0]=keika_z[1]=0; kuri=0; kuri1=0; kuri2=0; kuri3[0]=kuri3[1]=0; kuri4=0;
/* サーチパターンと出力パターンの距離と抑制関数の計算 */ kyori() { int i; z=0; /* 距離計算 */ for(i=0; i<U; i++) z += fabs(x[i] - out_in[search][i]); /* 絶対値関数 */ z /= U; /* 距離の途中経過 */ keika_z[0]=keika_z[1]; keika_z[1]=z; /* 抑制関数の出力計算 */ kuri++; kuri4++; /* 周期が判定できない場合の制御 */ if(kuri>=300 || kuri4>=100){ rsnp=0.1; kuri=kuri4=0; kuri2=kuri1; kuri1++; return; } /* 通常の制御 */ if(z <= gs){ rsnp = 1; kuri2=0; kuri3[0]=kuri3[1]=0; return; } else rsnp = rcha; /* 周期がある場合の制御 */ if(kuri2>0){ rsnp=0.1; kuri2--; kuri3[1]++; return; } /* 距離が減少した場合の制御(0.5 未満) */ if(keika_z[1]<keika_z[0] && keika_z[1]<0.5){ rsnp=1; if(kuri3[0]==kuri3[1] && kuri3[1]!=0){ kuri1++; kuri2=kuri1; kuri4=0; } kuri3[0]=kuri3[1]; kuri3[1]=0; } else kuri3[1]++; }