bp_net.cpp

来自「故障诊断工作涉及的领域相当广泛」· C++ 代码 · 共 1,535 行 · 第 1/3 页

CPP
1,535
字号
// bp_net.cpp: implementation of the bp_net class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "richtest.h"
#include "bp_net.h"
#include "bpinfodlg.h"
#include "myplot_idl.h"
#include "bp_layer_dialog.h"
#include "bpnet_basic_info.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
void mwArray2VARIANT(VARIANT* var,const mwArray& in);
extern  Imyplot* iplot;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
double bag[1000];
void bp_layer::calt(mwArray&mwout)
{
//	double b[200];
//		memset(b,0,800);
	mwArray bag;
	for(int i=0;i<mwout.Size(2);i++)
		bag=horzcat(bag,mbar);
	mwArray oneone=ones(mbar.Size(1),mwout.Size(2));
	switch(type)
	{
		case sigmod:
			mwout=power(exp(-weight*mwout+bag)+oneone,-1);
		break;
		default:
			break;
	}
}
bp_layer::bp_layer()
{mwArray m0=mwArray(0);
 dedout=m0;
 dweight=m0;
 indata=m0;
 mbar=m0;
 outdata=m0;
 prembar=m0;
 preweight=m0;
 weight=m0;
 nnode=0;
 pbn=NULL;
 //bar=NULL;
 type=sigmod;
 dipan=CRect(-1,-1,-1,-1);
 frenew=FALSE;
 delta_slope=1;
// error=NULL;

};
bp_layer::bp_layer(unsigned int n)
{bp_layer();
pbn=NULL;
	nnode=n;
	if(n>0)
	pbn=new bp_node[n];
	
//	dedout=mwArray(0);;
 //dweight=mwArray(0);;
 //indata=mwArray(0);;
 //mbar=mwArray(0);;
// outdata=mwArray(0);;
 //prembar=mwArray(0);;
// preweight=mwArray(0);;
 //weight=mwArray(0);;
 //bar=NULL;
 delta_slope=1;
 type=sigmod;
 dipan=CRect(-1,-1,-1,-1);
 frenew=FALSE;
// error=NULL;
};
bp_layer::~bp_layer()
{
//	if(bar)
	//	delete[] bar;
	if(pbn!=NULL&&nnode>0)
		delete[] pbn;
//	if(error)
	//	delete[] error;
	

};
_declspec(dllexport) void bp_layer::operator=(bp_layer& in)
{	dedout=in.dedout;
	delta_slope=in.delta_slope;
	dipan=in.dipan;
	dweight=in.dweight;
	frenew=in.frenew;
	indata=in.indata;
	//is=in.is;
	mbar=in.mbar;
	nnode=in.nnode;
	//os=in.os;
	outdata=in.outdata;
	pbn=new bp_node[nnode];
//	bar=new double[nnode];
	for(unsigned int i=0;i<nnode;i++)
	{
		pbn[i]=in.pbn[i];
	//	bar[i]=in.bar[i];
	}
	prembar=in.prembar;
	type=in.type;
	weight=in.weight;

};
_declspec(dllexport) void operator <<(CArchive& ar,bp_layer& it)
{	
	ar<<it.nnode;
	for(unsigned int i=0;i<it.nnode;i++)
		ar<<it.pbn[i];
	ar<<(int)it.type;
//	it.os<<it.dedout;
//	it.os<<it.dweight;
	ar<<it.frenew;
	it.os<<it.indata;
	double bag[300];
	it.indata.ExtractData(bag);
	it.os<<it.mbar;
	it.os<<it.outdata;
	it.os<<it.prembar;
	it.os<<it.preweight;
	it.os<<it.weight;
	ar<<it.dipan;
	
}
  _declspec(dllexport) void operator >>(CArchive& ar,bp_layer& it)
{	int bag;
	ar>>it.nnode;
	if(it.nnode)
		it.pbn=new bp_node[it.nnode];
	for(unsigned int i=0;i<it.nnode;i++)
		ar>>it.pbn[i];
	ar>>bag;
	it.type=(bp_node_type)bag;
//	it.is>>it.dedout;
//	it.is>>it.dweight;
	ar>>it.frenew;
	it.is>>it.indata;
	it.is>>it.mbar;
	it.is>>it.outdata;
	it.is>>it.prembar;
	it.is>>it.preweight;
	it.is>>it.weight;
	ar>>it.dipan;
}
_declspec(dllexport) void bp_layer::Serialize(CArchive&  ar)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CObject::Serialize(ar);
if(ar.IsStoring())
 ar<<*this;
else
 ar>>*this;
}

bp_net::bp_net()
{	failuretype=NULL;
	func_type=declare;
	type=std;
	mwArray m0=mwArray(0);
	bempty=TRUE;
	lastbar=m0;
	lastin=m0;
	mdata=m0;
	mdout=m0;
	mwin=m0;
	mwout=m0;
	mwstdout=m0;
	//mx=m0;
	prelastbar=m0;
	preweightout=m0;
	weightout=m0;
	bvalid=FALSE;
	nin=0;
	nout=0;
	nsamp=0;
	nlayer=0;
	player=NULL;
	ndcnt=0;
	nscnt=0;
	nsdocnt=0;
	pvin=NULL;
	pvout=NULL;
	pvstdout=NULL;
	tterror=NULL;//输出层总体误差初值
	merror=NULL;
	stderror=0.0001;//缺省输出层标准误差
//	outerror=NULL;//输出层节点误差
	alpha=0.22;////缺省学习因子
	beta=0.11;////缺省冲量因子
	cnt=0;
	bsucceed=FALSE;
	btrained=FALSE;
	pdataout=NULL;
	ibag=NULL;
	frenew=FALSE;
	loopcnt=2000;
	//mx=mwArray(1);
}

bp_net::~bp_net()
{
if(player)
		delete[]  player;
	//pvin=NULL;	
	//pvstdout=NULL;
	if(tterror)
		delete[] tterror;
	if(merror)
		delete[] merror;
	if(ibag)
		delete[] ibag;
	if(pvout)
		delete[] pvout;
	if(pdataout)
		delete[] pdataout;	
	if(failuretype)
		delete[] failuretype;
//	if(outerror)
	//	delete[] outerror;
}

BOOL bp_net::create(bp_net_type net_type,unsigned int nin, unsigned int nout, unsigned int nlayer,bp_node_type type,double stderror,unsigned nbn[])
{	this->type=net_type;
	this->stderror=stderror;
	this->nin=nin;
	this->nout=nout;
	this->nlayer=nlayer;
	failuretype=new CString[nout];
	this->player=new bp_layer[nlayer];
	double r[100],c[100];
	r[1]=1;r[2]=2;
	mwArray it=mwArray(10,10,r,NULL,1)*2;
	it.ExtractData(c);
	memset(r,0,sizeof(double)*100);
	layin=bp_layer(nin);//初始化输入层
//	layin.bar=0;
	player->weight=rand(mwVarargin(int(nbn[0]),int(nin)));
	int l=player->weight.Size(1);
	int cl=player->weight.Size(2);
	//player->mbar=rand(int(nbn[0],1));
	//player->weight.ExtractData(r);	
	//memset(r,0,sizeof(double)*100);
	for(unsigned int i=0;i<nlayer;i++)//初始化隐含层及其权矩阵
	{
		if(i>0)
			(player+i)->weight=rand(mwVarargin(int(nbn[i]),int(nbn[i-1])));
			(player+i)->mbar=rand(mwVarargin(int(nbn[i]),1));
			(player+i)->prembar=(player+i)->mbar/100;
			(player+i)->preweight=(player+i)->weight/100;
			//(player+i)->mbar=rand(int(nbn[i]),1);
	//	(player+i)->weight.ExtractData(r);	
	//		memset(r,0,sizeof(double)*100);
	(player+i)->nnode=nbn[i];
	if(nbn[i]>0)
		(player+i)->pbn=new bp_node[nbn[i]];
		(player+i)->type=type;
	}
	//初始化输出层及其权矩阵
	weightout=rand(mwVarargin(int(nout),int(nbn[nlayer-1])));
	preweightout=weightout;
	lastbar=rand(int(nout),1);
	prelastbar=lastbar/100;
	layout=bp_layer(nout);
	layout.type=type;
	//layout.bar=0;
//	double xxx[]={1,2,3,4,5,6,7,8};
//	double yyy[]={1,1.41,1.7,2,2.3,2.45,2.65,2.83};
//	mwArray mx=mwArray(1,8,xxx);
//	mwArray my=mwArray(1,8,yyy);
//	VARIANT vx,vy;
//	mwArray2VARIANT(&vx,mx);
//	mwArray2VARIANT(&vy,my);
//	iplot->easyplot(vx,vy);
	bempty=FALSE;
	return TRUE;  
}
_declspec(dllexport) void operator <<(CArchive& ar,bp_net& it)
{	ar<<(unsigned int)it.func_type;
	ar<<it.bempty;
	ar<<(unsigned int)it.type;
	ar<<it.alpha;
	ar<<it.beta;
	ar<<it.bsucceed;
	ar<<it.btrained;
	ar<<it.bvalid;
	ar<<it.cnt;
	it.os<<it.dedlastin;
	it.os<<it.dweightout;
	it.os<<it.lastbar;
	it.os<<it.lastin;
	ar<<it.nin;
	ar<<it.nlayer;
	ar<<it.nout;
	for(unsigned int i=0;i<it.nout;i++)
		ar<<it.failuretype[i];
	ar<<it.layin.nnode;
	ar<<it.layin.dipan;
	for(i=0;i<it.nlayer;i++)//各个层的输出
	{	it.player[i].os=it.os;
		ar<<it.player[i];
	}
//	ar<<it.layout;//
	it.os<<it.mdata;//网络数据
	it.os<<it.mdout;
	//it.os<<it.merror;
	it.os<<it.mwin;
	it.os<<it.mwout;
	it.os<<it.mwstdout;
	//it.os<<it.mx;//	
	ar<<it.ndcnt;
	for(i=0;i<it.ndcnt;i++)
		ar<<it.pdata[i];
	ar<<it.nscnt;
	for(i=0;i<it.nscnt;i++)
		ar<<it.ibag[i];	
	ar<<it.nsdocnt;
	for(i=0;i<it.nsdocnt;i++)
		ar<<it.pvstdout[i];
	ar<<it.nsamp;
	//ar<<it.outerror;
	it.os<<it.prelastbar;
	it.os<<it.preweightout;
	ar<<it.stderror;
	for(i=0;i<it.nsamp;i++)
		ar<<it.tterror[i];
	ar<<it.theerror;
	it.os<<it.weightout;
	ar<<it.layout.nnode;
	ar<<it.layout.dipan;
}
  _declspec(dllexport) void operator >>(CArchive& ar,bp_net& it)
{	it.init();
  unsigned int bag;
  ar>>bag;
  it.func_type=(bp_net_function)bag;
	ar>>it.bempty;
	
	ar>>bag;
	it.type=(bp_net_type)bag;
	ar>>it.alpha;
	ar>>it.beta;
	ar>>it.bsucceed;
	ar>>it.btrained;
	ar>>it.bvalid;
	ar>>it.cnt;
	it.is>>it.dedlastin;
	it.is>>it.dweightout;
	it.is>>it.lastbar;
	it.is>>it.lastin;
	ar>>it.nin;
	ar>>it.nlayer;
	ar>>it.nout;
	if(it.nout)
		it.failuretype=new CString[it.nout];
	for(unsigned int i=0;i<it.nout;i++)
		ar>>it.failuretype[i];
	ar>>it.layin.nnode;
	it.layin=bp_layer(it.layin.nnode);
	ar>>it.layin.dipan;
	if(it.nlayer)
		it.player=new bp_layer[it.nlayer];//各个层的输出
	for(i=0;i<it.nlayer;i++)
	{	it.player[i].is=it.is;
		ar>>it.player[i];
	}
//	ar>>it.layout;//
	it.is>>it.mdata;//网络数据
	it.is>>it.mdout;
//	it.is>>it.merror;
	it.is>>it.mwin;
	it.is>>it.mwout;
	it.is>>it.mwstdout;
	//it.is>>it.mx;//	
	ar>>it.ndcnt;
	if(it.ndcnt)
		it.pdata=new double[it.ndcnt];
	for(i=0;i<it.ndcnt;i++)
		ar>>it.pdata[i];
	ar>>it.nscnt;
	if(it.nscnt)
		it.ibag=new double[it.nscnt];
	for(i=0;i<it.nscnt;i++)
		ar>>it.ibag[i];	
	ar>>it.nsdocnt;
	if(it.nsdocnt)
		it.pvstdout=new double[it.nsdocnt];
	for(i=0;i<it.nsdocnt;i++)
		ar>>it.pvstdout[i];
	ar>>it.nsamp;
	if(it.nsamp)
	{	it.tterror=new double[it.nsamp];
		it.merror=new mwArray[it.nsamp];
	}
	//ar>>it.outerror;
	it.is>>it.prelastbar;
	it.is>>it.preweightout;
	ar>>it.stderror;
	if(it.nsamp)
	it.tterror=new double[it.nsamp];
	for(i=0;i<it.nsamp;i++)
		ar>>it.tterror[i];
	ar>>it.theerror;
	it.is>>it.weightout;
	ar>>it.layout.nnode;
	it.layout=bp_layer(it.layout.nnode);
	ar>>it.layout.dipan;
}
_declspec(dllexport) void bp_net::Serialize(CArchive&  ar)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CObject::Serialize(ar);
if(ar.IsStoring())
 ar<<*this;
else
 ar>>*this;
}
double bp_net::error(unsigned int i)
{int index=i+1;
	double bag[100];
	int l,c;
	l=mwout.Size(1);
	c=mwout.Size(2);
	mwout.ExtractData(bag);	
	memset(bag,0,sizeof(double)*100);
	mwArray mbag=mwout-mwstdout(colon(),int(index));
	mbag.ExtractData(bag);
	memset(bag,0,sizeof(double)*100);
	mwArray error=sum(times(mbag,mbag)/2);//阵列乘法 
	error.ExtractData(bag);	
	memset(bag,0,sizeof(double)*100);
	double value=error.ExtractScalar(1);
	return value;
}
#undef rand;
BOOL bp_net::excersize()
{int cnt=0,cnt2=0,stage=0,it;//double step;;
double a0,b0,mine=10;
a0=alpha;b0=beta;
mx.Clear();
for(unsigned int j=0;j<nsamp;j++)	
					{	
						merror[j].Clear();
					}
for(int u=0;u<nsamp;u++)
tterror[u]=0;	
theerror=0;

BOOL first=TRUE;
if(bvalid)
	{if(type==std)
		{do{cnt++;
			cnt2++;
			bsucceed=TRUE;
			first=0;
			if(1)
			{//
									
					farward();	
					theerror=error();
					if(theerror<mine)
						mine=theerror;
					if(theerror>stderror)
						{
							bsucceed=FALSE;	
							backward();
						}
					else
							goto endp;
							
			}else
			{
				//for(int i=nsamp-1;i>=0;i--)
			//	{	
					for(unsigned int j=0;j<1;j++)				
					{		first=FALSE; 
					int i=rand();
					i=i-i/6*6;
							foward(i);
							if(j==0)
								theerror=tterror[i];
							tterror[i]=error(i);
							if(tterror[i]>stderror)
								{
								bsucceed=FALSE;
								backward(i);
								}
							else
							{
								for(int c=0;c<nsamp;c++)
								{if(c!=i)
									{
										foward(c);
										tterror[c]=error(c);
										do{if(tterror[c]>stderror)
											{
											 int i1=rand();
											 i1=i1-i1/6*6;
											 if(i!=i1)
											 {bsucceed=FALSE;
											  foward(i1);
											  backward(i1);
											  goto ggg;

⌨️ 快捷键说明

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