📄 654.cpp
字号:
// 654.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#include <iomanip.h>
#include <iostream.h>
#include <fstream.h>
#include <dos.h>
#define MAXPATS 20
#define MAXNEURONSIN 2
#define MAXNEURONSX 4
#define MAXNEURONSY 1
#define MAXEPOCHS 20000
#define ETAMIN 0.005
int Random(int N) {
int j;
j=(N*rand())/RAND_MAX;
return j;
}
class PATTERN {
friend class SOFM;
private:
double P[MAXPATS][MAXNEURONSIN];
int NumPatterns;
int SizeVector;
int Shuffle[MAXPATS];
public:
PATTERN();
void GetPatterns();
double Query(int,int);
double QueryR(int,int);
void ReShuffle(int N);
};
PATTERN::PATTERN(){
for (int i=0; i<MAXPATS; i++)
Shuffle[i]=i;
}
void PATTERN::GetPatterns() {
FILE *fp;
int i,j;
double x;
if((fp=fopen("good.txt", "r")) == NULL)
return;
fscanf(fp,"%d",&NumPatterns);
fscanf(fp,"%d",&SizeVector);
for(i=0; i<NumPatterns; i++) {
for(j=0; j<SizeVector; j++) {
fscanf(fp,"%lg",&x);
P[i][j]=x;
}
}
fclose(fp);
}
void PATTERN::ReShuffle(int N) {
srand((unsigned)time(NULL));
int i,a1,a2,tmp;
for (i=0; i<N ;i++) {
a1=Random(NumPatterns);
a2=Random(NumPatterns);
tmp=Shuffle[a1];
Shuffle[a1]=Shuffle[a2];
Shuffle[a2]=tmp;
}
}
double PATTERN::Query(int pat,int j) {
return P[pat][j];
}
double PATTERN::QueryR(int pat,int j) {
return P[Shuffle[pat]][j];
}
struct iPair {
int x,y;
};
class SOFM {
private:
double U[MAXNEURONSIN][MAXNEURONSX][MAXNEURONSY];
double W[MAXNEURONSIN][MAXNEURONSX][MAXNEURONSY];
int Count[MAXNEURONSX][MAXNEURONSY];
int WW[MAXPATS][MAXNEURONSX][MAXNEURONSY];
double Yin[MAXNEURONSIN];
int YinSize;
iPair YoutSize;
int R,epoch,StochFlg;
double eta,delta_eta,Erosion;
PATTERN *Pattern;
void LoadInLayer(int);
double EucNorm(int, int);
iPair FindWinner();
void Train(iPair);
void AdaptParms();
public:
SOFM();
void SetPattern(PATTERN *);
void SetParms(int, int, double);
void RunTrn();
};
SOFM::SOFM(){
Erosion=0.0;
StochFlg=1;
}
void SOFM::SetPattern(PATTERN *p) {
Pattern=p;
YinSize=p->SizeVector;
}
void SOFM::SetParms(int X, int Y, double LR){
YoutSize.x=X;
YoutSize.y=Y;
R=3;
//R=5;
eta=LR;
delta_eta=0.005;
for (int ix=0; ix<X; ix++) {
for (int iy=0; iy<Y; iy++) {
for (int k=0; k<YinSize; k++) {
W[k][ix][iy]= (double)rand()/(10.0 * (double)RAND_MAX);
}
}
}
}
void SOFM::LoadInLayer(int P){
for (int i=0; i<YinSize; i++){
if (StochFlg){
Yin[i]=Pattern->QueryR(P,i);
}
else {
Yin[i]=Pattern->Query(P,i);
}
}
}
void SOFM::AdaptParms(){
Erosion+=0.008;
if (Erosion>=1.0) {
Erosion=0.0;
if (R>0)
R--;
// printf("New neighborhood. Radius=%d", R);
}
if (epoch<500) {
eta=eta-delta_eta/10.0;
}
else {
eta=eta-delta_eta;
}
if (eta<ETAMIN)
eta=ETAMIN;
}
double SOFM::EucNorm(int x, int y){
double dist=0.0;
for (int i=0; i<YinSize;i++)
dist+=(W[i][x][y]-Yin[i])*(W[i][x][y]-Yin[i]);
dist=sqrt(dist);
return dist;
}
iPair SOFM::FindWinner(){
int ix,iy;
double d,best;
iPair Winner;
best=9.9e+99;
Winner.x=-1;
Winner.y=-1;
for (ix=0; ix<YoutSize.x; ix++){
for (iy=0; iy<YoutSize.y; iy++){
d=EucNorm(ix,iy);
if (d<best) {
best=d;
Winner.x=ix;
Winner.y=iy;
}
}
}
return Winner;
}
void SOFM::Train(iPair Winner){
int ix,iy,k;
for (ix=Winner.x-R; ix<=Winner.x+R; ix++){
if ((ix>=0) && (ix<YoutSize.x)){
for (iy=Winner.y-R; iy<=Winner.y+R; iy++){
if ((iy>=0) && (iy<YoutSize.y)) {
for (k=0; k<YinSize; k++){
W[k][ix][iy]=W[k][ix][iy]+eta*(Yin[k]-W[k][ix][iy]);
}
}
}
}
}
}
void SOFM::RunTrn(){
int i,j,k,np,ix,iy,tmp;
double Center[MAXNEURONSIN],Pat[MAXPATS][MAXNEURONSIN];
ofstream fout;
fout.open("1234567890.txt",ios::app|ios::out);
iPair Winner;
epoch=0;
np=Pattern->NumPatterns;
double minn=9999.0;
while ((epoch<=MAXEPOCHS)&&(minn>=0.0001)){
for (ix=0; ix<YoutSize.x; ix++) {
for (iy=0; iy<YoutSize.y; iy++) {
for (k=0; k<YinSize; k++)
U[k][ix][iy]=W[k][ix][iy];
}
}
for (i=0; i<np; i++){
LoadInLayer(i);
Winner=FindWinner();
Train(Winner);
}
double dis=0.0;
for (ix=0; ix<YoutSize.x; ix++) {
for (iy=0; iy<YoutSize.y; iy++) {
dis=0.0;
for (k=0; k<YinSize; k++)
dis+=(U[k][ix][iy]-W[k][ix][iy])*(U[k][ix][iy]-W[k][ix][iy]);
dis+=sqrt(dis);
}
}
printf(" %6d",epoch);
printf(" %f\n",minn);
if (dis<minn){
minn=dis;
// tmp=0;
for (i=0; i<MAXNEURONSX; i++) {
for (j=0; j<MAXNEURONSY; j++)
Count[i][j]=0;
}
for (i=0; i<MAXPATS; i++) {
for (j=0; j<MAXNEURONSX; j++) {
for (k=0; k<MAXNEURONSY; k++)
WW[i][j][k]=0;
}
}
for (i=0; i<np; i++){
StochFlg=0;
LoadInLayer(i);
Winner=FindWinner();
WW[Count[Winner.x][Winner.y]][Winner.x][Winner.y]=i;
Count[Winner.x][Winner.y]++;
}
for (ix=0; ix<YoutSize.x; ix++) {
for (iy=0; iy<YoutSize.y; iy++) {
/*
fout<<setw(10)<<setiosflags(ios::right)<<"Soft:";
for (k=0; k<YinSize; k++){
if(fabs(W[k][ix][iy])<0.000000001)
W[k][ix][iy]=0.0;
fout<<setw(18)<<setiosflags(ios::right)<<W[k][ix][iy];
}
fout<<endl;
*/
// fout<<setw(10)<<setiosflags(ios::right)<<"Center:";
for (k=0; k<YinSize; k++){
double x0=0;
for (j=0; j<Count[ix][iy]; j++)
x0+=Pattern->Query(WW[j][ix][iy],k)/Count[ix][iy];
Center[k]=x0;
}
// fout<<endl;
// fout<<setw(10)<<setiosflags(ios::right)<<"Patterns:";
for (k=0; k<YinSize; k++){
double x1=Pattern->Query(WW[0][ix][iy],k);
if(fabs(x1)<0.00000000001)
x1=0.0;
// fout<<setw(18)<<setiosflags(ios::right)<<x1;
Pat[0][k]=x1;
}
// fout<<endl;
for (j=1; j<Count[ix][iy]; j++)
{
for (k=0; k<YinSize; k++){
if(k==0){
double x2=Pattern->Query(WW[j][ix][iy],k);
if(fabs(x2)<0.000000001)
x2=0.0;
// fout<<setw(28)<<setiosflags(ios::right)<<x2;
Pat[j][k]=x2;
}
else{
double x3=Pattern->Query(WW[j][ix][iy],k);
if(fabs(x3)<0.000000001)
x3=0.0;
// fout<<setw(18)<<setiosflags(ios::right)<<x3;
Pat[j][k]=x3;
}
}
// fout<<endl;
}
double x4=0.0;
for (j=0; j<Count[ix][iy]; j++)
for (k=0; k<YinSize; k++){
x4+=(Pat[j][k]-Center[k])*(Pat[j][k]-Center[k]);
}
// fout<<setw(10)<<setiosflags(ios::right)<<"Radii:";
//////////////////// fout<<setw(18)<<setiosflags(ios::right)<<x4/Count[ix][iy]<<endl;
// tmp+=Count[ix][iy];
// fout<<endl;
}
// fout<<endl;
}
// fout<<setw(18)<<setiosflags(ios::right)<<tmp<<endl;
////////////////// fout<<"////////////////////////////////////////"<<endl;
}
StochFlg=1;
epoch++;
if (StochFlg)
Pattern->ReShuffle(np);
AdaptParms();
}
for (ix=0; ix<YoutSize.x; ix++) {
for (iy=0; iy<YoutSize.y; iy++) {
for (k=0; k<YinSize; k++)
U[k][ix][iy]=W[k][ix][iy];
}
}
for (i=0; i<np; i++){
LoadInLayer(i);
Winner=FindWinner();
Train(Winner);
}
double dis=0.0;
for (ix=0; ix<YoutSize.x; ix++) {
for (iy=0; iy<YoutSize.y; iy++) {
dis=0.0;
for (k=0; k<YinSize; k++)
dis+=(U[k][ix][iy]-W[k][ix][iy])*(U[k][ix][iy]-W[k][ix][iy]);
dis+=sqrt(dis);
}
}
printf(" %6d",epoch);
printf(" %f\n",minn);
for (i=0; i<MAXNEURONSX; i++) {
for (j=0; j<MAXNEURONSY; j++)
Count[i][j]=0;
}
for (i=0; i<MAXPATS; i++) {
for (j=0; j<MAXNEURONSX; j++) {
for (k=0; k<MAXNEURONSY; k++)
WW[i][j][k]=0;
}
}
for (i=0; i<np; i++){
StochFlg=0;
LoadInLayer(i);
Winner=FindWinner();
WW[Count[Winner.x][Winner.y]][Winner.x][Winner.y]=i;
Count[Winner.x][Winner.y]++;
}
fout<<"Times: ";
fout<<setw(10)<<setiosflags(ios::right)<<epoch<<endl;
for (ix=0; ix<YoutSize.x; ix++) {
for (iy=0; iy<YoutSize.y; iy++) {
/*
fout<<setw(10)<<setiosflags(ios::right)<<"Soft:";
for (k=0; k<YinSize; k++){
if(fabs(W[k][ix][iy])<0.000000001)
W[k][ix][iy]=0.0;
fout<<setw(18)<<setiosflags(ios::right)<<W[k][ix][iy];
}
fout<<endl;
*/
fout<<"Center "<<ix+1<<":";
for (k=0; k<YinSize; k++){
double x0=0;
for (j=0; j<Count[ix][iy]; j++)
x0+=Pattern->Query(WW[j][ix][iy],k)/Count[ix][iy];
fout<<setw(10)<<setiosflags(ios::right)<<x0;
Center[k]=x0;
}
fout<<endl;
// fout<<setw(10)<<setiosflags(ios::right)<<"Patterns:";
for (k=0; k<YinSize; k++){
double x1=Pattern->Query(WW[0][ix][iy],k);
if(fabs(x1)<0.00000000001)
x1=0.0;
// fout<<setw(18)<<setiosflags(ios::right)<<x1;
Pat[0][k]=x1;
}
// fout<<endl;
for (j=1; j<Count[ix][iy]; j++)
{
for (k=0; k<YinSize; k++){
if(k==0){
double x2=Pattern->Query(WW[j][ix][iy],k);
if(fabs(x2)<0.000000001)
x2=0.0;
// fout<<setw(28)<<setiosflags(ios::right)<<x2;
Pat[j][k]=x2;
}
else{
double x3=Pattern->Query(WW[j][ix][iy],k);
if(fabs(x3)<0.000000001)
x3=0.0;
// fout<<setw(18)<<setiosflags(ios::right)<<x3;
Pat[j][k]=x3;
}
}
// fout<<endl;
}
double x4=0.0;
for (j=0; j<Count[ix][iy]; j++)
for (k=0; k<YinSize; k++){
x4+=(Pat[j][k]-Center[k])*(Pat[j][k]-Center[k]);
}
// fout<<setw(10)<<setiosflags(ios::right)<<"Radii:";
//////////////////// fout<<setw(18)<<setiosflags(ios::right)<<x4/Count[ix][iy]<<endl;
// tmp+=Count[ix][iy];
// fout<<endl;
}
// fout<<endl;
}
// fout<<setw(18)<<setiosflags(ios::right)<<tmp<<endl;
fout<<"////////////////////////////////////////"<<endl;
fout.close();
}
PATTERN InPat;
SOFM FMap;
void main(void)
{
InPat.GetPatterns();
FMap.SetPattern(&InPat);
FMap.SetParms(MAXNEURONSX,MAXNEURONSY,0.900);
FMap.RunTrn();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -