#define M 2 /* S層のユニット数 */ #define N 2 /* A層のユニット数 */ #define P 4 /* 学習データ数 */ #define ETA 1.0 /* 学習係数 */ #define f(u) (u>=0? 1 : 0) /* 出力関数 */ /* 教師データの集合 */ struct { double ip[M], tp; } T[P]={ 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1 }; /* A層の設定 */ struct { double c[M], theta, x; } A[N]={ { 1.0, 0.0, 0.5 }, { 0.0, 1.0, 0.5 } }; /* R層の設定 */ struct { double w[N], theta, o; } R={ 0.0, 0.0, 0.0 }; #define BeginTable() printf(" t x1 x2 tp w1 w2 θ o tp-o w1' w2' θ'\n") #define EndTable() #define BeginRow() #define EndRow() printf("\n") #define PrintValue(v) printf("%5g", v) PrintPerceptron() { int j; for(j=0; j<M; j++) PrintValue(R.w[j]); PrintValue(R.theta); } main() { int i, j, p, t, changed; double u, delta; t=1; BeginTable(); do { changed=0; for(p=0; p<P; p++) { /* 入力データの表示 */ BeginRow(); PrintValue((double)t++); for(i=0; i<M; i++) PrintValue(T[p].ip[i]); PrintValue(T[p].tp); /* A層の出力の計算 */ for(j=0; j<N; j++) { u=0.0; for(i=0; i<M; i++) u+=A[j].c[i]*T[p].ip[i]; A[j].x=f(u-A[j].theta); } /* R層の出力の計算 */ u=0.0; for(j=0; j<N; j++) u+=R.w[j]*A[j].x; R.o=f(u-R.theta); PrintPerceptron(); /* 結合係数と閾値の修正 */ delta=(T[p].tp-R.o); if(delta!=0) { for(j=0; j<N; j++) R.w[j]+=ETA*delta*A[j].x; R.theta-=ETA*delta; changed=1; } /* 学習結果の表示 */ PrintValue(R.o); PrintValue(delta); PrintPerceptron(); EndRow(); } } while(changed); EndTable(); }