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 + -
显示快捷键?