遗传算法求函数极值_第1页
遗传算法求函数极值_第2页
遗传算法求函数极值_第3页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、WORD格式智能优化算法第一次作业- 遗传算法洪文杰S151000853问题:用遗传算法求解f(x)=xsin(10 *x)+2.0 的最大值, x 取 -1,2.一、分析:遗传算法根本思路二、实例简介1. 产生初始种群专业资料整理WORD格式s1=13(01101)专业资料整理WORD格式s2=24(11000)s3=8(01000)s4=19(10011)2. 计算适应度假定适应度为f(s)=s2,那么f(s1)=f(13)=132=169f(s2)=f(24)=242=576f(s3)=f(8)=82= 64f(s4)=f(19)=192=3613. 选择染色体的选择概率为:专业资料整理

2、WORD格式染色体的累计概率为:专业资料整理WORD格式根据上面的式子,可得到:专业资料整理WORD格式例如设从区间0,1中产生4 个随机数:专业资料整理WORD格式r1=0.450126,r2=0.110347r3=0.572496,r4=0.98503专业资料整理WORD格式4. 穿插根本遗传算法SGA 中穿插算子采用单点穿插算子。单点穿插运算专业资料整理WORD格式5. 变异专业资料整理WORD格式6. 至下一代,适应度计算选择穿插变异,直至满足终止条件专业资料整理WORD格式三、解决问题专业资料整理WORD格式初始化输入种群大小,穿插概率,变异概率等条件根据精度编码将区间-1,2 分成

3、 Num份,再通过Num 求解种群基因个数 -1,2 用二进制等分计算每个个体的适应度,该题适应度函数就是f(X)根据适应度求解积累概率,并用轮盘赌法选着个体产生备选种群在备选种群中,利用穿插概率,随机选择个体,再随机选择穿插点进行单点穿插,形成穿插后的种群在穿插后种群中,利用变异概率,随机选择个体,再随机选择变异点进展单点变异,形成变异后的种群是否输出结果最大是否到达值。迭代次数专业资料整理WORD格式四、实验结果源代码:专业资料整理WORD格式/* 问题:用遗传算法求解f(x)=xsin(10 *x)+2.0 的最大值,/* 洪文杰2021-3-9. 智能优化算法第一次作业 */#incl

4、ude<iostream>/#includ<stdio.h>#include<stdlib.h>#include<math.h>#include<time.h>#include<float.h>using namespace std;#define NUMBER 50/ 种群规模#define GENE_NUMBER 10000/ 迭代次数int UnitNUMBER30;/初始种群int Unit_chooseNUMBER30;/选择、穿插、变异后的种群int NumberNUMBER;/ 被选择的个体编号float F

5、itnessNUMBER;/ 适应度float select_probabilityNUMBER;/选择概率float accumula_probabilityNUMBER ;/积累概率float f_max=0.0;/ 最大值float f_x=0.0;/ 最大值对应的自变量int hwj_coding(int start,int end);/编码void hwj_initial_population(int num);/产生初始种群x 取 -1,2.*/专业资料整理WORD格式void hwj_fitness(int num);/适应度计算void hwj_choose();/ 选择个体专

6、业资料整理WORD格式int hwj_binary_search(int l, int r,float temp);/查找选择/void hwj_N_M(int a,int b,int N, int M);/从 M 个数中选N 个不一样的数void hwj_cross(int num,float cross);/穿插后的得到种群void hwj_aberrance(int num,float aberrance);/变异后的得到的种群void hwj_max(int num);/找到最适应的个体int main()int strat,end;/ 区间int Num;/ 编码大小float cr

7、oss=0.8;/ 穿插概率float aberrance = 0.04;/ 变异概率int key=1;cout<<" 请输入求解区间:"<<endl;cin>>strat>>end;Num=hwj_coding(strat,end);cout<<"Num:"<<Num<<endl;/cout<<"-1-"<<endl;hwj_initial_population(Num);/cout<<"-2初始种群

8、-"<<endl;/*for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+)cout<<Unitij<<' 'cout<<endl;专业资料整理WORD格式/*/while(key!=GENE_NUMBER)hwj_fitness(Num);cout<<"-3适应度-"<<endl;专业资料整理WORD格式/ for(int i=0;i<NUMBER;i+)/ cout<<Fitnessi<<endl

9、;/ hwj_choose();/cout<<"-4被选择的个体 -"<<endl;/*for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+)cout<<Unit_chooseij<<' 'cout<<endl;*/hwj_cross(Num,cross);/*cout<<"-5穿插后的种群 -"<<endl;for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+

10、)专业资料整理WORD格式cout<<Unitij<<' 'cout<<endl;专业资料整理WORD格式/*/hwj_aberrance(Num,aberrance);cout<<"-6变异后的种群for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+)cout<<Unitij<<' '-"<<endl;专业资料整理WORD格式cout<<endl;*/key+;hwj_max(Num);专业资料整理

11、WORD格式cout<<" 最大值是对应的 cout<<f_x<<endl;x 值是 :"<<endl;专业资料整理WORD格式cout<<" 最大值为 :"<<f_max<<endl;return 0;int hwj_coding(int start,int end)/种群编码float precision;int temp=2;int sum;int N=1;cout<<" 请输入精度X围:"<<endl;cin>&g

12、t;precision;if(precision=0)cout<<" 对不起精度不能为零:"<<endl;return 0;elsesum=(end-start)/precision;cout<<"sum:"<<sum<<endl;while(temp<sum)temp*=2;N+;return N;专业资料整理WORD格式void hwj_initial_population(int num)/生成初始种群srand(time(NULL);for(int i=0;i<NUMBER;

13、i+)for(int j=0;j<num;j+)Unitij=rand()%2;void hwj_fitness(int num)/计算适应度float sum;int temp;for(int i=0;i<NUMBER;i+)temp=1;sum=0.0;for(int j=num-1;j>=0;j-)sum+=Unitij*temp;temp*=2.0;Fitnessi=sum*3/(temp-1.0)-1.0;/ cout<<Fitnessi;/ cout<<"-+"Fitnessi=Fitnessi*sin(10*3.141

14、5926*Fitnessi)+2.0;/ cout<<Fitnessi<<endl;int hwj_binary_search(int l,int r,float temp)for(int i=0;i<NUMBER;i+)if(temp<=accumula_probabilityi&&temp>accumula_probabilityi-1) return i;return -1;void hwj_choose()/ 选择个体float sum=0.0;float temp;int i;for(i=0;i<NUMBER;i+)su

15、m+=Fitnessi;select_probability0=Fitness0/sum;temp=accumula_probability0=select_probability0;for(i=1;i<NUMBER;i+)专业资料整理WORD格式select_probabilityi=Fitnessi/sum;temp+=select_probabilityi;accumula_probabilityi=temp;/ cout<<accumula_probabilityi<<endl;for(i=0;i<NUMBER;i+)/ srand(time(NUL

16、L);temp=(rand()%1000000)/1000000.0;/ cout<<temp;Numberi=hwj_binary_search(0,NUMBER,temp);/ cout<<Numberi<<endl; for(int j=0;j<NUMBER;j+)Unit_chooseij=UnitNumberij;/*void hwj_N_M(int a,int b,int N,int M)/从 M 个数中选 N 个不一样的数 int i=1;srand(time(NULL);a0=rand()%M;ba0=1;while(i!=N)ai=r

17、and()%M;if(bai=0)i+;bai=1;cout<<ai<<endl;/ cout<<ai<<' '<<bai<<endl;*/voidhwj_cross(int num,float cross)/穿插后的得到种群int num_cross=NUMBER*cross;int k;/ 穿插点int i , j;if(num_cross%2!=0)num_cross=num_cross+1;/ 需要穿插的个体数int croNUMBER;/ 被穿插的个体编号int tempNUMBER;/ 是否穿插

18、数组一览for(i=0;i<NUMBER;i+)croi=-1;tempi=0;专业资料整理WORD格式/ hwj_N_M(cro,temp,num_cross,NUMBER); srand(time(NULL);cro0=rand()%NUMBER;tempcro0=1;i=1;while(i!=num_cross)croi=rand()%NUMBER;if(tempcroi=0)tempcroi=1;i+;/ for(int i=0;i<NUMBER;i+)/ cout<<tempi<<""<<croi<<en

19、dl;/ / cout<<num_cross<<endl; for(i=0;i<num_cross/2;i+)srand(time(NULL);k=rand()%num;for(j=0;j<num;j+)if(j<=k)Unitij=Unit_choosecronum_cross-ij;Uniti+num_cross/2j=Unit_choosecroij;elseUnitij=Unit_choosecroij;Uniti+num_cross/2j=Unit_choosecroij;for(i=0;i<NUMBER;i+)/ cout<<tempi<<endl;if(tempi=0)for(j=0;j<num;j+)Unitnum_crossj=Unit_chooseij;num_cross+;void hwj_aberrance(int num,float aberrance)/变异后的得到的种群 int num_aberrance=NUMBER*aberrance;/ 变异的个体数int k;/ 变异点专业资料整理WORD格式int abeNUMBER;/ 变异的个体编号int t

温馨提示

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

评论

0/150

提交评论