c++BP算法源程序3.doc_第1页
c++BP算法源程序3.doc_第2页
c++BP算法源程序3.doc_第3页
c++BP算法源程序3.doc_第4页
c++BP算法源程序3.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

下面是BPNET.CPP源文件#=BpNet.cpp : implementation file=/人工神经网络BP算法/1、动态改变学习速率/2、加入动量项/3、运用了Matcom4.5的矩阵运算库(可免费下载,头文件matlib.h),/ 方便矩阵运算,当然,也可自己写矩阵类/4、可暂停运算/5、可将网络以文件的形式保存、恢复/作者:同济大学材料学院 张纯禹/email:chunyu_79/QQ:53806186/欢迎不断改进!欢迎讨论其他实用的算法!/#include BpNet.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CBpNetIMPLEMENT_SERIAL( CBpNet, CObject, 1 )CBpNet:CBpNet()initM(MATCOM_VERSION);/启用矩阵运算库CBpNet:CBpNet()exitM();delete this;/ CBpNet message handlers/创建新网络void CBpNet:Create(Mm mInputData, Mm mTarget, int iInput, int iHidden, int iOutput) int i,j;mSampleInput=zeros(mInput.rows(),mInput.cols();mSampleTarget=zeros(mTarget.rows(),mTarget.cols();mSampleInput=mInputData;mSampleTarget=mTarget;this-iInput=iInput;this-iHidden=iHidden;this-iOutput=iOutput;/创建计算用的单个样本矩阵mInput=zeros(1,this-iInput);mHidden=zeros(1,this-iHidden);mOutput=zeros(1,this-iOutput);/创建权重矩阵,并赋初值mWeighti=zeros(this-iInput,this-iHidden);mWeighto=zeros(this-iHidden,this-iOutput); /赋初值for(i=1;iiInput;i+) for(j=1;jiHidden;j+) mWeighti.r(i,j)=randab(-1.0,1.0);for(i=1;iiHidden;i+) for(j=1;jiOutput;j+) mWeighto.r(i,j)=randab(-1.0,1.0);/创建阙值矩阵,并赋值mThresholdi=zeros(1,this-iHidden);for(i=1;iiHidden;i+) mThresholdi.r(i)=randab(-1.0,1.0);mThresholdo=zeros(1,this-iOutput);for(i=1;iiOutput;i+) mThresholdo.r(i)=randab(-1.0,1.0);/创建权重变化矩阵mChangei=zeros(this-iInput,this-iHidden);mChangeo=zeros(this-iHidden,this-iOutput);mInputNormFactor=zeros(iInput,2);mTargetNormFactor=zeros(iOutput,2);/误差矩阵 mOutputDeltas=zeros(iOutput); mHiddenDeltas=zeros(iHidden);/学习速率赋值dblLearnRate1=0.5;dblLearnRate2=0.5;dblMomentumFactor=0.95;m_isOK=false;m_IsStop=false;dblMse=1.0e-6;/误差限dblError=1.0;lEpochs=0;/根据已有的网络进行预测Mm CBpNet:simulate(Mm mData)int i,j;Mm mResult;Mm data=zeros(mData.rows(),mData.cols();data=mData;if(mData.cols()!=iInput):MessageBox(NULL,输入数据变量个数错误!,输入数据变量个数错误!,MB_OK);return mResult;mResult=zeros(data.rows(),iOutput); /正规化数据for(i=1;i=data.rows();i+) for(j=1;j=data.cols();j+) data.r(i,j)=(data.r(i,j)-mInputNormFactor.r(j,1)/(mInputNormFactor.r(j,2)-mInputNormFactor.r(j,1);/计算 int iSample; Mm mInputdata,mHiddendata,mOutputdata; mInputdata=zeros(1,iInput); mHiddendata=zeros(1,iHidden); mOutputdata=zeros(1,iOutput); double sum=0.0; for(iSample=1;iSample=data.rows();iSample+) /输入层数据 for(i=1;i=iInput;i+) mInputdata.r(i)=data.r(iSample,i); /隐层数据 for(j=1;j=iHidden;j+) sum=0.0; for(i=1;i=iInput;i+) sum+=mInputdata.r(i)*mWeighti.r(i,j); sum-=mThresholdi.r(j); mHiddendata.r(j)=1.0/(1.0+exp(-sum); /输出数据 for(j=1;j=iOutput;j+) sum=0.0; for(i=1;i=iHidden;i+) sum+=mHiddendata.r(i)*mWeighto.r(i,j); sum-=mThresholdo.r(j); mOutputdata.r(j)=1.0/(1.0+exp(-sum); /转换 for(j=1;jdblMse&!m_IsStop) dblTotal=0.0; for(iSample=1;iSample1.04)/动态改变学习速率 dblLearnRate1*=0.7; dblLearnRate2*=0.7; else dblLearnRate1*=1.05; dblLearnRate2*=1.05; lEpochs+; dblError=dblTotal; :PeekMessage(&msg,NULL,0,0,PM_REMOVE); :DispatchMessage(&msg); msg.message=-1; :DispatchMessage(&msg);/这样可以消除屏闪和假死机if(dblError=dblMse)m_isOK=true;elsem_isOK=false;void CBpNet:stop()m_IsStop=true;double CBpNet:randab(double a, double b) /注意,如果应用矩阵库,头文件matlib.h对rand()函数重新定义,只产生(0,1)/之间的随机数return(b-a)*rand()+a);/将数据转化到(0,1)区间void CBpNet:normalize()int i,j;/输入数据范围mInputNormFactor=scope(mSampleInput);/目标数据范围mTargetNormFactor=scope(mSampleTarget);for(i=1;i=mSampleInput.rows();i+) for(j=1;j=mSampleInput.cols();j+) mSampleInput.r(i,j)=(mSampleInput.r(i,j)-mInputNormFactor.r(j,1)/(mInputNormFactor.r(j,2)-mInputNormFactor.r(j,1);for(i=1;i=mSampleTarget.rows();i+) for(j=1;j=mSampleTarget.cols();j+) mSampleTarget.r(i,j)=(mSampleTarget.r(i,j)-mTargetNormFactor.r(j,1)/(mTargetNormFactor.r(j,2)-mTargetNormFactor.r(j,1);/前向计算 void CBpNet:forward(int iSample)/根据第iSample个样本,前向计算 if(iSamplemSampleInput.rows() MessageBox(NULL,无此样本数据:索引出界!,无此样本数据:索引出界!,MB_OK); return; int i,j; double sum=0.0; /输入层数据 for(i=1;i=iInput;i+) mInput.r(i)=mSampleInput.r(iSample,i); /隐层数据 for(j=1;j=iHidden;j+) sum=0.0; for(i=1;i=iInput;i+) sum+=mInput.r(i)*mWeighti.r(i,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论