#include <stdio.h>
#include <math.h>
#include <string.h>
#include <local/bgi.h>
#define Iunits 2 /* 各ユニットの個数 */
#define Hunits 30
#define Ounits 2
#define Eta 0.05
#define Alpha 0.2
#define Rlow -0.30
#define Rhigh 0.30
#define X_SYOKICHI 0.1
#define Y_SYOKICHI 0.1
#define A 1.4
#define B 0.3
#define fout(x) ( 1 / (1 + exp( -(x) ) ))
#define urand() ( (double)rand() / 0x7fffffffL
* (Rhigh - Rlow) + Rlow )
double wih[Hunits][Iunits]; /* 結合荷重(重み) */
double who[Ounits][Hunits];
double dwih[Hunits][Iunits]; /* 重みの変化量 */
double dwho[Ounits][Hunits];
double shikiih[Hunits]; /* しきい値 */
double shikiio[Ounits];
double dshikiih[Hunits]; /* しきい値の変化量 */
double dshikiio[Ounits];
double iout[Iunits]; /* 各層の出力 */
double hout[Hunits];
double oout[Ounits];
double tsignal[Ounits]; /* 教師信号 */
main(argc,argv)
int argc;
char *argv[];
{
FILE *fp;
long kaisuu;
long kaisuumax;
int i;
char name[64];
double dummy,error,serror;
double eta = Eta,
alpha = Alpha;
void foward_propagation();
void back_propagation();
void initialize();
void teach_signal();
if (argc != 2){
printf(" Usage : enon kaisuumax \n" );
exit(-1);
}
kaisuumax = atol(argv[1]);
sprintf(name,"KAISUU%ld_Eta%0.2f_Alpha%0.2f.data",
kaisuumax,eta,alpha);
fp = fopen(name,"w");
if (fp == NULL){
fprintf(stderr,"error\n");
exit(1);
}
initialize();
iout[0] = tsignal[0] = X_SYOKICHI;
iout[1] = tsignal[1] = Y_SYOKICHI;
error = serror = 2;
for ( kaisuu = 1;(kaisuu <= kaisuumax);kaisuu++ ){
teach_signal();
foward_propagation();
error = 0;
for (i = 0; i < Ounits; i++){
dummy = tsignal[i] - oout[i];
error += (dummy * dummy);
}
error *= 0.5;
serror = 0.4 * serror + error;
if (kaisuu % 10000 == 0){
printf( "\n%5d\n",kaisuu);
printf( " x(t) = %3.5f",iout[0]);
printf( " x(t+1) = %3.5f",oout[0]);
printf( " kyoushi = %3.5f",tsignal[0]);
printf( "\n y(t) = %3.5f",iout[1]);
printf( " y(t+1) = %3.5f",oout[1]);
printf( " kyoushi = %3.5f",tsignal[1]);
printf( "\nERROR = %5.10f",error);
}
back_propagation();
for (i = 0; i < Iunits; i++){
iout[i] = tsignal[i];
}
}
fwrite(tsignal,sizeof(double),Iunits,fp);
fwrite(wih,sizeof(double),Iunits * Hunits,fp);
fwrite(who,sizeof(double),Hunits * Ounits,fp);
fwrite(shikiih,sizeof(double),Hunits,fp);
fwrite(shikiio,sizeof(double),Ounits,fp);
fclose(fp);
printf("\nkaisuu = %d\n",kaisuu);
putchar('G'-'@');
/*
initgraph(&i,&i,"800x440");
while (!kbhit()){
foward_propagation();
teach_signal();
putpixel((int)(oout[0]*75)+200,-(int)(oout[1]*300)+200);
putpixel((int)(tsignal[0]*75)+500,-(int)(tsignal[1]*300)+200);
for (i = 0; i < Iunits; i++){
iout[i] = oout[i];
}
}*/
}
void initialize()
{
int i,j;
for (i = 0; i < Hunits; i++){
for (j = 0; j < Iunits; j++){
wih[i][j] = urand();
}
shikiih[i] = urand();
}
for (i = 0; i < Ounits; i++){
for (j = 0; j < Hunits; j++){
who[i][j] = urand();
}
shikiio[i] = urand();
}
}
void teach_signal()
{
double x, y;
x = tsignal[0];
y = tsignal[1];
tsignal[0] = y + 1 - A * x * x;
tsignal[1] = B * x;
}
void foward_propagation()
{
int i,j;
double sum;
for (i = 0; i < Hunits; i++){
sum = 0;
for (j = 0; j < Iunits; j++){
sum += wih[i][j] * iout[j];
}
hout[i] = fout(sum + shikiih[i]);
}
for (i = 0; i < Ounits; i++){
sum = 0;
for (j = 0; j < Hunits; j++){
sum += who[i][j] * hout[j];
}
oout[i] = sum + shikiio[i];
}
}
void back_propagation()
{
int i,j;
double dih[Hunits],dho[Ounits]; /* 学習信号 */
double sum;
for (i = 0; i < Ounits; i++){
dho[i] = (tsignal[i] - oout[i]);
}
for (i = 0; i < Hunits; i++){
for (sum = 0, j = 0; j < Ounits; j++){
dwho[j][i] = (Eta * dho[j] * hout[i]) + (Alpha * dwho[j][i]);
who[j][i] += dwho[j][i];
sum += (dho[j] * who[j][i]);
}
dih[i] = hout[i] * (1 - hout[i]) * sum;
}
for (i = 0; i < Ounits; i++){
dshikiio[i] = (Eta * dho[i]) + (Alpha * dshikiio[i]);
shikiio[i] += dshikiio[i];
}
for (i = 0; i < Iunits; i++){
for (j = 0; j < Hunits; j++){
dwih[j][i] = (Eta * dih[j] * iout[i]) + (Alpha * dwih[j][i]);
wih[j][i] += dwih[j][i];
}
}
for (i = 0; i < Hunits; i++){
dshikiih[i] = (Eta * dih[i]) + (Alpha * dshikiih[i]);
shikiih[i] += dshikiih[i];
}
}