2022年通过验证的遗传优化BP神经网络程序C程序 .pdf
《2022年通过验证的遗传优化BP神经网络程序C程序 .pdf》由会员分享,可在线阅读,更多相关《2022年通过验证的遗传优化BP神经网络程序C程序 .pdf(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、遗传优化 BP 神经网络程序2009-05-25 19:37:07| 分类:C 程序设计| 标签: c |字号订阅 并行程序行列划分矩阵乘法注:本程序是首先用遗传算法优化神经网络的权值和阈值,然后进行神经网络的学习运算。其中一些参数的值可以根据需要进行修改。神经网络结构是简单的三层结构,可以根据具体情况增加隐层,相应的更改程序。#include stdlib.h #include math.h #include stdio.h #include time.h/ /定义宏 / / #define POPSIZE 20 /种群大小#define chromlength 33 /染色体长度#defi
2、ne N 2 /学习样本个数#define IN 4 /输入层神经元数目#define HN 4 /隐层神经元数目#define HC 1 /隐层层数#define ON 1 /输出层神经元数目#define Z 20000 /旧权值保存 - 每次 study 的权值都保存下来/ /定义全局变量 / / int popsize=20; /种群大小设为 20 int maxgeneration; /最大世代数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 38 页 - -
3、- - - - - - - double pc =0.0; /交叉率double pm = 0.0; /变异率int generation; /当前执行的世代数double fitness20; /适应值double value20; /适应度double bestindividual; /最佳染色体个体double worstindividual; /最差染色体个体double currentbest; /当前最好的染色体个体int best_index; /最好的染色体索引序号int worst_index; /最差的染色体索引序号double E20; int W10000; doubl
4、e Svalue1000;int study; /训练次数double a; /学习速率,即步长double alpha; /动量因子double Pre_error; /预定误差double teach; int Pre_times; /预定最大学习轮次double PIN; /单个样本输入数据double TON; /单个样本教师数据double U0IN; /输入层权值double U11HNIN; /输入层至隐层权值double VONHN; /隐层至输出层权值double X0IN; /输入层的净输入double X1HN; /隐层的输入double YON; /输出层的输入doub
5、le H0IN; /输入层的输出double H1HN; /隐层的输出double OON; /输出层的输出double YU_ININ; /输入层的阈值名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 38 页 - - - - - - - - - double YU_HN1HN; /隐层的阈值double YU_ONON; /输出层的阈值double d_errON; double e_err1HN; double e_err0IN; double sum_err; do
6、uble err_mN; /第 m 个样本的总误差/ /定义结构体 / / struct individual /定义染色体个体结构体 double chromchromlength; double value; /染色体的值double fitness; /染色体的适应值;struct individual populationPOPSIZE; /种群数组/定义一个放学习样本的结构struct double inputIN; double teachON; Study_DataN; /学习样本/bp 算法用来保存每次计算的权值名师资料总结 - - -精品资料欢迎下载 - - - - - -
7、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 38 页 - - - - - - - - - struct double old_U11HNIN; /保存输入层至隐层权值旧权double old_VONHN; /保存隐层至输出层旧权double old_U0IN; Old_WVZ; / /子函数 / / /自定义变量初始化 / void input() int i,j; printf(初始化全局变量 :n); printf(种群大小 popsize=20); printf(最大世代数: ); /输入最大世代数scanf(%d, &max
8、generation); printf(交叉率 (0.2-0.99) :); /输入交叉率scanf(%lf, &pc); printf(变异率 (0.001-0.1) :); /输入变异率名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 38 页 - - - - - - - - - scanf(%lf, &pm); printf(学习速率 (0-1):); /输入学习速率,即步长scanf(%lf, &a); printf(动量因子 (0-1):); /输入动量因子sca
9、nf(%lf, &alpha); printf(预定误差 (0-1):); /输入预定误差scanf(%lf, &Pre_error); printf(预定最大学习轮次: ); /输入预定最大学习轮次scanf(%d, &Pre_times); printf(输入样本数据(包括学习样本和希望输出模式),共有 %d 个样本:n,N); for(i=0;iN;i+) printf(输入第 %d 个学习样本数据 n,i); for(j=0;jIN;j+) printf(Study_Data%d.input%d:,i,j); scanf(%lf, &Study_Datai.inputj); 名师资料总
10、结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 38 页 - - - - - - - - - printf(输入希望输出数据 n); scanf(%lf, &teach); for(i=0;iN;i+) for(j=0;jON;j+) Study_Datai.teachj=teach; /种群初始化 / void generateinitialpopulation( ) int i,j; srand(unsigned)time(NULL); /强制类型转化,以当前时间戳定义随机数种
11、子for (i=0;ipopsize; i+) /popsize: 种群大小名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 38 页 - - - - - - - - - for(j=0;jchromlength;j+) /chromlength:染色体长度 populationi.chromj=(double)(rand()%1000)*0.001); /随机产生0-1的小数。 /神经网络应用得到适应度函数/ double BP1() int i,j,k; double
12、sigma0,sigma1,sigma2; double s; double P4=1,2,3,4; for(i=0;i20;i+) /把随机产生的权值和阈值赋给相应的变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 38 页 - - - - - - - - - for(j=0;j4;j+) U0j= populationi.chromj; /printf( %d%d=%lf ,i,j,populationi.chromj); for(j=4;j20;j+) U11j/
13、4-1j%4= populationi.chromj; /printf( %d%d=%lf ,i,j,populationi.chromj); for(j=20;j24;j+) V0j%4= populationi.chromj; /printf( %d%d=%lf ,i,j,populationi.chromj); for(j=24;j28;j+) YU_INj%4= populationi.chromj; /printf( %d%d=%lf ,i,j,populationi.chromj); for(j=28;j32;j+) YU_HN1j%4= populationi.chromj; /
14、printf( %d%d=%lf ,i,j,populationi.chromj); YU_ON0= populationi.chrom32; /printf( %d32=%lf ,i,populationi.chrom32); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 38 页 - - - - - - - - - for(j=0;j4;j+) /神经网络输入层优化并输出 sigma0=0.0; sigma0=U0j*Pj; X0j=sigma0-YU_INj; H
15、0j=1.0/(1.0+exp(-X0j); for (j=0;j4;j+) sigma1=0.0; for (k=0;k4;k+) sigma1+=U11jk*H0k;/求隐层内积X1j=sigma1 - YU_HN1j;/求隐层净输入H1j=1.0/(1.0+exp(-X1j);/求隐层输出 sigmoid 算法 for (j=0;j1;j+) sigma2=0.0; for (k=0;k4;k+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 38 页 - - -
16、 - - - - - - sigma2+=Vjk*H1j;/ 求输出层内积 Yj=sigma2-YU_ONj; / 求输出层净输入Oj=1.0/(1.0+exp(-Yj);/求输出层输出 for(s=0.0,k=0;k4;k+) s=s+(O0-teach)*(O0-teach); Ei=s/2; return 1; /计算染色体适应值 / void calculateobjectfitness() int i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 38 页
17、 - - - - - - - - - for(i=0;i20;i+) valuei=(double)(1.0/Ei); Svaluegeneration=Svaluegeneration+valuei; for(i=0;i20;i+) fitnessi=valuei/Svaluegeneration; /求最佳个体和最差个体 / void findbestandworstindividual( ) int i; double sum=0.0; bestindividual=fitness0; worstindividual=fitness0; for (i=1;ibestindividual)
18、 /依次比较 ,找出最佳个体名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 38 页 - - - - - - - - - bestindividual=fitnessi; best_index=i; else if (fitnessi=currentbest)/第 n 代最好的,通过比较大于以往最好个体 currentbest=bestindividual; /评价种群 / void evaluatepopulation() calculateobjectfitness
19、(); /计算种群个体的适应度findbestandworstindividual(); /找到最好和最差的染色体个体 / 比例选择算法 / 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 38 页 - - - - - - - - - void selectoperator() int i,index; double p,sum=0.0; /p 存放随机概率, sum 存放个体适应率和累计适应率struct individual newpopulationPOPSIZE
20、; /新种群srand(unsigned) time(NULL); /种下随机种子for(i=1;ipopsize; i+) fitnessi=fitnessi-1+fitnessi; /得到种群累计适应率 for (i=0;ifitnessindex) index+; newpopulationi=populationindex; /选出个体组成新一代 ,暂时存放/newpopulation 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 38 页 - - - - -
21、 - - - - for(i=0;ipopsize; i+) populationi=newpopulationi; /全局变量 populaiton 存新种群(有重复值) / 交叉算法 / void crossoveroperator() int i,j; int index20,temp0; int point; double p,temp1; srand(unsigned) time(NULL); /种下随机种子for (i=0;ipopsize;i+) /初始化 index 数组indexi=i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
22、 - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 38 页 - - - - - - - - - for (i=0;ipopsize;i+) /for 循环实现种群内随机两两交换point=rand()%(popsize-i); /打乱种群顺序temp0=indexi; indexi=indexpoint+i; indexpoint+i=temp0; for (i=0;ipopsize-1;i+=2) p=rand()%1000/1000.0; if (ppc) /单点交叉算法;pc 交叉率point=rand()%(chromlength-1)+1; for
23、 (j=point; jchromlength;j+) /chromlength:染色体长度temp1=populationindexi.chromj; populationindexi.chromj=populationindexi+1.chromj; populationindexi+1.chromj=temp1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 38 页 - - - - - - - - - / 变异操作 / void mutationoperato
24、r() int i,j; double p; srand(unsigned) time(NULL); /种下随机种子for (i=0;ipopsize;i+) for(j=0;jchromlength;j+) p=rand()%1000/1000.0; if (ppm) /pm: 变异率populationi.chromj=(double)(rand()%1000)*0.001); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 38 页 - - - - - - - -
25、 - / 生成下一代 / void generatenextpopulation() selectoperator(); crossoveroperator(); mutationoperator(); / 遗传算法数据输出 / void outputtextreport() int i; printf( 当前世代 =%dn 当前世代染色体最高值 =%fn,generation, fitnessbest_index); printf( 当代最好的一个种群是 %d 号:n, best_index ); printf( 当代最好 E 是:%lfn,Ebest_index ); 名师资料总结 - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年通过验证的遗传优化BP神经网络程序C程序 2022 通过 验证 遗传 优化 BP 神经网络 程序
限制150内