想起用プログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <iostream.h>
#define X 7
#define Y 7
#define N_num X*Y
#define E 0.015
#define All_pat 100
int A_num = 19;
int Pat_num = 52;
int Ler_num = 1;
int time;
int pat_num;
int a_num;
int pat[All_pat][N_num];
double w[N_num][N_num];
double out[N_num];
double outo[N_num];
double gaibu_in[N_num];
inline double lim(double x)
{
int a=1;
if( x < 0 ) a=-a;
return( a );
}
void read_pat()
{
int n_num,pat_num;
char p;
FILE *data_fp;
char data_fn[30]="",a[]="patt",b[]="_";
char c[2]="a";
for(pat_num=0;pat_num<Pat_num;pat_num++){
strcpy(data_fn,"patt");
if( islower(c[0]) != 0 ){
strcat(data_fn,"_");
}
strcat(data_fn,c);
if (c[0] ++ == 'z'){
c[0]='A';
}
strcat(data_fn,".dat");
data_fp = fopen(data_fn,"r");
for( n_num=0;n_num<N_num;){
if( (p =fgetc(data_fp)) != EOF){
if( p=='@' ){
pat[pat_num][n_num]=1;
n_num++;
}
if( p=='.' ){
pat[pat_num][n_num]=-1;
n_num++;
}
}
}
fclose(data_fp);
}
}
void input()
{
int n_num;
for(n_num=0;n_num<N_num;n_num++){
outo[n_num]=pat[pat_num][n_num];
}
}
void sougou()
{
int n_num;
int ton_num;
for(n_num=0;n_num<N_num;n_num++){
out[n_num]=0;
for(ton_num=0;ton_num<N_num;ton_num++)
out[n_num]+=w[n_num][ton_num]*outo[ton_num];
out[n_num]=lim(out[n_num]);
}
}
void load_w()
{
FILE *w_fp;
char fn[30];
char a[20];
strcpy(fn,"w");
sprintf(a,"%d",a_num);
strcat(fn,a);
strcat(fn,".dat");
w_fp = fopen(fn,"r");
fread(w,sizeof(double),N_num*N_num,w_fp);
fclose(w_fp);
}
main(int argc, char* argv[])
{
int i,h,f=0,t=19;
int ler_num;
int n_num;
int k;
char p='a';
char* argnam[] = {"a","f","t","pat"};
for(i=1;i<argc-1;i++){
if(argv[i][0] == '-'){
h=0;
do{
if(!strcmp(&(argv[i][1]),argnam[h]))
break;
h++;
}while(h<4);
switch(h){
case 0:
a_num = atoi(argv[++i]);
f = a_num;
t = a_num;
break;
case 1:
f = atoi(argv[++i]);
break;
case 2:
t = atoi(argv[++i]);
break;
case 3:
Pat_num = atoi(argv[++i]);
break;
default:
break;
}
}
}
read_pat();
for(pat_num=0;pat_num<Pat_num;pat_num++){
cout << p;
if (p++=='z'){
p='A';
}
}
cout << "\n";
for( a_num=f ; a_num<=t; a_num++){
h=0; //gakushu dekita kazu
load_w();
for(pat_num=0;pat_num<Pat_num;pat_num++){
input();
for( k=0;k<10;k++){
sougou();
for(i=0,n_num=0;n_num<N_num;n_num++){
if( out[n_num]!=outo[n_num] ){
i++;}
outo[n_num]=out[n_num];
}
if(i==0){
break;
cout << "asdf";}
}
for(i=0,n_num=0;n_num<N_num;n_num++){
if( out[n_num]!=pat[pat_num][n_num] ){
i++;}
}
if(i==0){
cout << "o";
h++;
}
else{
cout << ".";
}
}
cout << " " << h << " O.K." << a_num << "\n";
}
}
学習用プログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <iostream.h>
#define X 7
#define Y 7
#define N_num X*Y
#define Km 0.1
#define Kr 0.95
#define Ks 0.95
#define Al -2
#define E 0.015
#define All_pat 100
int A_num = 20;
int Pat_num = 52;
int Ler_num = 50;
int time;
int pat_num;
int a_num;
int pat[All_pat][N_num];
double w[N_num][N_num];
double eta[N_num],guz[N_num],zet[N_num];
double out[N_num];
double etao[N_num],guzo[N_num],zeto[N_num];
double outo[N_num];
double gaibu_in[N_num];
double delta=0.05;
inline double sig(double x)
{
if(x < -24) x=-24;
return( 2.0/(1.0+exp(-x/E))-1.0);
}
void input_pat()
{
int n_num,pat_num;
char p;
FILE *data_fp;
char data_fn[30]="";
char c[2]="a";
for(pat_num=0;pat_num<Pat_num;pat_num++){
strcpy(data_fn,"patt");
if( islower(c[0]) != 0 ){
strcat(data_fn,"_");
}
strcat(data_fn,c);
if (c[0]++=='z'){
c[0]='A';
}
strcat(data_fn,".dat");
data_fp = fopen(data_fn,"r");
for( n_num=0;n_num<N_num;){
if( (p =fgetc(data_fp)) != EOF){
if( p=='@' ){
pat[pat_num][n_num]=1;
n_num++;
}
if( p=='.' ){
pat[pat_num][n_num]=-1;
n_num++;
}
}
}
}
}
void gaibu()
{
int n_num;
for(n_num=0;n_num<N_num;n_num++){
gaibu_in[n_num]=2*pat[pat_num][n_num];
}
}
void sougou()
{
int n_num;
int ton_num;
for(n_num=0;n_num<N_num;n_num++){
eta[n_num]=0;
for(ton_num=0;ton_num<N_num;ton_num++)
eta[n_num]+=w[n_num][ton_num]*outo[ton_num];
eta[n_num] += Km * etao[n_num];
guz[n_num] = gaibu_in[n_num] + Ks * guzo[n_num];
zet[n_num] = Al * outo[n_num] + Kr * zeto[n_num];
out[n_num] = sig( eta[n_num] + guz[n_num] + zet[n_num] );
}
}
void save_w()
{
FILE *w_fp;
char fn[30];
char a[20];
strcpy(fn,"w");
sprintf(a,"%d",a_num);
strcat(fn,a);
strcat(fn,".dat");
w_fp = fopen(fn,"w");
fwrite(w,sizeof(double),N_num*N_num,w_fp);
fclose(w_fp);
}
void learn()
{
int n_num;
int ton_num=0;
float a,b;
for(n_num=0;n_num<N_num;n_num++){
a=(fabs(guz[n_num])+fabs(eta[n_num]+zet[n_num]));
b=fabs(guz[n_num]+eta[n_num]+zet[n_num]);
if( a > b ){
for(ton_num=0;ton_num<N_num;ton_num++){
if( n_num != ton_num){
if(guz[n_num]*outo[ton_num] > 0)
w[n_num][ton_num] += delta; // def delta = 0.05
else
w[n_num][ton_num] -= delta; // def delta = 0.05
}
}
}
}
}
main(int argc, char* argv[])
{
int ler_num;
int n_num;
int i,h;
char* argnam[] = {"a","pat","ler","d"};
for(i=1;i<argc-1;i++){
if(argv[i][0] == '-'){
h=0;
do{
if(!strcmp(&(argv[i][1]),argnam[h]))
break;
h++;
}while(h<4);
switch(h){
case 0:
A_num = atoi(argv[++i]);
break;
case 1:
Pat_num = atoi(argv[++i]);
break;
case 2:
Ler_num = atoi(argv[++i]);
break;
case 3:
delta = atof(argv[++i]);
break;
default:
break;
}
}
}
input_pat();
for(a_num=0;a_num<A_num;a_num++){
for(pat_num=0;pat_num<Pat_num;pat_num++){
for(ler_num=0;ler_num<Ler_num;ler_num++){
gaibu(); //cout << "ga \n";
sougou();//cout << "so \n";
learn(); //cout << "le \n";
for(n_num=0;n_num<N_num;n_num++){
zeto[n_num]=zet[n_num];
guzo[n_num]=guz[n_num];
etao[n_num]=eta[n_num];
outo[n_num]=out[n_num];
}
}
for(n_num=0;n_num<N_num;n_num++){
zeto[n_num]=0;
guzo[n_num]=0;
etao[n_num]=0;
outo[n_num]=0;
}
}
for(n_num=0;n_num<N_num;n_num++){
zeto[n_num]=0;
guzo[n_num]=0;
etao[n_num]=0;
outo[n_num]=0;
}
save_w();
}
}