/* chaos3en 0.5 0.55 ? ? 0.4 7 */
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <local/bgi.h>
#define U 100
#define PATTERN 4
#define SOUKITIME 15
#define No_IUnits 100
#define No_HUnits 10
#define No_OUnits 2
#define r_No_IUnits 4
#define r_No_HUnits 3
#define r_No_OUnits 1
#define CTRL(x) ((x) - '@')
#define fout(x) (1/(1+ exp(-(x))))
char *datafilename1 = "backpro1.data";
char *datafilename2 = "backpro2.data";
static int levo[U],levn[U],kai,ko,ka,ki,kka,kki,ku,ke,jik,time,hi,jyoutai,
jyoutai2,page,retsu,gyou,outend;
static char par[256],tim[256],ptn[256],fname[500],size[256];
static double alp,eps,sok,km,kr,rsnp,rcha,xold[U],xold2[U],m[U],n[U],
w1[U][U],w2[U][U],tokuchou1,tokuchou2,gaib;
double drand48();
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 r_out_in[16][4],r_out_hid[r_No_HUnits],r_out_out[r_No_OUnits];
double r_witoh[r_No_HUnits][r_No_IUnits],r_dwitoh[r_No_HUnits][r_No_IUnits];
double r_whtoo[r_No_OUnits][r_No_HUnits],r_dwhtoo[r_No_OUnits][r_No_HUnits];
double r_hbias[r_No_HUnits],r_dhbias[r_No_HUnits];
double r_obias[r_No_OUnits],r_dobias[r_No_OUnits];
double out_in1[PATTERN+1][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}};
double out_in2[PATTERN][U] =
{{0,0,0,1,1,1,1,0,0,0,
0,1,1,1,1,1,1,1,1,0,
0,1,1,0,0,0,0,1,1,0,
1,1,0,0,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,1,1,
0,1,1,0,0,0,0,1,1,0,
0,1,1,1,1,1,1,1,1,0,
0,0,0,1,1,1,1,0,0,0},
{0,0,0,0,1,1,0,0,0,0,
0,0,0,1,1,1,1,0,0,0,
0,0,1,1,0,0,1,1,0,0,
0,0,1,1,0,0,1,1,0,0,
0,1,1,0,0,0,0,1,1,0,
0,1,1,0,0,0,0,1,1,0,
0,1,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,1,1,
1,1,0,0,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,0,0,
1,1,1,1,1,1,1,1,0,0,
1,1,0,0,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,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,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,1,0,0,
1,1,0,0,0,0,1,1,0,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,1,0,0,0,0}};
main(argc,argv)
int argc;
char *argv[];
{
int i, j, fin;
sok = 0.25;
alp = 10.0;
eps = 0.015;
km = 0.2;
kr = 0.9;
rcha = 0.5;
ko = 0;
gaib = 2.0;
gyou = 5;
if (argc != 7){
fprintf(stderr,"\n\n使用法:chaos?? <km> <kr> <初期値> <サーチ> <rcha> <列>\n");
fprintf(stderr," <初期値パターン> 0-バツ,1-三角,2-波,3-星.\n");
fprintf(stderr," <サーチパターン> 0-O ,1-A ,2-E ,3-J .\n\n");
exit(-1);
}
km = atof(argv[1]);
kr = atof(argv[2]);
jyoutai = atoi(argv[3]);
jyoutai2 = atoi(argv[4]);
rcha = atof(argv[5]);
retsu = atoi(argv[6]);
outend = retsu*gyou;
srand48(jyoutai);
wariate(jyoutai2);
sprintf(par,"km=%3.2f kr=%3.2f rc=%3.2f alp=%3.1f a=%3.2f eps=%4.3f search=>%s",km,kr,rcha,alp,gaib,eps,ptn);
sprintf(fname,"bitmap/chaos/e%2.0lf%2.0lf%d%d%d.xbm",km*100,kr*100,jyoutai,jyoutai2,page);
sprintf(size, "%dx%d", retsu*150,gyou*150+50);
initgraph(&i, &j, size);
settextfont("12x24");
soukan();
/* 初期値パターン設定 */
shoki();
backpro_ini();
for(kai = 0; kai < 3000 ; kai++){
/* 量子化 */
ryoushika();
/* 直前の出力と比較 */
hi = hikaku();
if (hi == 0)
time++;
else
time=0;
/* 画面出力 */
output(kai);
/* 特徴抽出 */
tokuchou_output();
if (jik == 1)
break;
for(i = 0; i < U; i++)
neuro(i);
for(i = 0; i < U; i++)
neuro2(i);
}
fin == getchar();
if (fin == 'p')
graph2xbm(fname);
closegraph();
beep();
exit();
}
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;
switch (p) {
case 0:
sprintf(ptn,"O");
break;
case 1:
sprintf(ptn,"A");
break;
case 2:
sprintf(ptn,"E");
break;
default:
sprintf(ptn,"J");
break;
}
}
soukan()
{
int i, j, k;
for (i = 0; i < PATTERN; i++){
for (j = 0; j < U; j++){
for (k = 0; k < U; k++){
w1[j][k] += sok * (2 * out_in1[i][j] - 1) * (2 * out_in1[i][k] - 1);
w2[j][k] += (2 * out_in2[i][j] - 1) * (2 * out_in1[i][k] - 1);
}
}
}
}
shoki()
{
int i,j;
if (jyoutai > 3){
for(i = 0; i < 10; i++){
for(j = 0; j < 10; j++){
if(drand48() < 0.5)
out_in1[PATTERN+1][i*10+j] = 0;
else
out_in1[PATTERN+1][i*10+j] = 1;
}
}
for(i = 0; i < U; i++){
xold[i] = 0.8 * 0.8 * out_in1[PATTERN+1][i];
xold2[i] = xold[i];
m[i] = n[i] = 0;
}
}
else{
for(i = 0; i < U; i++){
xold[i] = 0.8 * 0.8 * out_in1[jyoutai][i];
xold2[i] = xold[i];
m[i] = n[i] = 0;
}
}
}
backpro_ini()
{
char *s;
FILE *fp;
s = datafilename1;
if ((fp = fopen(datafilename1, "r")) == NULL){
fprintf(stderr, "% open error !!\n", datafilename1);
fclose(fp);
return(-1);
}
if (fread(hbias, sizeof(double), No_HUnits, fp) < No_HUnits) {
short_data:
fprintf(stderr, "%s is too short !!\n", s);
fclose(fp);
return(-1);
}
if (fread(witoh, sizeof(double), No_HUnits*No_IUnits, fp)
< No_HUnits*No_IUnits ) {
goto short_data;
}
if (fread(obias, sizeof(double), No_OUnits, fp) < No_OUnits) {
goto short_data;
}
if (fread(whtoo, sizeof(double), No_OUnits*No_HUnits, fp)
< No_OUnits*No_HUnits) {
goto short_data;
}
fclose(fp);
s = datafilename2;
if ((fp = fopen(datafilename2, "r")) == NULL){
fprintf(stderr, "% open error !!\n", datafilename2);
fclose(fp);
return(-1);
}
if ((fread(r_hbias, sizeof(double), r_No_HUnits, fp)) < r_No_HUnits) {
goto short_data;
}
if ((fread(r_witoh, sizeof(double), r_No_HUnits * r_No_IUnits, fp))
< r_No_HUnits * r_No_IUnits) {
goto short_data;
}
if ((fread(r_obias, sizeof(double), r_No_OUnits,fp)) < r_No_OUnits) {
goto short_data;
}
if ((fread(r_whtoo, sizeof(double), r_No_OUnits * r_No_HUnits, fp))
< r_No_OUnits * r_No_HUnits) {
goto short_data;
}
fclose(fp);
}
ryoushika()
{
int i;
for(i = 0; i < U; i++){
if(xold2[i] < 0.1){
levo[i] = 0;
} else if(xold2[i] < 0.25){
levo[i] = 1;
} else if(xold2[i] < 0.5){
levo[i] = 2;
} else if(xold2[i] < 0.75){
levo[i] = 3;
} else if(xold2[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);
}
output(kai)
unsigned int kai;
{
int i, j, cc;
if (ko == 0){
if (kai != 0){
cc = getchar();
if (cc == 'p'){
graph2xbm(fname);
page++;
sprintf(fname,"bitmap/chaos/d%2.0lf%2.0lf%d%d%d.xbm",km*100,kr*100,jyoutai,jyoutai2,page);
}else if (cc =='q'){
closegraph();
exit();
}
}
cleardevice();
if (kai == 0)
outtextxy(10,23,par);
}
sprintf(tim,"t=%u",kai);
ka = 10 + (ko % retsu) * 150;
ki = 50 + ((int)(ko / retsu)) *152;
outtextxy(ka,ki,tim);
for(i = 0; i < 10; i++){
for(j =0; j < 10; j++){
if(i==0 && j==0){
kka = ka;
kki = ki;
}
if(levo[10 * i + j] == 0){
ka = j * 11 - levo[10 * i + j] + 15 + (ko % retsu) * 150;
ki = i * 11 + 60 + ((int)(ko / retsu)) * 152;
putpixel(ka,ki,WHITE);
} else {
ka = j * 11 - levo[10 * i + j] + 15 + (ko % retsu) * 150;
ki = i * 11 - levo[10 * i + j] + 60 + ((int)(ko / retsu)) * 152;
ku = j * 11 + levo[10 * i + j] + 15 + (ko % retsu) * 150;
ke = i * 11 + levo[10 * i + j] + 60 + ((int)(ko / retsu)) * 152;
bar(ka,ki,ku,ke);
}
}
}
ko++;
for (i = 0; i < U; i++)
levn[i] = levo[i];
if (ko % outend == 0)
ko = 0;
}
tokuchou_output()
{
int i,j;
double q;
i=0;
for(j = 0; j < U; j++)
out_in1[i][j] = xold2[j];
forward_propagation(i);
r_out_in[0][0]=tokuchou1;
r_out_in[0][1]=tokuchou2;
r_out_in[0][2]=out_out[0];
r_out_in[0][3]=out_out[1];
r_forward_propagation(0);
q = r_out_out[0];
if (q < 0.4) { /* 0.5 */
rsnp = ((1 - rcha) * cos(q * M_PI * 2) + rcha + 1) / 2;
} else {
rsnp = rcha;
}
/*
if (r_out_out[0] < 0.2)
rsnp = 7;
printf("%d t1=%1.1lf t1'=%lf t2=%1.1lf t2'=%lf",kai,tokuchou1,out_out[0],tokuchou2,out_out[1]);
printf(" rsnp=%lf yokusei=%lf\n",rsnp,r_out_out[0]);
*/
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_in1[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]);
}
}
r_forward_propagation(p)
int p;
{
int i, j;
double sum;
for(i = 0; i < r_No_HUnits; i++) {
sum = 0.0;
for(j = 0; j < r_No_IUnits; j++)
sum += r_witoh[i][j] * r_out_in[p][j];
r_out_hid[i]=fout(sum + r_hbias[i]);
}
for(i = 0; i < r_No_OUnits; i++) {
sum = 0.0;
for(j = 0; j < r_No_HUnits; j++)
sum += r_whtoo[i][j] * r_out_hid[j];
r_out_out[i]=fout(sum + r_obias[i]);
}
}
neuro(i)
int i;
{
int j;
double kas = 0;
for(j = 0; j < U; j++)
kas += (rsnp * w1[i][j] * xold[j]);
m[i] = kas + km * m[i];
n[i] = -alp * xold[i] + kr * n[i] + gaib;
xold[i] = fout((m[i] + n[i]) / eps);
}
neuro2(i)
int i;
{
int j;
double kas = 0;
for(j = 0; j < U; j++)
kas += w2[i][j] * xold[j];
xold2[i] = fout(kas);
}
kentou()
{
int cc;
printf("Search!!\n");
printf("access_time = %d\n\n",kai-SOUKITIME);
outtextxy(kka+70,kki,"?");
cc = getchar();
if (cc == 'p')
graph2xbm(fname);
closegraph();
exit();
}
beep()
{
putchar(CTRL('G'));
}