遗传算法求函数极值.docx
《遗传算法求函数极值.docx》由会员分享,可在线阅读,更多相关《遗传算法求函数极值.docx(16页珍藏版)》请在冰豆网上搜索。
遗传算法求函数极值
智能优化算法第一次作业
--------------遗传算法洪文杰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;ifor(intj=0;jcout<}
cout<}
*/
while(key!
=GENE_NUMBER){
hwj_fitness(Num);
//cout<<"--------------------------3适应度-----------------"<//for(inti=0;i//cout<//}
hwj_choose();
//cout<<"--------------------------4被选择的个体-----------------"</*for(inti=0;ifor(intj=0;jcout<}
cout<}
*/
hwj_cross(Num,cross);
/*cout<<"--------------------------5交叉后的种群-----------------"<for(inti=0;ifor(intj=0;jcout<}
cout<}
*/
hwj_aberrance(Num,aberrance);
/*cout<<"--------------------------6变异后的种群-----------------"<for(inti=0;ifor(intj=0;jcout<}
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(temptemp*=2;
N++;
}
returnN;
}
}
voidhwj_initial_population(intnum){//生成初始种群
srand(time(NULL));
for(inti=0;ifor(intj=0;jUnit[i][j]=rand()%2;
}
}
}
voidhwj_fitness(intnum){//计算适应度
floatsum;
inttemp;
for(inti=0;itemp=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;iif(temp<=accumula_probability[i]&&temp>accumula_probability[i-1]){
returni;
}
}
return-1;
}
voidhwj_choose(){//选择个体
floatsum=0、0;
floattemp;
inti;
for(i=0;isum+=Fitness[i];
}
select_probability[0]=Fitness[0]/sum;
temp=accumula_probability[0]=select_probability[0];
for(i=1;iselect_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;jUnit_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<}
}
//cout<}*/
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];//就是否交叉数组一览
for(i=0;icro[i]=-1;
temp[i]=0;
}
//hwj_N_M(cro,temp,num_cross,NUMBER);
srand(time(NULL));
cro[0]=rand()%NUMBER;
temp[cro[0]]=1;
i=1;
while(i!
=num_cross){
cro[i]=rand()%NUMBER;
if(temp[cro[i]]==0){
temp[cro[i]]=1;
i++;
}
}
//for(inti=0;i//cout<//}
//cout<for(i=0;isrand(time(NULL));
k=rand()%num;
for(j=0;jif(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];
Unit[i+num_cross/2][j]=Unit_choose[cro[i]][j];
}
}
}
for(i=0;i//cout<if(temp[i]==0){
for(j=0;jUnit[num_cross][j]=Unit_choose[i][j];
}
num_cross++;
}
}
}
voidhwj_aberrance(intnum,floataberrance){//变异后的得到的种群
intnum_aberrance=NUMBER*aberrance;//变异的个体数
intk;//变异点
intabe[NUMBER];//变异的个体编号
inttemp[NUMBER];//就是否变异数组一览
inti,j,p;
for(i=0;iabe[i]=-1;
temp[i]=0;
}
//hwj_N_M(cro,temp,num_cross,NUMBER);
srand(time(NULL));
abe[0]=rand()%NUMBER;
temp[abe[0]]=1;
i=1;
while(i!
=num_aberrance){
abe[i]=rand()%NUMBER;
if(temp[abe[i]]==0){
temp[abe[i]]=1;
i++;
}
}
for(i=0;ifor(j=0;jif(i==abe[j]){
k=rand()%num;
for(p=0;pif(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;
inti;
inttemp=1;
floatsum=0、0;
intk;
for(i=0;i//cout<if(Fitness[i]>f_max){
f_max=Fitness[i];
k=i;
}
}
for(intj=num-1;j>=0;j--){
sum+=Unit[k][j]*temp;
temp*=2、0;
}
f_x=sum*3/(temp-1、0)-1、0;
}