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

📄 modular.cpp

📁 本源代码是本人亲自编写的关于模糊神经网络模型的实现
💻 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 + -