Next: この文書について ...
Up: 無題
Previous: 参考文献
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <local/bgi.h>
#define U 100
#define PATTERN 6
#define M 3
#define SOUKITIME 15
#define No_IUnits 100
#define No_HUnits 10
#define No_OUnits 2
#define r_No_IUnits 4
#define r_No_HUnits 4
#define r_No_OUnits 1
#define CTRL(x) ((x) - '@')
#define fout(x) (1 / (1 + exp(-(x))))
static int levo[U], levn[U],
kai, ko, ka, ki, kka, kki, ku, ke, jik, time, hi, jyoutai,
page, retsu, outend, compare;
static int hiritsu = 0, percent = 0, terms = 0;
static char par[256], tim[256], fname[256], size[256];
static double alp, eps, sok, km, kr, rcha, xold[U], xnew[U], m[U], n[U],
w[U][U],
gaib;
double out_hid[No_HUnits], out_out[No_OUnits];
double witoh[No_HUnits][No_IUnits], dwitoh[No_HUnits][No_IUnits];
double witoo[No_OUnits][No_HUnits], dwitoo[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_witoo[r_No_OUnits][r_No_HUnits], r_dwitoo[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 drand48();
double out_in[6][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},
{0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 1, 1, 1, 0, 1, 1,
0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
0, 0, 1, 1, 0, 1, 1, 0, 0, 0,
0, 0, 1, 1, 0, 1, 1, 0, 0, 0,
1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
1, 1, 0, 1, 1, 0, 0, 0, 0, 0,
1, 1, 0, 1, 1, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
1, 0, 0, 1, 0, 0, 1, 0, 0, 1,
1, 0, 0 ,1, 0, 0, 1, 0, 0, 1,
1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
1, 0, 0, 1, 0, 0, 1, 0, 0, 1,
1, 0, 0, 1, 0, 0, 1, 0, 0, 1,
1, 1, 1, 1, 0, 0, 1, 1, 1, 1},
};
int next(int);
void soukan(void);
void shoki(void);
void ryoushika(void);
void output(unsigned int);
void neuro(int);
void beep(void);
void srand48(int);
void hikaku(int);
int next(p)
int p;
{
if(((p + 1) % M) == 0)
return (p + 1 - M);
else return (p + 1);
}
void soukan()
{
int i, j, k;
for(j = 0; j < U; j++) {
for(k = 0; k < U; k++) {
w[j][k] = 0.0;
}
}
for(i = 0; i < PATTERN; i++) {
for(j = 0; j < U ; j++) {
for(k = 0; k < U ; k++) {
w[j][k] += sok * (2 * out_in[next(i)][j] - 1)
* (2 * out_in[i][k] - 1);
}
}
}
}
void shoki()
{
int i;
for(i = 0; i < U; i++){
if(jyoutai < 6){
xold[i] = 0.8 * 0.8 * out_in[jyoutai][i];}
else{
if (drand48() > 0.5) {xold[i] = 0.8 * 0.8 * 1.0 ;}
else {xold[i] = 0;}
}
m[i] = n[i] = 0.0;
}
}
void ryoushika()
{
int i;
for(i = 0; i < U; i++){
if(xold[i] < 0.1) {
levo[i] = 0;
} else if(xold[i] < 0.25) {
levo[i] = 1;
} else if(xold[i] < 0.5) {
levo[i] = 2;
} else if(xold[i] < 0.75) {
levo[i] = 3;
} else if(xold[i] < 0.9) {
levo[i] = 4;
} else {
levo[i] = 5;
}
}
}
void 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/cy%d%d.xbm",
jyoutai, page);
} else if(cc == 'q') {
closegraph();
exit(0);
}
}
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;
}
void neuro(i)
int i;
{
int j;
double kas = 0.0;
for(j = 0; j < U; j++)
kas += (rcha * w[i][j] * xold[j]);
m[i] = kas + km * m[i];
n[i] = -alp * xold[i] + kr * n[i] + gaib;
xnew[i] = fout((m[i] + n[i]) / eps);
}
void beep()
{
putchar(CTRL('G'));
}
void hikaku(compare)
{
int i,j;
percent = 0;
for(i = 0; i < U; i++){
if(levo[i] < 3){j = 0;}
else {j = 1;}
if(j == out_in[compare][i]){ ++percent; }}
}
void main(argc, argv)
int argc;
char *argv[];
{
int i, fin;
int *gd, *gm;
/* 条件コンパイル --1にすると、cycle.cfg から以下の定数を読み込む */
sok = 1.0;
alp = 10.0;
eps = 0.015;
km = 0.25;
kr = 0.9;
ko = 0;
gaib = 2.0;
rcha = 1.0/6;
retsu = 6;
outend = (5 * retsu);
terms = 0;
if(argc != 8) {
fprintf(stderr, "\n\n使用法 :cycle?? <初期パターン> <特徴パターン> <比率> <収束方法> <km> <kr> <sok>\n\n");
fprintf(stderr, "<パターン> 0-バツ、1-三角、2-波、3-星、4-鎖、5-花、6-ランダム(初期パターンのみ)\n\n");
fprintf(stderr, "<収束方法> 0-カオス脱出(km=kr=alp=0)、1-シナプス抑制(rcha=1)\n\n");
exit(-1);
}
jyoutai = atoi(argv[1]);
srand48(jyoutai);
compare = atoi(argv[2]);
hiritsu = atoi(argv[3]);
terms = atoi(argv[4]);
km = atof(argv[5]);
kr = atof(argv[6]);
sok = atof(argv[7]);
sprintf(par, "km%3.2f kr=%3.2f alp=%3.1f a=%3.2f eps=%4.3f",
km, kr, alp, gaib, eps);
sprintf(fname, "bitmap/cy%d%d.xbm",
jyoutai, page);
sprintf(size, "%dx785", retsu * 150);
initgraph(gd, gm, size);
settextfont("12x24");
soukan();
/* 初期値パターン設定 */
shoki();
for(kai = 0; kai < 3000; kai++){
if (percent > hiritsu)
{if (terms == 0){ km = kr = alp = 0.0;}
else { rcha = 1.0;}
}
/* 量子化 */
ryoushika();
/* 画面出力 */
output(kai);
/* 比較 */;
hikaku(compare);
/*特徴抽出 */
if(jik == 1)
break;
for(i = 0; i < U; i++)
neuro(i);
for(i = 0; i < U; i++)
xold[i] = xnew[i];
}
fin = getchar();
if(fin == 'p')
graph2xbm(fname);
closegraph();
beep();
}
Deguchi Toshinori
1997年03月04日 (火) 08時34分02秒 JST