一、程序设计流程及参数选取
1、遗传算法的程序设计伪代码
BEGIN t=0;%遗传代数
初始化P(t);初始化种群或染色体
计算P(t)的适应值;
while(不满足停止准则)do
begin
t=t+1;
从P(t-1)中选择P(t);%选择
重组P(t);%交叉和变异
计算P(t)的适应值;
end
END
2、遗传算法的参数设计原则
(1)种群的规模:种群规模的一个建议值为0~100 。
(2)变异概率:变异概率一般取为0.0001~0.2 。
(3)交配概率:交配概率一般取0.4~0.99 。
(4)进化代数:进化代数一般取100~500 。
(5)种群初始化:初始种群的生成是随机的。在初始种群的赋予之前,尽 量进行一个大概的区间估计,以免初始种群分布在远离全局最优解的编码空 间,导致遗传算法的搜索范围受到限制,同时也为算法减轻负担。
二、MATLAB遗传算法工具箱
1、GA工具箱简介
为了省略艰深难懂的遗传算法数学理论和降低程序开发的难度,MATLAB软件已经将遗传算法命令进行了封装,做成专门的遗传算法工具箱—GA Toolbox
2、工具箱核心函数的用法
(1)函数ga
函数ga的语法格式
[x,fval,reason] = ga (@fitnessfun,nvars,options)
其中,x为经过遗传进化后自变量最佳染色染体返回值(最佳解),fval为最佳染色体的适应度(最佳值),reason为算法停止的原因,@fitnessfun为适应度句柄函数;nvars为目标函数自变量的个数;options为算法的属性设置,该属性是通过函数gaoptimset赋予的 ;
(2)函数gaoptimset
函数gaoptimset的语法格式为
Options=gaoptimset(‘PropertyName1’,’propertyValue1’, ‘PropertyName2’,’propertyValue2’,
‘PropertyName3’,’propertyValue3’,…….)
函数gaoptimset实现的功能为,设置遗传算法的参数和句柄函数,下图所列为函数gaoptimset常用的11种属性。
由于遗传算法本质上是一种启发式的随机运算,算法程序经常重复运行多次才能得到理想结果。鉴于此,可以将前一次运行得到的最后种群作为下一次运行的初始种群,如此操作会得到更好的结果。例如:
[x,fval,reason,output,final_pop]=ga(@fitnessfcn,nvars);
最后一个输出变量final_pop返回的就是本次运行得到的最后种群。再将final_pop作为函数ga的初始种群,语法格式为
options=gaoptimset('InitialPopulation',finnal_pop);
[x,fval,reason,output,finnal_pop2]=ga(@fitnessfcn,nvars,options);
三、Genetic Algorithm and Direct Search Toolbox 适应度函数设计
实例1 遗传算法和直接搜索工具箱中的函数ga是求解目标函数的最小值,所以求目标函数最小值的问题,可直接令目标函数为适应度函数(注意:这里是求最小值)。编写适应度函数,语法格式如下:
function f=fitnessfcn(x)%x为自变量向量
f=f(x);
实例2 如果有约束条件(包括自变量的取值范围),对于求解函数的最小值问题,可以使用如下语法格式:
function f=fitnessfcn(x)
if(x<=-1)lx>3)%表示有约束x>-1和x<=3,其他约束条件类推
f=inf;
else
f=f(x);
end
实例3如果有约束条件(包括自变量的取值范围),对于求解函数的最大值问题,可以使用如下语法格式
function f=fitnessfcn(x)
if(x<=-1)|x>3)
f=inf;
else
f=-f(x);%注意,这里f=-f(x)而不是f=f(x)
end
若目标函数作为适应度函数,则最终得到的目标函数值为一fval而不是fval。
四、程序设计范例
首先编写函数f(x)的文件
function f=lbw(x)
if(x(1)>30|x(1)<-30|x(2)>30|x(2)<-30|x(3)>30|x(3)<-30|x(4)>30|x(4)<-30|x(4)>30|x(5)>30|x(5)<-30|x(6)>30|x(6)<-30|x(7)>30|x(7)<-30|x(8)>30|x(8)<-30|x(9)>30|x(9)<-30|x(10)>30|x(10)<-30)
f=300;
else
f=-2*pi*exp(-0.2*sqrt(1/10*((x(1)).^2+(x(2)).^2+(x(3)).^2+(x(4)).^2+(x(5)).^2+(x(6)).^2+(x(7)).^2+(x(8)).^2+(x(9)).^2+(x(10)).^2)))-exp(1/10*(cos(2*pi*x(1))+cos(2*pi*x(2))+cos(2*pi*x(3))+cos(2*pi*x(4))+cos(2*pi*x(5))+cos(2*pi*x(6))+cos(2*pi*x(7))+cos(2*pi*x(8))+cos(2*pi*x(9))+cos(2*pi*x(10))))+2*pi;
end
编写主函数
options=gaoptimset('Generations',800,'StallGenLimit',300,'PlotFcns',@gaplotbestf);
[x,f]=ga(@lbw,10,options)
运行结果: