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

📄 c++的bp算法源程序【转载】.htm

📁 C++的BP算法源程序.通过调试。大家可以参考一下。
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0080)http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&dname=DPJQ411&xpos=0&op=print -->
<HTML><HEAD><TITLE>C++的BP算法源程序【转载】</TITLE>
<STYLE type=text/css>BODY {
	FONT-SIZE: 12px; LINE-HEIGHT: 140%; FONT-FAMILY: 宋体
}
TD {
	FONT-SIZE: 12px; LINE-HEIGHT: 140%; FONT-FAMILY: 宋体
}
FONT {
	FONT-SIZE: 12px; LINE-HEIGHT: 140%; FONT-FAMILY: 宋体
}
</STYLE>

<META http-equiv=content-type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2722" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff leftMargin=5 topMargin=5 onload=window.print() 
marginwidth="5" marginheight="5">
<CENTER>
<TABLE cellSpacing=0 cellPadding=0 width=640 align=center border=0>
  <TBODY>
  <TR>
    <TD colSpan=2><IMG height=36 alt=君安工作室 
      src="C++的BP算法源程序【转载】.files/1091238464.gif" border=0> </TD></TR>
  <TR>
    <TD>当前位置: <A 
      href="http://junan.home.sunbo.net/index.php?xname=6EDQTV0">首页</A> &gt; <A 
      href="http://junan.home.sunbo.net/show_hdr.php?xname=6EDQTV0&amp;dname=DPJQ411&amp;xpos=0">C++的BP算法源程序【转载】</A> 
      &gt; print </TD>
    <TD vAlign=bottom align=right><A href="javascript:history.back()">返回</A> 
      <A href="javascript:window.print()">打印</A> </TD></TR>
  <TR>
    <TD colSpan=2>
      <TABLE cellSpacing=0 cellPadding=3 width="100%" border=0>
        <TBODY>
        <TR align=left bgColor=#edf0f5>
          <TD>
            <TABLE cellSpacing=0 cellPadding=0 width="95%" border=0>
              <TBODY>
              <TR>
                <TD align=middle><FONT 
                  style="FONT-SIZE: 18px"><B>C++的BP算法源程序【转载】</B></FONT></TD></TR>
              <TR>
                <TD align=right>时间: 2005-04-01 21:46:29 | [&lt;&lt;] <A 
                  title=下一篇 
                  href="http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&amp;dname=DPJQ411&amp;xpos=1">[&gt;&gt;]</A> 

                  <HR align=center width="100%" noShade SIZE=1>
                </TD></TR></TBODY></TABLE></TD></TR>
        <TR align=left bgColor=#edf0f5>
          <TD>
            <DIV class=readf>//C++的BP算法源程序 <BR><BR>#include "iostream.h" 
            <BR>#include "iomanip.h" <BR>#define N 20 //学习样本个数 <BR>#define IN 1 
            //输入层神经元数目 <BR>#define HN 8 //隐层神经元数目 <BR>#define ON 1 //输出层神经元数目 
            <BR>double P[IN]; //单个样本输入数据 <BR>double T[ON]; //单个样本教师数据 <BR>double 
            W[HN][IN]; //输入层至隐层权值 <BR>double V[ON][HN]; //隐层至输出层权值 
            <BR><BR><BR>double X[HN]; //隐层的输入 <BR>double Y[ON]; //输出层的输入 
            <BR>double H[HN]; //隐层的输出 <BR>double O[ON]; //输出层的输出 <BR>double 
            sita[HN]; //隐层的阈值 <BR>double gama[ON]; //输出层的阈值 <BR>double err_m[N]; 
            //第m个样本的总误差 <BR>double alpha; //输出层至隐层的学习效率 <BR>double beta; 
            //隐层至输入层学习效率 <BR>//定义一个放学习样本的结构 <BR>struct { <BR>double input[IN]; 
            <BR>double teach[ON]; <BR>}Study_Data[N][IN]; 
            <BR><BR>/////////////////////////// <BR>//初始化权、阈值子程序///// 
            <BR>/////////////////////////// <BR>initial() <BR>{ <BR>float sgn; 
            <BR>float rnd; <BR><BR><BR>int i,j; <BR>//隐层权、阈值初始化// <BR>{ 
            <BR>//sgn=pow((-1),random(100)); <BR>sgn=rand(); 
            <BR>rnd=sgn*(rand()%100); <BR>W[j]<I>= rnd/100;//隐层权值初始化。 <BR>} 
            <BR>//randomize(); <BR>{ <BR>//sgn=pow((-1),random(1000)); 
            <BR>sgn=rand(); <BR>rnd=sgn*(rand()%1000); <BR>sita[j]= 
            rnd/1000;//中间层阈值初始化 
            <BR>cout&lt;&lt;"sita"&lt;&lt;sita[j]&lt;&lt;endl; <BR>} 
            <BR>//输出层权、阈值初始化// <BR>//randomize(); <BR>for (int k=0;k&lt;ON;k++) 
            <BR>for (int j=0;j&lt;HN;j++) <BR>{ 
            <BR>//sgn=pow((-1),random(1000)); <BR><BR><BR>sgn=rand(); 
            <BR>rnd=sgn*(rand()%1000); <BR>V[k][j]=rnd/1000;//第m个样本输出层权值初始化 
            <BR>} <BR>//randomize(); <BR>{ <BR>//sgn=pow((-1),random(10)); 
            <BR>sgn=rand(); <BR>rnd=sgn*(rand()%10); 
            <BR>gama[k]=rnd/10;//输出层阈值初始化 <BR>cout&lt;&lt;"gama[k]"&lt;&lt;endl; 
            <BR>} <BR>return 1; <BR><BR>}//子程序initial()结束 
            <BR><BR><BR>//////////////////////////////// <BR>////第m个学习样本输入子程序/// 
            <BR>/////////////////////////////// <BR>input_P(int m) <BR>{ 
            <BR><BR><BR>for (int i=0;i&lt;IN;i++) 
            <BR>P<I>=Study_Data[m]-&gt;input<I>; <BR>//获得第m个样本的数据 
            <BR>//cout&lt;&lt;"第"&lt; //fprintf(fp,"第%d个样本的学习输入: 
            <BR>//P[%d]=%f\n",m,P<I>); <BR>return 1; <BR>}//子程序input_P(m)结束 
            <BR><BR>///////////////////////////// <BR>////第m个样本教师信号子程序// 
            <BR>///////////////////////////// <BR>input_T(int m) <BR>{ <BR>for 
            (int k=0;k&lt;m;k++) <BR>T[k]=Study_Data[m]-&gt;teach[k]; 
            <BR>//cout&lt;&lt;"第"&lt; 
            //fprintf(fp,"第%d个样本的教师信号:T[%d]=%f\n",m,T[k]); <BR>return 1; 
            <BR>}//子程序input_T(m)结束 <BR><BR>///////////////////////////////// 
            <BR>//隐层各单元输入、输出值子程序/// <BR>///////////////////////////////// 
            <BR><BR><BR>H_I_O(){ <BR>double sigma; <BR>int i,j; <BR>for 
            (j=0;j&lt;HN;j++) <BR>sigma=0.0; <BR>for (i=0;i&lt;IN;i++) 
            <BR>sigma+=W[j]<I>*P<I>;//求隐层内积 <BR>} <BR>X[j]=sigma - 
            sita<I>;//求隐层净输入 <BR>H[j]=1.0/(1.0+exp(-X[j]));//求隐层输出 <BR>} 
            <BR>return 1; <BR>}//子程序H_I_O()结束 
            <BR><BR>/////////////////////////////////// <BR>//输出层各单元输入、输出值子程序/// 
            <BR>/////////////////////////////////// <BR>O_I_O() <BR>{ <BR>double 
            sigma; <BR>for (int k=0;k&lt;ON;k++) <BR>sigma=0.0; <BR><BR><BR>for 
            (int j=0;j&lt;HN;j++) <BR>sigma+=V[k][j]*H[k];//求输出层内积 <BR>} 
            <BR>Y[k]=sigma-gama[k]; //求输出层净输入 
            <BR>O[k]=1.0/(1.0+exp(-Y[k]));//求输出层输出 <BR>} <BR>return 1; 
            <BR>}//子程序O_I_O()结束 <BR><BR>//////////////////////////////////// 
            <BR>//输出层至隐层的一般化误差子程序//// <BR>//////////////////////////////////// 
            <BR>double d_err[ON]; <BR>Err_O_H(int m) <BR>{ <BR>double 
            abs_err[ON];//每个样本的绝对误差都是从0开始的 <BR>double 
            sqr_err=0;//每个样本的平方误差计算都是从0开始的 <BR>//for (int 
            output=0;output&lt;ON;output++) &nbsp;//output??? <BR>for (int 
            k=0;k&lt;ON;k++) <BR>abs_err[k]=T[k]-O[k]; <BR>//求第m个样本下的第k个神经元的绝对误差 
            <BR>sqr_err+=(abs_err[k])*(abs_err[k]);//求第m个样本下输出层的平方误差 
            <BR><BR><BR><BR>d_err[k]=abs_err[k]*O[k]*(1.0-O[k]);//d_err[k]输出层各神经元的一般化误差 
            <BR>} <BR>err_m[m]=sqr_err/2;//第m个样本下输出层的平方误差/2=第m个样本的均方误差 
            <BR>return 1; <BR>}//子程序Err_O_H(m)结束 
            <BR><BR>//////////////////////////////////// 
            <BR>//隐层至输入层的一般化误差子程序//// <BR>//////////////////////////////////// 
            <BR>double e_err[HN]; <BR>Err_H_I(){ <BR>double sigma; <BR>//for 
            (int hidden=0;hidden <BR>for (int j=0;j&lt;HN;j++) <BR>sigma=0.0; 
            <BR>&nbsp;&nbsp;for (int k=0;k&lt;ON;k++) 
            <BR>&nbsp;&nbsp;&nbsp;sigma=d_err[k]*V[k][j]; <BR>} 
            <BR>e_err[j]=sigma*H[j]*(1-H[j]);//隐层各神经元的一般化误差 <BR>} <BR>return 1; 
            <BR><BR><BR>}//子程序Err_H_I()结束 
            <BR><BR>//////////////////////////////////////////////////////// 
            <BR>//输出层至隐层的权值调整、输出层阈值调整计算子程序////// 
            <BR>//////////////////////////////////////////////////////// 
            <BR>Delta_O_H(int m,FILE* fp) <BR>{ <BR>for (int k=0;k&lt;ON;k++) 
            <BR>for (int j=0;j&lt;HN;j++) <BR>//cout&lt;&lt;"第"&lt; 
            fprintf(fp,"第%d个样本时的输出层至隐层的权值为:%f\n",m,W[k][j <BR>]); 
            <BR>V[k][j]+=alpha*d_err[k]*H[j];//输出层至隐层的权值调整 <BR>} 
            <BR>gama[k]+=alpha*d_err[k];//输出层至隐层的阈值调整 <BR>} <BR>return 1; 
            <BR>}//子程序Delta_O_H()结束 <BR><BR>////////////////// 
            /////////////////////////////////// 
            <BR>//隐层至输入层的权值调整、隐层阈值调整计算子程序///// 
            <BR>///////////////////////////////////////////////////// 
            <BR>Delta_H_I(int m,FILE* fp) <BR><BR><BR>{ <BR>for (int 
            j=0;j&lt;HN;j++) <BR>for (int i=0;i&lt;IN;i++) 
            <BR>//cout&lt;&lt;"第"&lt; 
            fprintf(fp,"第%d个样本时的输出层至隐层的权值为:%f\n",m,V[j]<I><BR>); 
            <BR>W[j]<I>+=beta*e_err[j]*P<I>;//隐层至输入层的权值调整 <BR>} 
            <BR>sita[j]+=beta*e_err[j]; <BR>} <BR>return 1; 
            <BR>}//子程序Delta_H_I()结束 <BR><BR>///////////////////////////////// 
            <BR>//N个样本的全局误差计算子程序//// <BR>///////////////////////////////// 
            <BR>double Err_Sum() <BR>{ <BR>double total_err=0; <BR>for (int 
            m=0;m&lt;N;m++) <BR>total_err+=err_m[m];//每个样本的均方误差加起来就成了全局误差 <BR>} 
            <BR>return 1; <BR><BR><BR>}//子程序Err_sum()结束 
            <BR><BR>/**********************/ <BR>/**程序入口,即主程序**/ 
            <BR>/**********************/ <BR>main() <BR>{ <BR>FILE *fp; 
            <BR>double sum_err; <BR>int study;//训练次数 <BR><BR>if 
            ((fp=fopen("bp.txt","a+"))==NULL) <BR>{ 
            <BR>printf("不能创建bp.txt文件!\n"); <BR>exit(1); <BR>} 
            <BR>cout&lt;&lt;"请输入输出层到隐含层学习效率: alpha=\n"; <BR>cin&gt;&gt;alpha; 
            <BR><BR>cout&lt;&lt;"请输入隐含层到输入层学习效率: beta=\n"; <BR>cin&gt;&gt;beta; 
            <BR><BR><BR><BR>int study=0; //学习次数 <BR>double Pre_error ; //预定误差 
            <BR>cout&lt;&lt;"请输入预定误差: Pre_error= \n"; <BR>cin&gt;&gt;Pre_error; 
            <BR><BR>int Pre_times; <BR>cout&lt;&lt;"请输入预定最大学习次数:Pre_times=\n"; 
            <BR>cin&gt;&gt;Pre_times; <BR><BR>cout&lt;&lt;"请输入学习样本数据\n"; <BR>{ 
            <BR>for (int m=0;m&lt;N;m++) 
            <BR>cout&lt;&lt;"请输入第"&lt;&lt;m+1&lt;&lt;"组学习样本"&lt;&lt;endl; 
            <BR>for (int i=0;i&lt;IN;i++) 
            <BR>&nbsp;cin&gt;&gt;Study_Data[m]-&gt;input<I>; <BR>} <BR>{ <BR>for 
            (int m=0;m&lt;N;m++) 
            <BR>cout&lt;&lt;"请输入第"&lt;&lt;m+1&lt;&lt;"组教师样本"&lt;&lt;endl; 
            <BR>for (int k=0;k&lt;ON;k++) 
            <BR>cin&gt;&gt;Study_Data[m]-&gt;teach[k]; <BR>} 
            <BR><BR><BR><BR>initial(); //隐层、输出层权、阈值初始化 (1) <BR>do <BR>{ 
            <BR>++study; ///??? <BR>for (int m=0;m&lt;N;m++) <BR>{ 
            <BR>input_P(m); //输入第m个学习样本 (2) <BR>input_T(m);//输入第m个样本的教师信号 (3) 
            <BR>H_I_O(); //第m个学习样本隐层各单元输入、输出值 (4) <BR>O_I_O(); 
            //第m个学习样本输出层各单元输入、输出值 (5) <BR>Err_O_H(m); //第m个学习样本输出层至隐层一般化误差 (6) 
            <BR>Err_H_I(); //第m个学习样本隐层至输入层一般化误差 (7) <BR>Delta_O_H(m,fp); 
            //第m个学习样本输出层至隐层权阈值调整、修改 (8) <BR>Delta_H_I(m,fp); 
            //第m个学习样本隐层至输入层权阈值调整、修改 (9) <BR>} //全部样本训练完毕 
            <BR><BR>sum_err=Err_Sum(); //全部样本全局误差计算 (10) <BR>{ 
            <BR>cout&lt;&lt;"第"&lt;&lt;study&lt;&lt;"次学习的均方误差为"&lt;&lt;sum_err&lt;&lt;endl; 
            <BR>fprintf(fp,"第%d次学习的均方误差为:%f\n",study,sum_err); <BR>} 
            <BR><BR><BR>while (sum_err &gt; Pre_error) 
            &nbsp;&nbsp;&nbsp;//or(study <BR>{ //N个样本全局误差小于预定误差否? 小于则退出 (11) 
            <BR>cout&lt;&lt;"网络已经学习了"&lt;&lt;study&lt;&lt;"次,学习的均方误差为"&lt;&lt;sum_err&lt;&lt;endl; 
            <BR>fprintf(fp,"网络已经学习了%d次,现在的全局误差为:%f\n",study,total_err); 
            <BR>fclose(fp); <BR>} <BR>char s; 
            <BR>cout&lt;&lt;"请随便输入一个字符,按回车退出程序!\n"; <BR>cin&gt;&gt;s; <BR>return 
            1; <BR>} </I></I></I></I></I></I></I></I></I></I></I></DIV></TD></TR>
        <TR align=left bgColor=#edf0f5>
          <TD>
            <HR 
            style="BORDER-RIGHT: dotted; BORDER-TOP: dotted; BORDER-LEFT: dotted; COLOR: #a0a0a0; BORDER-BOTTOM: dotted" 
            noShade SIZE=1>
          </TD></TR>
        <TR align=right bgColor=#edf0f5>
          <TD><FONT color=#a0a0a0><A 
            href="http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&amp;dname=DPJQ411&amp;xpos=0&amp;op=comment&amp;gallery=">评论(0)</A> 
            | <A 
            href="http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&amp;dname=DPJQ411&amp;xpos=0&amp;op=recommend">推荐</A> 
            | <A 
            href="http://junan.home.sunbo.net/misc.php?xname=6EDQTV0&amp;dname=DPJQ411&amp;xpos=0&amp;op=print">打印</A> 
            | <A href="javascript:window.close()">关闭</A></FONT> 
      </TD></TR></TBODY></TABLE>
      <TABLE cellSpacing=1 cellPadding=4 width="100%" bgColor=#a0a0a0 
        border=0><TBODY>
        <TR align=left bgColor=#edf0f5>
          <TD>目前尚未有任何评论!! </TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD 
      colSpan=2>http://junan.home.sunbo.net/show_hdr.php?xname=6EDQTV0&amp;dname=DPJQ411&amp;xpos=0 
      (2006-03-08 10:09:14) </TD></TR></TBODY></TABLE></CENTER></BODY></HTML>

⌨️ 快捷键说明

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