Neural Networks
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define ARR_SZ 36//6x6ドットの文字
#define STD_SZ 9//学習回数
using namespace std;
struct nn
{
int bcd[ARR_SZ];// 入力データ(パーセプトロンの入力)
int a;//教師信号 1 = true / 0 = false
};
nn n[STD_SZ] = //学習データ STD_SZ個
{
{
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1, 1
},
{
0, 0, 1, 1, 0, 0,
0, 1, 0, 0, 1, 0,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 1, 0, 0, 1, 1,
1, 1, 0, 0, 1, 1, 1
},
{
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1, 1
},
{
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1,
1, 1, 0, 0, 0, 1,
1, 1, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1, 1
},
{
0, 0, 1, 1, 0, 0,
0, 1, 0, 0, 1, 0,
0, 1, 1, 1, 1, 0,
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1, 1
},
{
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0
},
{
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 0
},
{
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1, 0
},
{
1, 0, 1, 1, 0, 1,
1, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 1, 0
}
};
/*
TODO:
*/
int main()
{
int bcd[ARR_SZ] = { 0 };
int i, j, k,m, w;
int al = 0, X = 2;
bool edit = false;
while(1)
{
edit = false;
for( i = 0; i < STD_SZ; i++ )
{
al = 0;
for(j = 0; j<ARR_SZ; j++)
{
al += n[i].bcd[j] * bcd[j];
}
if(al < X)// OK
{
if( !n[i].a )//OKなのにNGだったら
{
X--;
for(j = 0; j<ARR_SZ; j++)
{
if( n[i].bcd[j] )
bcd[j]++;
}
edit = true;
}
}
else if(al >= X)// NG
{
if( n[i].a )// NGなのにOKだったら
{
X++;
for(j = 0; j<ARR_SZ; j++)
if( n[i].bcd[j] )
bcd[j]--;
edit = true;
}
}
}
if(edit == false) break;// 変更がなかったらブレーク
}
for(i=0; i<ARR_SZ; i+=6)
{
for(j=0; j<6; j++)
cout << bcd[i+j] << " ";
cout << endl;
}
while(1)
{
al = 0;
for( i = 0; i < ARR_SZ; i += 6 )
cin >> n[0].bcd[i] >> n[0].bcd[i+1] >> n[0].bcd[i+2] >> n[0].bcd[i+3] >> n[0].bcd[i+4] >> n[0].bcd[i+5];
for(j = 0; j<ARR_SZ; j++)
if( n[0].bcd[j] == 1 )
al += bcd[j];
cout << ">>>>> "<< ( (X - al > 0) ? "TRUE" : "NG") << endl;
}
}
/*
Sample output:
input:( A )
0 0 1 1 0 0
0 1 0 0 1 1
1 1 1 1 1 1
1 1 0 0 1 1
1 0 0 0 1 1
1 0 0 0 0 1
output:
>>>>>TRUE
*/