遗传算法求函数极值.docx

上传人:b****3 文档编号:26797027 上传时间:2023-06-22 格式:DOCX 页数:19 大小:465.04KB
下载 相关 举报
遗传算法求函数极值.docx_第1页
第1页 / 共19页
遗传算法求函数极值.docx_第2页
第2页 / 共19页
遗传算法求函数极值.docx_第3页
第3页 / 共19页
遗传算法求函数极值.docx_第4页
第4页 / 共19页
遗传算法求函数极值.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

遗传算法求函数极值.docx

《遗传算法求函数极值.docx》由会员分享,可在线阅读,更多相关《遗传算法求函数极值.docx(19页珍藏版)》请在冰豆网上搜索。

遗传算法求函数极值.docx

遗传算法求函数极值

智能优化算法第一次作业

--------------遗传算法洪文杰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<

}

}

//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;i

cro[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;i

srand(time(NULL));

k=rand()%num;

for(j=0;j

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];

Unit[i+num_cross/2][j]=Unit_choose[cro[i]][j];

}

}

}

for(i=0;i

//cout<

if(temp[i]==0){

for(j=0;j

Unit[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;i

abe[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;i

for(j=0;j

if(i==abe[j]){

k=rand()%num;

for(p=0;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;

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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1