遗传算法及其改进措施Word下载.docx
- 文档编号:19141742
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:17
- 大小:2.25MB
遗传算法及其改进措施Word下载.docx
《遗传算法及其改进措施Word下载.docx》由会员分享,可在线阅读,更多相关《遗传算法及其改进措施Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
对于一个需要进行优化的实际问题,一般可按下述步骤构造遗传算法:
第一步:
确定决策变量及各种约束条件,即确定出个体的表现型X和问题的解空间;
第二步:
建立优化模型,即确定出目标函数的类型及数学描述形式或量化方法;
第三步:
确定表示可行解的染色体编码方法,即确定出个体的基因型x及遗传算法的搜索空间;
第四步:
确定解码方法,即确定出由个体基因型x到个体表现型X的对应关系或转换方法;
第五步:
确定个体适应度的量化评价方法,即确定出由目标函数值到个体适应度的转换规则;
第六步:
设计遗传算子,即确定选择运算、交叉运算、变异运算等遗传算子的具体操作方法。
第七步:
确定遗传算法的有关运行参数,即M,G,Pc,Pm等参数。
具体程序流程图见下图所示:
图1遗传算法流程图
四、优化过程
1.第一题
图2Rosenbrock函数图像
图3遗传算法迭代寻优过程
程序运行结果如下:
最优点函数取值
2.第二题
图4:
Rastrigin函数图像
图5:
遗传算法迭代寻优过程
3.第三题
图6Schaffer函数图像
图7遗传算法迭代寻优过程
由仿真结果可知,随着进化过程的进行,群体中适应度较低的一些个体被逐渐淘汰掉,而适应度较高的一些个体会越来越多,并且它们都集中在所求问题的最优点附近,从而搜索到问题的最优解。
五、问题的发现与改进
1.问题一:
局部最优解
从第三题的函数图像中可以看出,该函数有无限多个局部极大值点,只有一个全局最优点
此函数最导致峰周围有一圈脊,上面的取值均为0.990283。
从上面的优化过程可以看出,当随机选定初始种群后,随着迭代次数的增加,种群最终都集中在了这一圈脊上,也就是寻优过程陷入了局部最优点,并没有找到函数的的最优点。
对于遗传算法中的上述问题,我们采用的解决方案如下。
解决方法1:
等值线法
初始种群的选取对函数能不能找到最优点有着重要的影响,本文通过分析函数的等值线缩小初始种群的随机产生范围,从而让种群朝着全局最优点进化。
在Matlab下画出函数的等值线如下图:
图8目标函数的等值线图
从图中可以看出,以中心最优点为圆心,围绕着中心点分布着多条等值线,从中心的红色区域向外到蓝色区域,目标函数值先减小再增加最后又减小,所以本文以中间红色区域到蓝色区域中选取合适的等值线截面,并在该面上随机产生初始种群,这样可以有效防止迭代陷入局部最优解。
改进后的寻优结果:
图9改进后的遗传算法寻优过程
图6中的最终种群进化到了函数一圈“脊”上,但是这只是函数的局部最优点,而从图9可以清楚地看到,种群进化到最后都集中在了中心凸起点的附近,这也是函数的最大值点,可见改进后的遗传算法有效的解决了局部最优点的问题,顺利找到了函数的全局最优解。
解决方法2:
模拟退火算法
模拟退火算法是模仿了自然界退火现象,利用了物理中固体物质的退火过程与一般问题的相似性,从某一初始温度开始,伴随着温度的不断下降,结合概率突跳特性在解空间中随机寻找全局最优解,它能有效的克服寻优陷入局部最小值的优化方法。
其具体算法原理本文不详述,只给出采用模拟退火算法的实现过程如下图所示:
图10模拟推过算法实现过程
相关参数选择为:
初始温度Temperature=30
步长因子StepFactor=0.002
容差Tolerance=1e-7
马可夫链长度MarkovLength=1000
衰减参数DecayScale=0.95
程序运行结果为(程序见附录):
寻优过程如下:
图11模拟退火算法的寻优过程
从上面的寻优结果可以看出,模拟退火算法解决了本例中遗传算法寻优陷入局部最优解的问题,最终找到了SchafferFunction函数的全局唯一最优解
。
问题二:
寻优速度
基本的遗传算法中产生优良个体的主要手段是同过交叉重组,但这样并不能保证产生新个体的速度,即迭代寻优的速度很慢,考虑到为了保证较高的精度,本文的基因编码分别是十位、十二位与十三位,那么对于二元函数,染色体的长度就是二十、二十四与二十六,因此可以在交叉重组时,将较长的染色体分为若干段,并对每一小段进行两两配对交叉重组,这样相当于每个染色体在一次的迭代过程中参与了几次交叉重组,大大加快了新个体的产生速度。
本文即将染色体分为了两段,进行交叉重组(程序见附录),加快了寻优速度。
六程序附录
1遗传算法主程序
%%%%%遗传算法主程序%%%%%
clear%清除普通变量,不清除全局变量
clf
popsize=80;
%种群大小
chromlength=26;
%字符串长度(个体染色体长度)
pc=0.6;
pm=0.001;
%globalNumv=2;
pop=initpop(popsize,chromlength)
fori=1:
200%200为迭代次数
objvalue=calobjvalue(pop);
%计算函数值
fitvalue=calfitvalue(objvalue);
%计算个体适应度
avefitvalue(i)=sum(fitvalue)/popsize;
newpop=selection(pop,fitvalue);
%选择
newpop=crossover_multiv(newpop,pc);
newpop=mutation(newpop,pm);
[bestindividual,bestfit]=best(pop,fitvalue);
z(i)=max(bestfit)%个体适应度的最大值
n(i)=i;
x(i)=decodechrom(bestindividual,1,chromlength/2)*8/8191-4%将二进制的数转换为十进制数然后归一化到0-10之间
y(i)=decodechrom(bestindividual,(chromlength/2+1),chromlength/2)*8/8191-4
pop=newpop;
end
figure
(1);
i=1:
1:
200;
holdon;
plot(i,avefitvalue)
plot(i,z)
xlabel('
迭代次数'
);
ylabel('
函数值'
legend('
种群平均适应度'
'
种群最大适应度'
figure
(2);
plot3(x,y,z,'
r+'
)
holdon
x1=-4:
0.1:
4;
x2=-4:
[xx,yy]=meshgrid(x1,x2);
z1=xx.^2+yy.^2;
z=0.5-((sin(sqrt(z1)).^2-0.5)./(1+0.001*(z1)).^2);
mesh(xx,yy,z)
gridon;
2种群初始化函数
%%%%%%%%%初始化%%%%%%%%%%%%
functionpop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));
3计算个体适应度函数
%%%计算个体的适应度
functionfitvalue=calfitvalue(objvalue)%这里的objvalue是一个列向量
globalCmin;
Cmin=0;
%display(objvalue);
[px,py]=size(objvalue);
%这里px是种群大小,py=1
fori=1:
px
ifobjvalue(i)+Cmin>
0%计算出的目标函数值小于0则适应度为0
temp=Cmin+objvalue(i);
else
temp=0.0;
fitvalue(i)=temp;
%display(fitvalue);
fitvalue=fitvalue'
;
%将行向量转化为列向量
4选择复制函数
%%%选择复制%%%%%
functionnewpop=selection(pop,fitvalue)
totalfit=sum(fitvalue);
%求所有适应度之和
fitvalue=fitvalue/totalfit%单个个体被选择的概率
fitvalue=cumsum(fitvalue)%累计概率
[px,py]=size(pop);
ms=sort(rand(px,1))
fitin=1;
newin=1;
whilenewin<
=px
if(ms(newin))<
fitvalue(fitin)
newpop(newin,:
)=pop(fitin,:
newin=newin+1;
fitin=fitin+1;
5交叉重组函数
%%%%%%%%%交叉重组%%%%%%%%%
functionnewpop=crossover_multiv(pop,pc)
pop1=ones(px,py);
pop2=pop;
2:
px-1
if(rand<
pc)
cpoint=round(rand*(py-1))%cpoint为交叉点
pop1(i,:
)=[pop2(i,1:
cpoint)pop2(i+1,cpoint+1:
py)]
pop1(i+1,:
)=[pop2(i+1,1:
cpoint)pop2(i,cpoint+1:
)=pop2(i,1:
py)%若不交叉则直接复制到下一代
)=pop2(i+1,1:
py)
newpop=pop1;
6变异函数
%%%%%%%%变异函数%%%%
functionnewpop=mutation(pop,pm)
newpop=ones(size(pop));
pm)
mpoint=round(rand*py);
ifmpoint<
=0
mpoint=1;
newpop(i,:
)=pop(i,:
ifany(newpop(i,mpoint))==0
newpop(i,mpoint)=1;
newpop(i,mpoint)=0;
7模拟退火算法
function[BestX,BestY]=SimulateAnnealing1
clear;
clc;
%要求最优值的目标函数,搜索的最大区间
XMAX=4;
YMAX=4;
MarkovLength=1000;
%马可夫链长度
DecayScale=0.95;
%衰减参数
StepFactor=0.002%步长因子
Temperature=30
Tolerance=1e-7;
AcceptPoints=0.0;
%Metropolis过程中总的接收点个数
rnd=rand;
PreX=-XMAX*rand;
PreY=-YMAX*rand;
PreBestX=PreX;
PreBestY=PreY;
BestX=PreX;
BestY=PreY;
%每迭代一次退火一次知道满足迭代条件为止
mm=abs(ObjectFunction(BestX,BestY)-ObjectFunction(PreBestX,PreBestY));
k=0;
whilemm>
Tolerance
Temperature=DecayScale*Temperature
%在当前温度T下迭代马尔科夫链长度的次数
fori=0:
MarkovLength
%第一步:
在此点附近随机选取下一点
p=0;
whilep==0;
NextX=PreX+StepFactor*XMAX*(rand-0.5)
NextY=PreY+StepFactor*YMAX*(rand-0.5)
ifp==(~(NextX>
=-XMAX&
&
NextX<
=XMAX&
NextY>
=-YMAX&
NextY<
=YMAX))%随机点如果在设定范围内则跳出while循环
p=1;
%第二步:
检查是否为全局最优点
if(ObjectFunction(BestX,BestY)>
ObjectFunction(NextX,NextY))
PreBestX=BestX;
PreBestY=BestY;
%先把上一个最优点保留下来
BestX=NextX;
BestY=NextY;
%此为新的最优解
%第三步:
进行Metroplis过程
if(ObjectFunction(PreX,PreY)-ObjectFunction(NextX,NextY)>
0)
%接收此点,即下一个迭代点以新接受的点开始
PreX=NextX;
PreY=NextY;
AccpetPoints=AcceptPoints+1
changer=-1*(ObjectFunction(NextX,NextY)-ObjectFunction(PreX,PreY))/Temperature;
%/还是./的问题
p1=exp(changer);
double(p1);
ifp1>
rand%
AcceptPoints=AcceptPoints+1
k=k+1;
x(k)=BestX;
y(k)=BestY;
z(k)=ObjectFunction(BestX,BestY);
z(k)=-z(k)
mm=abs(ObjectFunction(BestX,BestY)-ObjectFunction(PreBestX,PreBestY));
disp('
最小值在点:
'
BestX
BestY
disp('
最小值为:
ObjectFunction(BestX,BestY)
k
plot(i,z,'
r'
title('
模拟退火寻优过程'
寻优过程'
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遗传 算法 及其 改进 措施
![提示](https://static.bdocx.com/images/bang_tan.gif)