Ch6遗传算法的改进.docx

上传人:b****5 文档编号:7254063 上传时间:2023-01-22 格式:DOCX 页数:14 大小:138.85KB
下载 相关 举报
Ch6遗传算法的改进.docx_第1页
第1页 / 共14页
Ch6遗传算法的改进.docx_第2页
第2页 / 共14页
Ch6遗传算法的改进.docx_第3页
第3页 / 共14页
Ch6遗传算法的改进.docx_第4页
第4页 / 共14页
Ch6遗传算法的改进.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Ch6遗传算法的改进.docx

《Ch6遗传算法的改进.docx》由会员分享,可在线阅读,更多相关《Ch6遗传算法的改进.docx(14页珍藏版)》请在冰豆网上搜索。

Ch6遗传算法的改进.docx

Ch6遗传算法的改进

Ch6遗传算法的改进

6.1遗传算法的基本函数

[Chrom,Lind,BaseV]=crtbp(Nind,Lind,base)

objV=[1;2;3;4;5;10;9;8;7;6];%十个个体的目标函数值

FintV=ranking(objV);%根据目标函数计算各个体的适应度

SelCh=select('sus',Chrom,FitV);%根据适应度FitV对现有群体Chrom进行复制

NewChrom=recombin(REC_F,Chrom,RecOpt,SUBPOP)

REC_F:

值为recdis、xovsp,二种不同交叉方式

Chrom:

待交叉的种群,即染色体的集合

RecOpt:

交叉概率,缺省时或NAN,取默认值

NewChrom=mut(OldChrom,Pm,BaseV)

Pm:

为变异概率,缺省为0.7/Lind(染色体的长度).

baseV:

染色体个体元素的变异的基本字符,缺省时为二进制编码

Chrom=reins(Chrom,SelCh)%重插入

采用以上算法产生群体,计算适应度,根据适应度进行选择、交叉、变异,再计算适应度等不断循环进化,最后得到需要的解,这是经典遗传算法,尽管可以解决TSP问题,可以解决求最小值或最大值问题,也可以改善BP神经网络的性能,但也存在系列问题。

6.2存在问题-早熟

早熟即非成熟收敛,没有迭代完指定的代数,所有个体都趋于同一个体丧失生物多样性,从而再迭代没有任何意义了,无法获取最优解,主要与以下方面相关。

(1)选择操作是根据当前群体中,个体适应度值所决定的概率进行的。

当群体中存在个别超常个体时(即该个体的适应度远高于其他个体),该个体在选择算子作用下,将会多被选中,强者通吃,强者越强,弱者越弱,下一代很快被该个体控制,变成寡头政治。

(2)交叉和变异操作发生的概率Pc与Pe控制,这二个参数其实控制了算法的局部搜索能力,因此算法对这二个参数非常敏感。

不同的参数值会有不同的结果。

(3)群体规模对遗传算法的优化性能也有较大影响,群体太小了,生物多样性体现不出来,杂交优势没有了,群体太大,计算时间可能太长了,计算效率会降低了。

(4)遗传算法的终止判据是,人为设定其迭代次数,可能也会造成未成熟就终止了即收敛了。

为了克服以上问题,对遗传算法参数的设置做了精心的校定,提出了自适应的交叉和变异,但多数情况下,要针对具体的问题进行分析、试探,寻找相应的控制参数。

6.3多种群遗传算法(multiplepopulationGAMPGA)

(1)多个种群同时进行优化搜索,不同种群的控制参数不同,从而实现不同搜索目的。

(2)各种群之间通过移民算子进行联系,实现多种群的协同进化。

最优解的获取是多个种群协同进化的综合结果。

(3)通过人工选择算子,保存各种群每个进化代中的最优个体,并作为判断算法收敛的依据。

交叉算子是产生新个体的主要算子,它决定遗传算法的全局搜索能力。

变异算子是产生新个体的辅助算子,它决定了遗传算法的局部搜索能力。

建议Pc的值大一点(0.7~0.9),如Pm的值小一点(0.001~0.05),为了避免参数的敏感性,多种群协同进化,兼顾全局与局部的平衡性。

移民算子将各种群在进化过程中出现的最优个体,定期地(每隔一定的进化代数)引入其他的群中,实现种群之间的信息交换,将目标种群中的最差个体,用源种群中的最优个体代替。

精华种群和其他种群有很大不同。

在进化的每一代,通过人工选择算子选出其他种群的最优个体,放入到精华种群加以保存。

精华种群不进行选择、交叉、变异等遗传操作,保证进化过程中各种群产生的最优个体不被破坏和丢失,同时精华种群也是判断算法终止的依据。

6.4实例

maxf(x,y)=21.5+xsin(4x)+ysin(204y),-3.0x12.1,4.1x5.8,

x=-3.0:

0.01:

12.1;

len=length(x);

y1=(5.8-4.1)/len;

y=4.1:

y1:

5.8;

y=y(1:

len);

[X,Y]=meshgrid(x,y);

Z=21.5+X.*sin(4*pi*X)+Y.*sin(20*pi*Y);

mesh(X,Y,Z)

有很多的局部极值,常见的寻优算法可能很容易陷入局部极值,或在局部值极值之间振荡。

移民算子

function[Chrom,ObjV]=immigrant(Chrom,ObjV)

%Chrom是各种群的集合,应是3维数组,

%1维是哪个种群,2维是种群中某染色体,3维是某染色体的基因位

%OjbV是各种群中各染色体的目标函数值

MP=length(Chrom);%种群的个数

fori=1:

MP

[MaxO,maxI]=max(ObjV{i});%找出第i种群中最优的个体

next_i=i+1;%目标种群(移民操作中,循环迁移)

ifnext_i>MP

next_i=mod(next_i,MP);%超过MP则模MP

end

[MinO,minI]=min(ObjV{next_i});%找出目标种群中最劣的个体

%%目标种群最劣个体替换为源种群最优个体

Chrom{next_i}(minI,:

)=Chrom{i}(maxI,:

);

ObjV{next_i}(minI)=ObjV{i}(maxI);

end

人工选择算子函数

function[MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom)

%Chrom:

移民前各种群的编码集,3维数组

%ObjV:

移民前各种群中各染色体的目标函数值

%MaxObjV:

移民前各种群最优个体的目标函值。

%MaxChrom:

移民前各种群的最优个体的编码

MP=length(Chrom);%种群数

fori=1:

MP

[MaxO,maxI]=max(ObjV{i});%找出第i种群中最优个体

ifMaxO>MaxObjV(i)

MaxObjV(i)=MaxO;%保存第i个种群的最优目标值

MaxChrom(i,:

)=Chrom{i}(maxI,:

);%保存第i个种群的精华个体的编码

end

end

目标函数

functionobj=ObjectFunction(X)

%X:

为col行2列的数组,首列为自变量x的值,次列为自变量y的值

col=size(X,1);

fori=1:

col

obj(i,1)=21.5+X(i,1)*sin(4*pi*X(i,1))+X(i,2)*sin(20*pi*X(i,2));

end

我在画图时,采用的X,Y,Z三列数据

标准遗传算法SGA

%%标准遗传算法SGA

clearall;

closeall;

clc;

pc=0.7;%交叉概率

pm=0.05;%变异概率

%定义遗传算法参数

NIND=40;%个体数目

MAXGEN=500;%最大遗传代数

NVAR=2;%变量的维数

PRECI=20;%变量的二进制位数

GGAP=0.9;%代沟

trace=zeros(MAXGEN,1);%记录优化轨迹

FieldD=[rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])];%译码矩阵

Chrom=crtbp(NIND,NVAR*PRECI);%创建初始种群

gen=0;%代计数器

ObjV=ObjectFunction(bs2rv(Chrom,FieldD));%计算初始种群个体的目标函数值

[maxY,I]=max(ObjV);%目标函数的最优值

X=bs2rv(Chrom,FieldD);%初始种群的各染色体的在[-3,12.1],[4.1,5.8]的点

maxX=X(I,:

);%目标函数最大者对应的坐标值(x,y)

whilegen

FitnV=ranking(-ObjV);%分配适应度值(最大值问题要加负号)

SelCh=select('sus',Chrom,FitnV,GGAP);%选择

SelCh=recombin('xovsp',SelCh,pc);%重组

SelCh=mut(SelCh,pm);%变异

ObjVSel=ObjectFunction(bs2rv(SelCh,FieldD));%计算子代目标函数值

[ChromObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重插入

gen=gen+1;%代计数器增加

ifmaxY

[maxY,I]=max(ObjV);

X=bs2rv(Chrom,FieldD);

maxX=X(I,:

);

end

trace(gen,1)=maxY;

end

%%进化过程图

plot(1:

gen,trace(:

1));

holdon

xlabel('进化代数');

ylabel('最优解变化');

title('SGA进化过程');

%%输出最优解

disp(['最优值为:

',num2str(maxY)]);

disp(['对应的自变量取值:

',num2str(maxX)]);

运算结果

最优值为:

38.7454

对应的自变量取值:

11.63625.72468

多种群遗传算法MPGA

clearall;

closeall;

clc

NIND=40;%个体数目

NVAR=2;%变量的维数

PRECI=20;%变量的二进制位数

GGAP=0.9;%代沟

MP=10;%种群数目

FieldD=[rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])];%译码矩阵

fori=1:

MP

Chrom{i}=crtbp(NIND,NVAR*PRECI);%创建第i个初始种群

end

pc=0.7+(0.9-0.7)*rand(MP,1);%在【0.7,0.9】范围i内随机产生交叉概率

pm=0.001+(0.05-0.001)*rand(MP,1);%在【0.001,0.05】范围内随机产生变异概率

gen=0;%初始遗传代数

gen0=0;%初始保持代数

MAXGEN=10;%最优个体最少保持代数

maxY=0;%最优值

fori=1:

MP

%计算各初始种群个体的目标函数值

ObjV{i}=ObjectFunction(bs2rv(Chrom{i},FieldD));

end

MaxObjV=zeros(MP,1);%记录精华种群

MaxChrom=zeros(MP,PRECI*NVAR);%记录精华种群的编码

whilegen0<=MAXGEN

gen=gen+1;%遗传代数加1

fori=1:

MP

FitnV{i}=ranking(-ObjV{i});%各种群的适应度(最大问题加负号)

SelCh{i}=select('sus',Chrom{i},FitnV{i},GGAP);%选择操作

SelCh{i}=recombin('xovsp',SelCh{i},pc(i));%交叉操作

SelCh{i}=mut(SelCh{i},pm(i));%变异操作

ObjVSel=ObjectFunction(bs2rv(SelCh{i},FieldD));%计算子代目标函数值

%重插入操作

[Chrom{i},ObjV{i}]=reins(Chrom{i},SelCh{i},1,1,ObjV{i},ObjVSel);

end

[Chrom,ObjV]=immigrant(Chrom,ObjV);%移民操作

%人工选择精华种群

[MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom);

YY(gen)=max(MaxObjV);%找出精华种群中最优的个体

ifYY(gen)>maxY%判断当前优化值是否与前一次优化值相同

maxY=YY(gen);%更新最优值

gen0=0;

else

gen0=gen0+1;%最优值保持次数加1

end

end

%%进化过程图

plot(1:

gen,YY);

xlabel('进化代数')

ylabel('最优解变化')

title('MPGA进化过程')

%%输出最优解

[Y,I]=max(MaxObjV);%找出精华种群中最优的个体

X=(bs2rv(MaxChrom(I,:

),FieldD));%最优个体的解码解

disp(['最优值为:

',num2str(Y)])

disp(['对应的自变量取值:

',num2str(X)])

运算结果

最优值为:

38.8503

对应的自变量取值:

11.62555.72504

MPGA60代就很稳定了,而SGA到500代才稳定!

更细致的比较需要将多次的图画出来。

多代对比

function[gen,trace,maxX,maxY]=ysga()

%%标准遗传算法SGA函数

clearall;

%closeall;

%clc;

……%代码同sga

%%进化过程图

%plot(1:

gen,trace(:

1));

%holdon

%xlabel('进化代数');

%ylabel('最优解变化');

%title('SGA进化过程');

%%输出最优解

%disp(['最优值为:

',num2str(maxY)]);

%disp(['对应的自变量取值:

',num2str(maxX)])

即输出与画图的语句被注释掉

主控函数

%%执行5次,将每次的结果显示出来

%ysgaMain.m

clearall;

closeall;

clc;

holdon;

myColor=['r';'g';'b';'y';'v'];

fori=1:

5

[gen,trace,maxX,maxY]=ysga();

plot(1:

gen,trace(:

1),myColor(i));

disp([num2str(i),'',num2str(maxX),'',num2str(maxY)]);

end

xlabel('进化代数');

ylabel('最优解变化');

title('SGA进化过程');

holdoff;

运算结果

次数

x

y

最优值

1

11.6267

5.72569

38.8444

2

11.62

5.72499

38.8224

3

11.6229

5.72314

38.8029

4

11.6223

5.72595

38.8313

5

11.6233

5.72346

38.8175

多种群算法的函数形式ympga()

function[gen,YY,X,Y]=ympga()

%%函数形式的多种群遗传算法

clearall;

%closeall;

%clc

……%与mpga()算法完全一样

end

%%进化过程图

%plot(1:

gen,YY);

%label('进化代数')

%ylabel('最优解变化')

%title('MPGA进化过程')

[Y,I]=max(MaxObjV);%找出精华种群中最优的个体

X=(bs2rv(MaxChrom(I,:

),FieldD));%最优个体的解码解

%disp(['最优值为:

',num2str(Y)])

%disp(['对应的自变量取值:

',num2str(X)])

主控程序

%%执行5次,将每次的结果显示出来

%ympgaMain.m

clearall;

closeall;

clc;

holdon;

myColor=['r';'g';'b';'y';'v'];

fori=1:

5

[gen,YY,X,Y]=ympga();

plot(1:

gen,YY,myColor(i));

disp([num2str(i),'',num2str(X),'',num2str(Y)]);

end

xlabel('进化代数');

ylabel('最优解变化');

title('MPGA进化过程');

holdoff;

运算结果

次数

X

Y

函数值

1

11.6255

5.72504

38.8503

2

11.6255

5.72504

38.8503

3

11.6255

5.72504

38.8503

4

11.6255

5.72504

38.8503

5

11.6255

5.72504

38.8503

从上述两个图可知,sga方法不太稳定,进化代数500代还在波动,说明还没有得到最优解,而采用mpga方法,70年代左右就很稳定,说明该方法的优越性。

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

当前位置:首页 > 农林牧渔 > 林学

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

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