这个例子展示了如何使用遗传算法和另一种优化方法的混合方案来优化一个函数。遗传算法
可以快速地达到一个局部最小值的邻域,但它需要许多函数计算才能达到收敛。要加快解决过程,首先运行遗传算法
对少数几代人来说,接近最优点。然后使用从遗传算法
作为另一个优化求解器的初始点,以执行更快、更有效的局部搜索。
本例使用Rosenbrock函数(也称为Dejong的第二个函数)作为适应度函数:
.
Rosenbrock函数在最优化中臭名昭著,因为当试图最小化这个函数时,大多数方法都表现出缓慢的收敛速度。Rosenbrock函数在x* =(1,1)处有一个唯一的最小值,在这里它有一个函数值 .
罗森布罗克的代码在dejong2fcn
文件。
类型dejong2fcn.m
function scores = dejong2fcn(pop) % dejong2fcn计算dejong的第二个函数。%这个函数也被称为Rosenbrock的函数% Copyright 2003-2004 The MathWorks, Inc. scores = 0 (size(pop,1),1);For I = 1:size(pop,1) p = pop(I,:);分数(i) = 100 * (p (1) ^ 2 - p (2)) ^ 2 + (1 - p (1)) ^ 2;结束
在-2 <= x(1) <= 2范围内绘制Rosenbrock函数;-2 <= x(2) <=2。
plotobjective (@dejong2fcn [2 2; 2 2]);
首先,使用遗传算法
单独求罗森布罗克函数的最小值。
FitnessFcn = @dejong2fcn;numberOfVariables = 2;
包括绘图功能,以监控优化过程。
选择= optimoptions (@ga,“PlotFcn”, {@gaplotbestf, @gaplotstopping});
设置随机数流的再现性,并运行遗传算法
使用选项。
rng默认的[x, fval] = ga (FitnessFcn numberOfVariables ,[],[],[],[],[],[],[], 选项)
优化终止:适应度值的平均变化小于选项。
x =1×20.3454 - 0.1444
fval = 0.4913
使用默认的停止条件,遗传算法
没有提供一个非常准确的解决方案。您可以更改停止条件以尝试找到更准确的解决方案,但是遗传算法
需要许多函数计算来接近全局最优x* =(1,1)。
相反,执行一个更有效的本地搜索,从哪里开始遗传算法
使用中的混合功能选项停止遗传算法
.
混合函数从以下点开始遗传算法
停止。混合函数的选择是fminsearch
,patternsearch
,或fminunc
.因为这个优化示例是平滑和无约束的,请使用fminunc
为混合函数。提供fminunc
将plot选项作为指定混合函数时的附加参数。
fminuncOptions = optimoptions (@fminunc,“PlotFcn”, {“optimplotfval”,“optimplotx”});选择= optimoptions(选项,“HybridFcn”, {@fminunc, fminuncOptions});
运行遗传算法
再次与fminunc
为混合函数。
[x, fval exitflag,输出]= ga (FitnessFcn numberOfVariables ,[],[],[],[],[],[],[], 选项)
优化终止:适应度值的平均变化小于选项。
局部最小值。由于梯度的大小小于最优性公差的值,优化完成。
x =1×21.0000 - 1.0000
fval = 1.7215 e-11
exitflag = 1
输出=结构体字段:问题类型:'unconstrained' rngstate: [1x1 struct] generations: 51 funccount: 2534 message: 'Optimization terminated: average change in the fitness value less than options.FunctionTolerance....' maxconstraint: [] hybridflag: 1
的遗传算法
图中显示了每一代人口的最佳值和平均值。情节标题确定了最佳价值遗传算法
当它停止。混合函数fminunc
从发现的最佳点开始遗传算法
.的fminunc
图显示了解决方案x
和fval
,这是由于使用遗传算法
和fminunc
在一起。在这种情况下,使用混合函数可以提高求解的准确性和效率。的output.hybridflag
字段显示fminunc
以退出标志1停止,表示x
是一个真正的局部极小值。