遗传算法求函数极值.docx
- 文档编号:26797027
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:19
- 大小:465.04KB
遗传算法求函数极值.docx
《遗传算法求函数极值.docx》由会员分享,可在线阅读,更多相关《遗传算法求函数极值.docx(19页珍藏版)》请在冰豆网上搜索。
遗传算法求函数极值
智能优化算法第一次作业
--------------遗传算法洪文杰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)=s^2,则
f(s1)=f(13)=13^2=169
f(s2)=f(24)=24^2=576
f(s3)=f(8)=8^2=64
f(s4)=f(19)=19^2=361
3. 选择
染色体的选择概率为:
染色体的累计概率为:
根据上面的式子,可得到:
例如设从区间[0,1]中产生4个随机数:
r1=0.450126, r2=0.110347
r3=0.572496, r4=0.98503
4.交叉
基本遗传算法(SGA)中交叉算子采用单点交叉算子。
单点交叉运算
5. 变异
6. 至下一代,适应度计算→选择→交叉→变异,直至满足终止条件
三、解决问题
四、实验结果
源代码:
/*问题:
用遗传算法求解f(x)=xsin(10π*x)+2.0的最大值,x取[-1,2].*/
/*洪文杰2016-3-9.智能优化算法第一次作业*/
#include
//#includ
#include
#include
#include
#include
usingnamespacestd;
#defineNUMBER50//种群规模
#defineGENE_NUMBER10000//迭代次数
intUnit[NUMBER][30];//初始种群
intUnit_choose[NUMBER][30];//选择、交叉、变异后的种群
intNumber[NUMBER];//被选择的个体编号
floatFitness[NUMBER];//适应度
floatselect_probability[NUMBER];//选择概率
floataccumula_probability[NUMBER];//积累概率
floatf_max=0.0;//最大值
floatf_x=0.0;//最大值对应的自变量
inthwj_coding(intstart,intend);//编码
voidhwj_initial_population(intnum);//产生初始种群
voidhwj_fitness(intnum);//适应度计算
voidhwj_choose();//选择个体
inthwj_binary_search(intl,intr,floattemp);//查找选择
//voidhwj_N_M(inta[],intb[],intN,intM);//从M个数中选N个不一样的数
voidhwj_cross(intnum,floatcross);//交叉后的得到种群
voidhwj_aberrance(intnum,floataberrance);//变异后的得到的种群
voidhwj_max(intnum);//找到最适应的个体
intmain(){
intstrat,end;//区间
intNum;//编码大小
floatcross=0.8;//交叉概率
floataberrance=0.04;//变异概率
intkey=1;
cout<<"请输入求解区间:
"< cin>>strat>>end; Num=hwj_coding(strat,end); cout<<"Num: "< //cout<<"--------------------------1-----------------"< hwj_initial_population(Num); //cout<<"--------------------------2初始种群-----------------"< /*for(inti=0;i for(intj=0;j cout< } cout< } */ while(key! =GENE_NUMBER){ hwj_fitness(Num); //cout<<"--------------------------3适应度-----------------"< //for(inti=0;i //cout< //} hwj_choose(); //cout<<"--------------------------4被选择的个体-----------------"< /*for(inti=0;i for(intj=0;j cout< } cout< } */ hwj_cross(Num,cross); /*cout<<"--------------------------5交叉后的种群-----------------"< for(inti=0;i for(intj=0;j cout< } cout< } */ hwj_aberrance(Num,aberrance); /*cout<<"--------------------------6变异后的种群-----------------"< for(inti=0;i for(intj=0;j cout< } cout< } */ key++; hwj_max(Num); } cout<<"最大值是对应的x值是: "< cout< cout<<"最大值为: "< return0; } inthwj_coding(intstart,intend){//种群编码 floatprecision; inttemp=2; intsum; intN=1; cout<<"请输入精度范围: "< cin>>precision; if(precision==0){ cout<<"对不起精度不能为零: "< return0; } else{ sum=(end-start)/precision; cout<<"sum: "< while(temp temp*=2; N++; } returnN; } } voidhwj_initial_population(intnum){//生成初始种群 srand(time(NULL)); for(inti=0;i for(intj=0;j Unit[i][j]=rand()%2; } } } voidhwj_fitness(intnum){//计算适应度 floatsum; inttemp; for(inti=0;i temp=1; sum=0.0; for(intj=num-1;j>=0;j--){ sum+=Unit[i][j]*temp; temp*=2.0; } Fitness[i]=sum*3/(temp-1.0)-1.0; //cout< //cout<<"--------------+++++"; Fitness[i]=Fitness[i]*sin(10*3.1415926*Fitness[i])+2.0; //cout< } } inthwj_binary_search(intl,intr,floattemp){ for(inti=0;i if(temp<=accumula_probability[i]&&temp>accumula_probability[i-1]){ returni; } } return-1; } voidhwj_choose(){//选择个体 floatsum=0.0; floattemp; inti; for(i=0;i sum+=Fitness[i]; } select_probability[0]=Fitness[0]/sum; temp=accumula_probability[0]=select_probability[0]; for(i=1;i select_probability[i]=Fitness[i]/sum; temp+=select_probability[i]; accumula_probability[i]=temp; //cout< } for(i=0;i //srand(time(NULL)); temp=(rand()%1000000)/1000000.0; //cout< Number[i]=hwj_binary_search(0,NUMBER,temp); //cout< for(intj=0;j Unit_choose[i][j]=Unit[Number[i]][j]; } } } /*voidhwj_N_M(inta[],intb[],intN,intM){//从M个数中选N个不一样的数 inti=1; srand(time(NULL)); a[0]=rand()%M; b[a[0]]=1; while(i! =N){ a[i]=rand()%M; if(b[a[i]]==0){ i++; b[a[i]]=1; cout< } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遗传 算法 函数 极值