遗传算法求函数极值Word下载.docx
《遗传算法求函数极值Word下载.docx》由会员分享,可在线阅读,更多相关《遗传算法求函数极值Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
4.交叉
基本遗传算法(SGA)中交叉算子采用单点交叉算子。
单点交叉运算
5.
变异
6.
至下一代,适应度计算→选择→交叉→变异,直至满足终止条件
三、解决问题
四、实验结果
源代码:
/*问题:
用遗传算法求解f(x)=xsin(10π*x)+2.0的最大值,x取[-1,2].*/
/*洪文杰2016-3-9.智能优化算法第一次作业*/
#include<
iostream>
//#includ<
stdio.h>
stdlib.h>
math.h>
time.h>
float.h>
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<
<
"
请输入求解区间:
endl;
cin>
>
strat>
end;
Num=hwj_coding(strat,end);
Num:
Num<
//cout<
--------------------------1-----------------"
hwj_initial_population(Num);
--------------------------2初始种群-----------------"
/*for(inti=0;
i<
NUMBER;
i++){
for(intj=0;
j<
Num;
j++){
Unit[i][j]<
'
'
;
}
cout<
}
*/
while(key!
=GENE_NUMBER){
hwj_fitness(Num);
--------------------------3适应度-----------------"
//for(inti=0;
//cout<
Fitness[i]<
//}
hwj_choose();
--------------------------4被选择的个体-----------------"
Unit_choose[i][j]<
hwj_cross(Num,cross);
/*cout<
--------------------------5交叉后的种群-----------------"
for(inti=0;
hwj_aberrance(Num,aberrance);
--------------------------6变异后的种群-----------------"
key++;
hwj_max(Num);
最大值是对应的x值是:
f_x<
最大值为:
f_max<
return0;
}
inthwj_coding(intstart,intend){//种群编码
floatprecision;
inttemp=2;
intsum;
intN=1;
请输入精度范围:
precision;
if(precision==0){
对不起精度不能为零:
else{
sum=(end-start)/precision;
sum:
sum<
while(temp<
sum){
temp*=2;
N++;
returnN;
}
voidhwj_initial_population(intnum){//生成初始种群
srand(time(NULL));
num;
Unit[i][j]=rand()%2;
voidhwj_fitness(intnum){//计算适应度
floatsum;
inttemp;
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;
Fitness[i];
--------------+++++"
Fitness[i]=Fitness[i]*sin(10*3.1415926*Fitness[i])+2.0;
inthwj_binary_search(intl,intr,floattemp){
if(temp<
=accumula_probability[i]&
&
temp>
accumula_probability[i-1]){
returni;
return-1;
}
voidhwj_choose(){//选择个体
floatsum=0.0;
floattemp;
inti;
for(i=0;
sum+=Fitness[i];
select_probability[0]=Fitness[0]/sum;
temp=accumula_probability[0]=select_probability[0];
for(i=1;
select_probability[i]=Fitness[i]/sum;
temp+=select_probability[i];
accumula_probability[i]=temp;
accumula_probability[i]<
//srand(time(NULL));
temp=(rand()%1000000)/1000000.0;
temp;
Number[i]=hwj_binary_search(0,NUMBER,temp);
Number[i]<
Unit_choose[i][j]=Unit[Number[i]][j];
/*voidhwj_N_M(inta[],intb[],intN,intM){//从M个数中选N个不一样的数
inti=1;
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;
a[i]<
b[a[i]]<
}*/
voidhwj_cross(intnum,floatcross){//交叉后的得到种群
intnum_cross=NUMBER*cross;
intk;
//交叉点
inti,j;
if(num_cross%2!
=0){
num_cross=num_cross+1;
}//需要交叉的个体数
intcro[NUMBER];
//被交叉的个体编号
inttemp[NUMBER];
//是否交叉数组一览
cro[i]=-1;
temp[i]=0;
//hwj_N_M(cro,temp,num_cross,NUMBER);
cro[0]=rand()%NUMBER;
temp[cro[0]]=1;
i=1;
=num_cross){
cro[i]=rand()%NUMBER;
if(temp[cro[i]]==0){
temp[cro[i]]=1;
i++;
temp[i]<
"
cro[i]<
num_cross<
num_cross/2;
srand(time(NULL));
k=rand()%num;
for(j=0;
if(j<
=k){
Unit[i][j]=Unit_choose[cro[num_cross-i]][j];
Unit[i+num_cross/2][j]=Unit_choose[cro[i]][j];
}
else{
Unit[i][j]=Unit_choose[cro[i]][j];
if(temp[i]==0){
for(j=0;
Unit[num_cross][j]=Unit_choose[i][j];
}
num_cross++;
voidhwj_aberrance(intnum,floataberrance){//变异后的得到的种群
intnum_aberrance=NUMBER*aberrance;
//变异的个体数
//变异点
intabe[NUMBER];
//变异的个体编号
//是否变异数组一览
inti,j,p;
abe[i]=-1;
abe[0]=rand()%NUMBER;
temp[abe[0]]=1;
=num_aberrance){
abe[i]=rand()%NUMBER;
if(temp[abe[i]]==0){
temp[abe[i]]=1;
for(i=0;
for(j=0;
num_aberrance;
if(i==abe[j]){
k=rand()%num;
for(p=0;
p<
p++){
if(p==k){
if(Unit[i][p]==1){
Unit[i][p]==0;
}
else{
Unit[i][p]==1;
}
voidhwj_max(intnum){
hwj_fitness(num);
//floatmax=0.0;
inttemp=1;
if(Fitness[i]>
f_max){
f_max=Fitness[i];
k=i;
sum+=Unit[k][j]*temp;
f_x=sum*3/(temp-1.0)-1.0;