⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 654.cpp

📁 soft网络程序
💻 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 + -