1、遗传算法求函数极值智能优化算法第一次作业 -遗传算法 洪文杰 S1*3问题:用遗传算法求解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、体的累计概率为:根据上面的式子,可得到:例如设从区间0, 1中产生4个随机数: r1 = 0、450126, r2 = 0、110347 r3 = 0、572496, r4 = 0、985034、 交叉基本遗传算法(SGA)中交叉算子采用单点交叉算子。单点交叉运算5、变异6、至下一代,适应度计算选择交叉变异,直至满足终止条件三、解决问题四、实验结果源代码:/*问题:用遗传算法求解f(x)=xsin(10*x)+2、0的最大值,x取-1,2、*/*洪文杰 2016-3-9、 智能优化算法 第一次作业*/#include/#includ#include#include#include#includ
3、eusing namespace std;#define NUMBER 50/种群规模#define GENE_NUMBER 10000/迭代次数int UnitNUMBER30;/初始种群int Unit_chooseNUMBER30;/选择、交叉、变异后的种群int NumberNUMBER;/被选择的个体编号float FitnessNUMBER;/适应度float select_probabilityNUMBER;/选择概率float accumula_probabilityNUMBER ;/积累概率float f_max=0、0;/最大值float f_x=0、0;/最大值对应的自变
4、量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);/查找选择/void hwj_N_M(int a,int b,int N, int M);/从M个数中选N个不一样的数void hwj_cross(int num,float cross);/交叉后的得到种群void hwj_abe
5、rrance(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请输入求解区间:stratend; Num=hwj_coding(strat,end); coutNum:Numendl;/ cout-1-endl; hwj_initial_population(Num);/ cout-2初始种群-e
6、ndl;/* for(int i=0;iNUMBER;i+) for(int j=0;jNum;j+) coutUnitij ; coutendl; */ while(key!=GENE_NUMBER) hwj_fitness(Num);/ cout-3适应度-endl;/ for(int i=0;iNUMBER;i+)/ coutFitnessiendl;/ hwj_choose();/ cout-4被选择的个体-endl;/* for(int i=0;iNUMBER;i+) for(int j=0;jNum;j+) coutUnit_chooseij ; coutendl; */ hwj_
7、cross(Num,cross);/* cout-5交叉后的种群-endl; for(int i=0;iNUMBER;i+) for(int j=0;jNum;j+) coutUnitij ; coutendl; */ hwj_aberrance(Num,aberrance);/* cout-6变异后的种群-endl; for(int i=0;iNUMBER;i+) for(int j=0;jNum;j+) coutUnitij ; coutendl; */ key+; hwj_max(Num); cout最大值就是对应的x值就是:endl; coutf_xendl; cout最大值为:f_m
8、axendl; return 0;int hwj_coding(int start,int end)/种群编码 float precision; int temp=2; int sum; int N=1; cout请输入精度范围:precision; if(precision=0) cout对不起精度不能为零:endl; return 0; else sum=(end-start)/precision; coutsum:sumendl; while(tempsum) temp*=2; N+; return N; void hwj_initial_population(int num)/生成初始
9、种群 srand(time(NULL); for(int i=0;iNUMBER;i+) for(int j=0;jnum;j+) Unitij=rand()%2; void hwj_fitness(int num)/计算适应度 float sum; int temp; for(int i=0;i=0;j-) sum+=Unitij*temp; temp*=2、0; Fitnessi=sum*3/(temp-1、0)-1、0;/ coutFitnessi;/ cout-+; Fitnessi=Fitnessi*sin(10*3、1415926*Fitnessi)+2、0;/ coutFitne
10、ssiendl; int hwj_binary_search(int l,int r,float temp) for(int i=0;iNUMBER;i+) if(tempaccumula_probabilityi-1) return i; return -1; void hwj_choose()/选择个体 float sum=0、0; float temp; int i; for(i=0;iNUMBER;i+) sum+=Fitnessi; select_probability0=Fitness0/sum; temp=accumula_probability0=select_probabil
11、ity0; for(i=1;iNUMBER;i+) select_probabilityi=Fitnessi/sum; temp+=select_probabilityi; accumula_probabilityi=temp;/ coutaccumula_probabilityiendl; for(i=0;iNUMBER;i+)/ srand(time(NULL); temp=(rand()%1000000)/1000000、0;/ couttemp; Numberi=hwj_binary_search(0,NUMBER,temp);/ coutNumberiendl; for(int j=
12、0;jNUMBER;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=rand()%M; if(bai=0) i+; bai=1; coutaiendl; / coutai baiendl; */void hwj_cross(int num,float cross)/交叉后的得到种群 int num_cross=NUMBER*cross; int k;
13、/交叉点 int i , j; if(num_cross%2!=0) num_cross=num_cross+1; /需要交叉的个体数 int croNUMBER;/被交叉的个体编号 int tempNUMBER;/就是否交叉数组一览 for(i=0;iNUMBER;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
14、=0) tempcroi=1; i+; / for(int i=0;iNUMBER;i+)/ couttempi croiendl;/ / coutnum_crossendl; for(i=0;inum_cross/2;i+) srand(time(NULL); k=rand()%num; for(j=0;jnum;j+) if(j=k) Unitij=Unit_choosecronum_cross-ij; Uniti+num_cross/2j=Unit_choosecroij; else Unitij=Unit_choosecroij; Uniti+num_cross/2j=Unit_cho
15、osecroij; for(i=0;iNUMBER;i+)/ couttempiendl; if(tempi=0) for(j=0;jnum;j+) Unitnum_crossj=Unit_chooseij; num_cross+; void hwj_aberrance(int num,float aberrance)/变异后的得到的种群 int num_aberrance=NUMBER*aberrance;/变异的个体数 int k;/变异点 int abeNUMBER;/变异的个体编号 int tempNUMBER;/就是否变异数组一览 int i,j,p; for(i=0;iNUMBER
16、;i+) abei=-1; tempi=0; / hwj_N_M(cro,temp,num_cross,NUMBER); srand(time(NULL); abe0=rand()%NUMBER; tempabe0=1; i=1; while(i!=num_aberrance) abei=rand()%NUMBER; if(tempabei=0) tempabei=1; i+; for( i=0;iNUMBER;i+) for( j=0;jnum_aberrance;j+) if(i=abej) k=rand()%num; for( p=0;pnum;p+) if(p=k) if(Unitip=1) Unitip=0; else Unitip=1; void hwj_max(int num) hwj_fitness(num);/ float max=0、0; int i; int temp=1; float sum=0、0; int k; for(i=0;iNUMBER;i+)/ coutFitnessif_max) f_max=Fitnessi; k=i; for(int j=num-1;j=0;j-) sum+=Unitkj*temp; temp*=2、0; f_x=sum*3/(temp-1、0)-1、0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1