📄 modular.cpp
字号:
#include "stdafx.h"
#include <math.h>
#include "Matrix.h"
#include "AllDef.h"
/////////////////////////////////////////////////////////////////
//门网络训练函数
/////////////////////////////////////////////////////////////////
//__declspec (dllexport)
void FCM (
int nSamplenum,
int xSamplenum,
int Rule_num,
float err,
CMatrix &Z_vector,
CMatrix &U_apt,
CMatrix &Sample
)
{
float U_SUM,Z1,Dik,Djk;
long int i,j,k,l, IT;
CMatrix I(Rule_num,1);
CMatrix OLD_U(nSamplenum,Rule_num);
for(i=0;i<nSamplenum;i++)
{
for(j=0,U_SUM=0.0;j<Rule_num-1;j++)
{
//*******************************************************
//注释:对样本的适合度矩阵U,满足条件:∑U{n,r}=1
//*******************************************************
U_apt.m_pTMatrix[i][j]=(rand()%int(1000-1000*U_SUM))/1000.0;
OLD_U.m_pTMatrix[i][j]=U_apt.m_pTMatrix[i][j];
U_SUM=U_SUM+U_apt.m_pTMatrix[i][j];
}
U_apt.m_pTMatrix[i][j]=1-U_SUM;
OLD_U.m_pTMatrix[i][j]=U_apt.m_pTMatrix[i][j];
}
IT=0;err=uERROR+1;
while((IT++<Cycle_num)&&(err>uERROR))
{
for(k=0;k<Rule_num;k++)
{
for(i=0;i<xSamplenum-1;i++)
{
for(j=0,Z1=0.0,Z_vector.m_pTMatrix[k][i]=0.0;j<nSamplenum;j++)
{
Z_vector.m_pTMatrix[k][i]=Z_vector.m_pTMatrix[k][i]+Sample.m_pTMatrix[j][i]*pow(U_apt.m_pTMatrix[j][k],F_Grade);
Z1=Z1+pow(U_apt.m_pTMatrix[j][k],F_Grade);
}
Z_vector.m_pTMatrix[k][i]=Z_vector.m_pTMatrix[k][i]/Z1;
}
}
for( k=0;k<Rule_num;k++)
{
for(i=0,I.m_pTMatrix[k][0]=-1;i<nSamplenum;i++)
{
for(j=0,Dik=0.0;j<xSamplenum-1;j++)
Dik=Dik+pow(Z_vector.m_pTMatrix[k][j]-Sample.m_pTMatrix[i][j],2);
if(Dik<uERROR)
I.m_pTMatrix[k][0]=i;
}
}
for(i=0;i<nSamplenum;i++)
for(j=0;j<Rule_num;j++)
{
if(I.m_pTMatrix[j][0]==-1)
{
for(k=0,U_apt.m_pTMatrix[i][j]=0.0;k<Rule_num;k++)
{
for(l=0,Djk=0.0,Dik=0.0;l<xSamplenum-1;l++)
{
Djk=Djk+(Z_vector.m_pTMatrix[k][l]-Sample.m_pTMatrix[i][l])*(Z_vector.m_pTMatrix[k][l]-Sample.m_pTMatrix[i][l]);
Dik=Dik+(Z_vector.m_pTMatrix[j][l]-Sample.m_pTMatrix[i][l])*(Z_vector.m_pTMatrix[j][l]-Sample.m_pTMatrix[i][l]);
}
U_apt.m_pTMatrix[i][j]=U_apt.m_pTMatrix[i][j]+pow(Dik/Djk,1/(F_Grade-1));
}
U_apt.m_pTMatrix[i][j]=1/U_apt.m_pTMatrix[i][j];
}
else if(I.m_pTMatrix[j][0]==i) U_apt.m_pTMatrix[i][j]=1.0;
else U_apt.m_pTMatrix[i][j]=0.0;
}
for(i=0,err=0.0;i<Rule_num;i++)
for(j=0;j<nSamplenum;j++)
{
err=err+fabs(OLD_U.m_pTMatrix[j][i]-U_apt.m_pTMatrix[j][i]);
OLD_U.m_pTMatrix[j][i]=U_apt.m_pTMatrix[j][i];
}
}
}
//////////////////////////////////////////////
// 专家网络训练函数 //
/////////////////////////////////////////////__declspec (dllexport)
void EXPERT_NET (
int nSamplenum,
int xSamplenum,
int Rule_num,
float err,
float Q,
CMatrix &B_quan,
CMatrix &Sample,
CMatrix &U_apt,
CMatrix &Ytrain
)
{
float o_err,result,sum,res;
long int i,j,k,IT;
for(i=0;i<xSamplenum;i++)
for(j=0;j<Rule_num;j++)
B_quan.m_pTMatrix[i][j]=fabs((float) (rand()%int(1000*Max_weight))/1000.0-Max_weight/2.0);
err=1000;IT=0;
while((IT++<Cycle_num)&&(err>nERROR))
{
for(i=0,err=0.0;i<nSamplenum;i++)
{
for(j=0,result=0.0;j<Rule_num;j++)
{
sum=B_quan.m_pTMatrix[0][j];
for(k=0,res=1.0;k<xSamplenum-1;k++)
{
sum=sum+Sample.m_pTMatrix[i][k]*B_quan.m_pTMatrix[k+1][j];
res=res+pow(Sample.m_pTMatrix[i][k],2);
}
result=result+sum*U_apt.m_pTMatrix[i][j];//y(*)
}
o_err=result-Sample.m_pTMatrix[i][xSamplenum-1];
err=err+fabs(o_err);//误差和*Sample.m_pTMatrix[i][k-1]
for(j=0;j<Rule_num;j++)
{
B_quan.m_pTMatrix[0][j]=B_quan.m_pTMatrix[0][j]-Study_rate*o_err*U_apt.m_pTMatrix[i][j]/res;
for(k=1;k<xSamplenum;k++)
B_quan.m_pTMatrix[k][j]=B_quan.m_pTMatrix[k][j]-Study_rate*o_err*U_apt.m_pTMatrix[i][j]*Sample.m_pTMatrix[i][k-1]/res;
}
}
}
Q=0.0;
for(i=0;i<nSamplenum;i++)
{
for(j=0,result=0.0;j<Rule_num;j++)
{
sum=B_quan.m_pTMatrix[0][j];
for(k=0,res=1;k<xSamplenum-1;k++)
{
sum=sum+Sample.m_pTMatrix[i][k]*B_quan.m_pTMatrix[k+1][j];
res=res+pow(Sample.m_pTMatrix[i][k],2);
}
result=result+sum*U_apt.m_pTMatrix[i][j];
}
Ytrain.m_pTMatrix[i][0]=result;
Q=Q+pow((Sample.m_pTMatrix[i][xSamplenum-1]-result),2);
}
Sample.error=err/nSamplenum;
Sample.Qresult=Q;
}
///////////////////////////////////////////////
// 隶属度生成函数 //
/////////////////////////////////////////////__declspec (dllexport)
void GATING_NET (
int nSamplenum,
int xSamplenum,
int Rule_num,
CMatrix &U_apt,
CMatrix &Sample,
CMatrix &Z_vector
)
{
float Djk,Dik;
int i,j,k,l;
for(i=0;i<nSamplenum;i++)
{
for(j=0;j<Rule_num;j++)
{
for(k=0,U_apt.m_pTMatrix[i][j]=0.0;k<Rule_num;k++)
{
for(l=0,Djk=0.0,Dik=0.0;l<xSamplenum-1;l++)
//for(l=0,Djk=0.0,Dik=0.0;l<xSamplenum;l++)
{
Djk=Djk+(Z_vector.m_pTMatrix[k][l]-Sample.m_pTMatrix[i][l])*(Z_vector.m_pTMatrix[k][l]-Sample.m_pTMatrix[i][l]);
Dik=Dik+(Z_vector.m_pTMatrix[j][l]-Sample.m_pTMatrix[i][l])*(Z_vector.m_pTMatrix[j][l]-Sample.m_pTMatrix[i][l]);
}
U_apt.m_pTMatrix[i][j]=U_apt.m_pTMatrix[i][j]+pow(Dik/Djk,1/(F_Grade-1));
}
U_apt.m_pTMatrix[i][j]=1/U_apt.m_pTMatrix[i][j];
}
}
}
///////////////////////////////////////////////////
// 预测函数 //__declspec (dllexport)
/////////////////////////////////////////////////
void PREDICT (
int nSamplenum,
int xSamplenum,
int Rule_num,
float err,
float Q,
CMatrix &Sample,
CMatrix &B_quan,
CMatrix &U_apt,
CMatrix &Ypredict
)
{
float sum;
int i,j,k;
for(i=0,Q=0.0,err=0.0;i<nSamplenum;i++)
{
for(j=0,Ypredict.m_pTMatrix[i][0]=0.0;j<Rule_num;j++)
{
sum=B_quan.m_pTMatrix[0][j];
for(k=0;k<xSamplenum-1;k++)
//for(k=0;k<xSamplenum;k++)
{
sum=sum+Sample.m_pTMatrix[i][k]*B_quan.m_pTMatrix[k+1][j];
}
Ypredict.m_pTMatrix[i][0]=Ypredict.m_pTMatrix[i][0]+sum*U_apt.m_pTMatrix[i][j];
}
Q=Q+pow(Ypredict.m_pTMatrix[i][0]-Sample.m_pTMatrix[i][xSamplenum-1],2)/2;
err=err+fabs(Ypredict.m_pTMatrix[i][0]-Sample.m_pTMatrix[i][xSamplenum-1]);
}
err=err/nSamplenum;
Sample.error=err;
Sample.Qresult=Q;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -