多极值点函数具有多个极值,对此问题,传统的优化技术很容易陷人局部最优解,求得全局优化解的概率不高,可靠性低;为此,建立尽可能大概率的求解全局优化解算法是求解函数优化的一个重要问题。
在MATLAB中,可以使用遗传算法接近标准优化算法无法解决或者很难解决的优化问题。遗传算法的搜索能力主要由选择算子及交叉算子赋存,变异算子尽可能保证算法达到全局最优,避免陷入局部最优。
在使用遗传算法求解优化的时候,经常会用到工具箱globaloptimdemos内的绘制函数图形的函数plotobective。
例1
使用 MATLAB代码编写一个待优化的目标函数,使用函数plotobjective绘制编写的函数图形,并用遗传算法对目标函数进行优化求解。
解
在MATLAB文件编辑器中编写名称为GAtestfcn. m的函数代码如下:
function f = GAtestfcn(x)
for j= 1:size(x,1)
y= x(j,:);
templ = 0;
temp2 = 0;
y1 = y(1);
y2 = y(2);
for i = 1:10
templ = templ + i.* cos((i+1).*y1+i);
temp2 = temp2 + i.* cos((i+1).*y2+i);
end
f(j)= templ.*temp2;
end
使用plotobjective函数,在MATLAB命令行窗口输人下列代码:
plotobjective( @ GAtestfcn,[-1 1; -1 1])
得到结果
在MATLAB中可以查看函数plotobjective的代码如下:
function plotobjective(fcn,range)
%PLOTOBJECTIVE plot a fitness function in two dimensions
% plotObjective(fcn,range) where range is a 2 by 2 matrix in which each
% row holds the min and max values to range over in that dimension.
% Copyright 2003-2004 The MathWorks, Inc.
if(nargin == 0)
fcn = @rastriginsfcn;
range = [-5,5;-5,5];
end
pts = 100;
span = diff(range')/(pts - 1);
x = range(1,1): span(1) : range(1,2);
y = range(2,1): span(2) : range(2,2);
pop = zeros(pts * pts,2);
k = 1;
for i = 1:pts
for j = 1:pts
pop(k,:) = [x(i),y(j)];
k = k + 1;
end
end
values = feval(fcn,pop);
values = reshape(values,pts,pts);
surf(x,y,values)
shading interp
light
lighting phong
hold on
contour(x,y,values)
rotate3d
view(37,60)
使用遗传算法对目标函数优化求解时,首先需要设定目标函数和优化问题的变量个数。其中,GAtestfcn. m作为本题的目标函数,变量个数为两个。然后利用软件自带的遗传算法函数,对目标函数进行优化求解,在MATLAB命令
行输人如下代码:
[x, fval, exitflag, output] = ga( @GAtestfcn, 2)
从以上结果可以知道,最优解,最优解处的函数输出值,遗传算法的总代数为146。
注意:一般情况下,遗传算法的初始种群均是随机产生的,后面的种群则是通过当前
种群个体的适应度来获取的。
此外,遗传算法还提供了函数gaoptimset来实现目标函数优化结果的可视化。
在MATLAB命令行窗口运行以下代码来添加遗传算法的图形属性选项:
options = gaoptimset( 'PlotFcns',{@gaplotbestf,@gaplotstopping});
在MATLAB命令行中重新运行遗传算法函数如下:
[x, fval, exitflag, output] = ga(@ GAtestfcn, 2, options);
运行以上代码得到如图所示的遗传算法属性图。
在上图中,显示了“停止代数”满足了算法停止条件(百分比达到100%),此时优化问题求解终止。
注意:停滞代数的作用是,当目标函数在停止代数所设定代数内的加权平均变化小于设定值,则算法停止运行。
在遗传算法中,算法的“终止”属性是决定计算结果的重要参数。如果需要将算法的最大运行代数设为200,停滞代数为20,可以在MATLAB命令行窗口输人以下代码:
options = gaoptimset( options, 'Generations' , 200, 'StallGenLimit',20)
从上面得到的结果可知,算法最大运行代数Generations和停滞代数StallGenLimit
分别被设置为20和200。
重新运行遗传算法,求解例1的函数,运行以下代码:
[x, fval, exitflag, output] = ga(@ GAtestfcn,2,options)
按理说运行20代就应该停止了,但是这里确实达到了调试效果。
如图上面的属性可以根据自己的设置,然后在运行函数
这里先设置属性,然后运行代码即可进行调试,本篇就只写了三种属性,还有很多属性可以根据自己的要求设置。