📄 rbf.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 + -