/*** ネットワーク(二つのネットワーク+シナプス) ***/
/* * * * * カオティックサーチ 特徴表示 * * * * */
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <local/bgi.h>
#define U 100
#define PATTERN 4
#define SOUKITIME 5
#define No_IUnits 100
#define No_HUnits 10
#define No_OUnits 2
#define gaib 4.0
#define CTRL(x) ((x) - '@')
#define fout(x) (1/(1+ exp(-(x))))
static int levo[U],levn[U],kai,kx,ky,kx0,ky0,ko,ka,ki,kka,kki,
ku,ke,time,hi,jik,jyoutai,jyoutai2,N,nn,a,ikm,ikr,
t,data[4000];
static char st0[256],st1[256],st2[256],fname[512],st3[256],
par1[256];
static double alp,eps,sok,km,kr,rsnp,Rs,Gs,xnew[U],xold[U],
m[U],n[U],w[U][U],tokuchou1,tokuchou2,gosa,
gosa1,gosa2,data1[8000];
double out_hid[No_HUnits],out_out[No_OUnits];
double witoh[No_HUnits][No_IUnits],dwitoh[No_HUnits][No_IUnits];
double whtoo[No_OUnits][No_HUnits],dwhtoo[No_OUnits][No_HUnits];
double hbias[No_HUnits],dhbias[No_HUnits];
double obias[No_OUnits],dobias[No_OUnits];
double drand48();
FILE *fp;
double out_in[PATTERN][U] =
{{1,1,0,0,0,0,0,0,1,1,
1,1,1,0,0,0,0,1,1,1,
0,1,1,1,0,0,1,1,1,0,
0,0,1,1,1,1,1,1,0,0,
0,0,0,1,1,1,0,0,0,0,
0,0,0,0,1,1,1,0,0,0,
0,0,1,1,1,1,1,1,0,0,
0,1,1,1,0,0,1,1,1,0,
1,1,1,0,0,0,0,1,1,1,
1,1,0,0,0,0,0,0,1,1},
{0,0,0,0,0,1,0,0,0,0,
0,0,0,0,1,1,1,0,0,0,
0,0,0,0,1,1,1,0,0,0,
0,0,0,1,1,0,1,1,0,0,
0,0,0,1,1,0,1,1,0,0,
0,0,1,1,1,0,1,1,1,0,
0,0,1,1,0,0,0,1,1,0,
0,1,1,1,0,0,0,1,1,1,
0,1,1,1,1,1,1,1,1,1,
0,1,1,1,1,1,1,1,1,1},
{0,0,1,1,1,0,0,0,1,1,
0,1,1,1,1,1,1,1,1,1,
1,1,1,0,1,1,1,1,0,0,
1,1,0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,1,1,
0,0,1,1,1,1,0,1,1,1,
1,1,1,1,1,1,1,1,1,0,
1,1,0,0,0,1,1,1,0,0,
0,0,0,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,1,0,0,
0,0,1,1,0,0,1,1,0,0,
0,0,1,1,1,1,1,1,0,0,
0,0,1,1,1,1,1,1,0,0,
0,0,1,1,1,1,1,1,0,0,
0,1,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,1,1,
0,0,0,1,1,1,1,0,0,0,
0,0,0,0,1,1,0,0,0,0,
0,0,0,0,0,1,0,0,0,0}};
main(argc,argv)
int argc;
char *argv[];
{
int i,j,fin,*gd,*gm;
sok = 0.25;
alp = 10.0;
eps = 0.015;
hi = 1;
Gs = 0.5;
Rs = 0.4;
N = 10;
jyoutai = 4;
sprintf(fname,"fnetwork.dat");
printf("\n%s",fname);
fp = fopen(fname,"w");
if (fp == NULL){
fprintf(stderr,"error\n");
exit(1);
}
fwrite(&N,sizeof(int),1,fp);
soukan();
backpro_ini();
for(ikm = 1; ikm < N; ikm++){
km = (double)ikm / N;
for(ikr = 1; ikr < N; ikr++){
kr = (double)ikr / N;
for(jyoutai2 = 0; jyoutai2 < 4; jyoutai2++){
wariate(jyoutai2);
for(nn = 0; nn < N ; nn++){
shoki();
t = 0;
for(kai = 0; kai < 2000 ; kai++){
ryoushika();
if (kai != 0)
hi = hikaku();
if (hi == 0)
time++;
else
time=0;
for (i = 0; i < U; i++)
levn[i] = levo[i];
tokuchou_output();
if (t > 0)
break;
for(i = 0; i < U; i++)
neuro(i);
}
printf(" ikm=%d ikr=%d jyou=%d nn=%d t=%d\n"
,ikm,ikr,jyoutai2,nn,t);
data[ikm*400+ikr*40+jyoutai2*10+nn] = t;
data1[ikm*400+ikr*40+jyoutai2*10+nn] = out_out[0];
data1[ikm*400+ikr*40+jyoutai2*10+nn+4000] = out_out[1];
}
}
}
}
fwrite(data, sizeof(int), 4000, fp);
fwrite(data1, sizeof(double), 8000, fp);
fclose(fp);
}
wariate(p)
int p;
{
tokuchou1 = 0.0;
tokuchou2 = 0.0;
if (p == 2 || p == 3)
tokuchou1 = 1.0;
if (p == 1 || p == 3)
tokuchou2 = 1.0;
}
ptnname(p)
int p;
{
if (p == 0){
sprintf(st0,"X");
}else if (p == 1){
sprintf(st0,"triangle");
}else if (p == 2){
sprintf(st0,"wave");
}else if (p == 3){
sprintf(st0,"star");
}else {
sprintf(st0,"random");
}
}
soukan() /* 相関学習 */
{
int i,j,k;
for(i = 0; i < PATTERN; i++){
for(j = 0; j < U; j++){
for(k = 0; k < U; k++){
w[j][k] += sok * (2*out_in[i][j] - 1)*(2*out_in[i][k] - 1);
}
}
}
}
shoki() /* 初期パターン作成 */
{
int i,r;
/* ランダムパターン作成 */
srand48(nn);
if (jyoutai == 4){
for(i = 0; i < U; i++){
if (drand48() < 0.5)
r=0;
else
r=1;
xold[i] = r;
xnew[i] = r;
m[i] = n[i] = 0;
}
}
else{ /* 各パターン作成 */
for(i = 0; i < U; i++){
xold[i] = 0.8 * 0.8 * out_in[jyoutai][i];
m[i] = n[i] = 0;
}
}
}
backpro_ini() /* バックプロパゲーションのしきい値、重みを読み込む */
{
int i,j;
FILE *fp;
double data[1032],data2[25];
for(i = 0; i < No_HUnits; i++)
out_hid[i] = 0;
for(i = 0; i < No_OUnits; i++)
out_out[i] = 0;
if((fp=fopen("backpro1.data","r")) == NULL){
puts("read [backpro1.data] open error !!");
fclose(fp);
return(-1);
}
if (fread(data,sizeof(double),1032,fp) != 1032){
puts("read backpro1.data open error !!");
fclose(fp);
return(-1);
}
for (i = 0 ; i < 1032 ; i++){
if (i<10)
hbias[i] = data[i];
if (i>=10 && i<1010){
j = i - 10;
witoh[j/100][j%100] = data[i];
}
if (i>=1010 && i<1012){
j = i - 1010;
obias[j] = data[i];
}
if (i>=1012){
j = i - 1012;
whtoo[j/10][j%10] = data[i];
}
}
fclose(fp);
}
ryoushika() /* 表示のため出力を量子化 */
{
int i;
for(i = 0; i < U; i++){
if(xold[i] < 0.1){
levo[i] = 0;
} else if(xold[i] < 0.25){
levo[i] = 1;
} else if(xold[i] < 0.5){
levo[i] = 2;
} else if(xold[i] < 0.75){
levo[i] = 3;
} else if(xold[i] < 0.90){
levo[i] = 4;
} else {
levo[i] = 5;
}
}
}
hikaku() /* 出力を前の出力と比較 */
{
int i;
for(i = 0; i < U; i++){
if(levo[i] != levn[i])
return(1);
}
return(0);
}
tokuchou_output() /* 特徴抽出 */
{
int i,j;
double q;
i=0;
for(j = 0; j < U; j++)
out_in[i][j] = xold[j];
forward_propagation(i);
gosa1 = tokuchou1 - out_out[0];
gosa2 = tokuchou2 - out_out[1];
gosa = sqrt(gosa1 * gosa1 + gosa2 * gosa2);
if(gosa > Gs)
rsnp = Rs;
else
rsnp = 1;
if (time == SOUKITIME){
kentou();
}
}
forward_propagation(p)
int p;
{
int i,j;
double sum;
for(i = 0; i < No_HUnits; i++){
sum = 0.0;
for(j = 0; j < No_IUnits; j++)
sum += witoh[i][j] * out_in[p][j];
out_hid[i]=fout(sum + hbias[i]);
}
for(i = 0; i < No_OUnits; i++){
sum = 0.0;
for(j = 0; j < No_HUnits; j++)
sum += whtoo[i][j] * out_hid[j];
out_out[i]=fout(sum + obias[i]);
}
}
neuro(i) /* ニューラルネットワーク */
int i;
{
int j;
/* カオスニューロン */
double kas = 0;
double kas1 = 0;
for(j = 0; j < U; j++){
kas += (rsnp * w[i][j] * xold[j]);
kas1 += (rsnp * w[i][j] * xnew[j]);
}
m[i] = kas + kas1 + km * m[i];
n[i] = -alp * xold[i] + kr * n[i] + gaib;
xold[i] = fout((m[i] + n[i]) / eps);
/* 普通のニューロン */
kas = 0;
kas1 = 0;
for(j = 0; j < U; j++){
kas += (rsnp * w[i][j] * xold[j]);
kas1 += (rsnp * w[i][j] * xnew[j]);
}
xnew[i] = fout((kas + kas1) / eps);
}
kentou() /* 見つかった時 */
{
int c;
t = kai - SOUKITIME;
printf(" Search!!");
printf(" access_time = %d",kai-SOUKITIME);
}