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

下载本文档

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

文档简介

1、.智能优化算法第一次作业 -遗传算法 洪文杰 S151000853问题:用遗传算法求解f(x)=xsin(10*x)+2.0的最大值,x取-1,2.一、分析:遗传算法基本思路二、实例简介1. 产生初始种群s1= 13 (01101)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、60;选择染色体的选择概率为:染色体的累计概率为:根据上面的式子,可得到:例如设从区间0, 1中产生4个随机数:    r1 = 0.450126,    r2 = 0.110347    r3 = 0.572496,    r4 = 0.98503 4. 交叉基本遗传算法(SGA)中交叉算子采用单点交叉算子。单点交叉运算5. 变异6. 至下一代,适应度计算选择交叉变异,直至满足终止条件三、解决问题初始化输入种群大小,交叉概率,变异概率等条件根据精度编码将区间-1,

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

4、t;/#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 FitnessNUMBER;/适应度flo

5、at 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);/产生初始种群void hwj_fitness(int num);/适应度计算void hwj_choose();/选择个体int hwj_binary_search(int l, int r,float temp);/

6、查找选择/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 cross=0.8;/交叉概率float aberrance = 0.04;/变异概率int key=1;cout<<&

7、quot;请输入求解区间:"<<endl;cin>>strat>>end;Num=hwj_coding(strat,end);cout<<"Num:"<<Num<<endl;/cout<<"-1-"<<endl; hwj_initial_population(Num);/cout<<"-2初始种群-"<<endl;/*for(int i=0;i<NUMBER;i+)for(int j=0;j<N

8、um;j+) cout<<Unitij<<' 'cout<<endl;*/while(key!=GENE_NUMBER)hwj_fitness(Num);/cout<<"-3适应度-"<<endl;/for(int i=0;i<NUMBER;i+)/cout<<Fitnessi<<endl;/hwj_choose();/cout<<"-4被选择的个体-"<<endl;/*for(int i=0;i<NUMBER;i+)f

9、or(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+) cout<<Unitij<<' 'cout<<endl;*/hwj_aberrance(Num,aberrance);/*cout&

10、lt;<"-6变异后的种群-"<<endl;for(int i=0;i<NUMBER;i+)for(int j=0;j<Num;j+) cout<<Unitij<<' 'cout<<endl;*/key+;hwj_max(Num);cout<<"最大值是对应的x值是:"<<endl;cout<<f_x<<endl;cout<<"最大值为:"<<f_max<<endl;re

11、turn 0;int hwj_coding(int start,int end)/种群编码float precision;int temp=2;int sum;int N=1;cout<<"请输入精度范围:"<<endl;cin>>precision;if(precision=0) cout<<"对不起精度不能为零:"<<endl; return 0;elsesum=(end-start)/precision;cout<<"sum:"<<sum<

12、<endl;while(temp<sum)temp*=2; N+;return N;void hwj_initial_population(int num)/生成初始种群srand(time(NULL);for(int i=0;i<NUMBER;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+=U

13、nitij*temp;temp*=2.0;Fitnessi=sum*3/(temp-1.0)-1.0;/cout<<Fitnessi;/cout<<"-+"Fitnessi=Fitnessi*sin(10*3.1415926*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&&te

14、mp>accumula_probabilityi-1)return i;return -1; void hwj_choose()/选择个体float sum=0.0;float temp;int i;for(i=0;i<NUMBER;i+)sum+=Fitnessi;select_probability0=Fitness0/sum;temp=accumula_probability0=select_probability0;for(i=1;i<NUMBER;i+)select_probabilityi=Fitnessi/sum;temp+=select_probability

15、i;accumula_probabilityi=temp;/cout<<accumula_probabilityi<<endl;for(i=0;i<NUMBER;i+)/srand(time(NULL);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;/*voi

16、d 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=rand()%M; if(bai=0) i+; bai=1; cout<<ai<<endl; / cout<<ai<<' '<<bai<<endl; */void hwj_cross(int num,float cross)/交叉后的得到种群int num_cross=NUMBER*cross;i

17、nt k;/交叉点int i , j;if(num_cross%2!=0)num_cross=num_cross+1;/需要交叉的个体数int croNUMBER;/被交叉的个体编号int tempNUMBER;/是否交叉数组一览for(i=0;i<NUMBER;i+)croi=-1;tempi=0;/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)

18、 tempcroi=1; i+; /for(int i=0;i<NUMBER;i+)/cout<<tempi<<" "<<croi<<endl;/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_choosecr

19、oij;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;/变异点int abeNUMBER;/变异的个体编号int tempNUMB

温馨提示

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

最新文档

评论

0/150

提交评论