Ch6遗传算法的改进.docx
《Ch6遗传算法的改进.docx》由会员分享,可在线阅读,更多相关《Ch6遗传算法的改进.docx(14页珍藏版)》请在冰豆网上搜索。
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)
whilegenFitnV=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年代左右就很稳定,说明该方法的优越性。