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

📄 rbf.cpp

📁 基于RBF的XOR问题
💻 CPP
字号:
#include "stdio.h"
#include "math.h"
#include "stdlib.h"
#include "iostream.h"
#define   dim          2  /****隐含层指针个数**/
/*#define   din          2*/  
class CRBF
{ public:
              CRBF(int m,int n);
	          ~CRBF();
       double Normcomputer(int m,int n);     /****** m 输入节点数,n隐含层节点数 ****/
	   void   Initialize(int m,int n,int Low,int High); /**** Low,Hight 为随机数产生的上下界**/
	   void   ComputerNetwork(int m,int n,double *p);  /** p为输入值指针**/
	   void   AdjustNetwork(int m,int n,double *t,double alfa,double beta,double gama);/**alfa,beta,gama 调整参数**/
	   void   printf();
 private:
	   double *weight;             /********网络输出权值********/
	   double *d;                  /********网络中心宽度********/
	   double (*c)[dim];           /********网络中心权值********/
	   double (*inputUnits);  /********网络输入节点指针****/
	   double *hintUnits;          /********网络隐藏层指针******/
	   double *output;             /********网络输出值**********/
	   double X;
};

/**********初始化参数****/
void CRBF::Initialize(int m,int n,int Low,int High)
{ int i,j;
   srand(4711);
   	for(i=0;i<m;i++)
	{for(j=0;j<n;j++)
	{c[i][j]=((double) rand() / RAND_MAX) * (High-Low) + Low;}
	}
    for(i=0;i<n;i++)
		*(weight+i)=((double) rand() / RAND_MAX) * (High-Low) + Low;
	for(i=0;i<n;i++)
		*(d+i)=((double) rand() / RAND_MAX) * (High-Low) + Low;
  
}

/**********网络产生*******/
 CRBF::CRBF(int m,int n)                   
 { weight=new double[n];
   d=new double[n];
   c=new double [m][dim];
   inputUnits=new double[m];
   hintUnits=new double[n];
   output= new double[m];
}
 CRBF::~CRBF()
 { delete []weight;
   delete []d;
   delete [dim]c;
   delete []inputUnits;
   delete []hintUnits;
   delete []output;
 }

/********网络输出计算****/

void CRBF::ComputerNetwork(int m,int n,double *p)                   
{int i,j;
 double b;
 *output=0;
for(j=0;j<m;j++)
 {*(inputUnits+j)=*(p+j);}
for (i=0;i<n;i++) 
 {  b=(1/exp(Normcomputer(m,i)*Normcomputer(m,i)/2*(*(d+i))*(*(d+i)))); 
	 *(hintUnits+i)=b; 
 }  
 for (i=0;i<n;i++)
 {*output=*output+(*hintUnits+i)*(*weight+i);
 }
 
}

/*******网络参数调整********/

void CRBF::AdjustNetwork(int m,int n,double *t,double alfa,double beta,double gama)  /*** t为目标值指针***/
{int i,j;
 for (i=0;i<n;i++)
 {*(weight+i)=*(weight+i)+alfa*(*t-*output)*(*hintUnits);}
 for (i=0;i<n;i++)
 {*(d+i)=*(d+i)+beta*(*t-*output)*(*(weight+i))*(*(hintUnits+i))*(Normcomputer(m,i)*Normcomputer(m,i))/(*(d+i))*((*d+i))*((*d+i));}
 for (i=0;i<n;i++)
 {for (j=0;j<m;j++)
 {  c[i][j]=*(*(c+i)+j)+gama*(*t-*output)*(*weight+i)*((inputUnits[j])-c[i][j]/(*(d+i))*((*d+i)));
 }
 }
}

/********矩阵范数计算********/

double CRBF::Normcomputer(int m,int i)
{ int j;
  double norm=0;
  /*for (k=0;k<m;k++)*/
  for (j=0;j<m;j++)
  {norm=norm+(*(inputUnits+j)-c[i][j])*(*(inputUnits+j)-c[i][j]);}
  X=sqrt(norm);
  return X;
}

void CRBF::printf()
{/*int i,j;
  for(i=0;i<2;i++)
  { cout<<d[i]<<endl;
    cout<<*(weight+i)<<endl;
  }
   for(i=0;i<2;i++)
   { for(j=0;j<2;j++)
		   cout<<c[i][j]<<endl;
   }*/
   cout<<*output<<endl;
}


void main()
{ int i,j;
  CRBF x(2,2);
  double *tp,*tarp;    /**目标直***************/
  double  ip[4][2]={{1,1},{1,0},{0,1},{0,0}};
  double  target[4]={0,1,1,0};
  tarp=(target+1);
  x.Initialize(2,2,-1,1);
  tp=&ip[1][0];
  for(j=0;j<4;j++)
  {tp=&ip[j][0];
   tarp=(target+j);
	for(i=0;i<90;i++)
	{  x.ComputerNetwork(2,2,tp);
     x.AdjustNetwork(2,2,tarp,0.02,0.03,0.05);
	}
    x.printf();
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -