遗传算法求函数极值Word下载.docx

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

遗传算法求函数极值Word下载.docx

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

遗传算法求函数极值Word下载.docx

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;

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

当前位置:首页 > PPT模板 > 艺术创意

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

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