模式搜索选项的效果
这个例子展示的是模式搜索的一些选项的效果。这些选项包括绘图、停止条件和其他用于加快解的算法控制。有关 patternsearch
算法的可用选项列表,请参阅 模式搜索算法选项表。
基本模式搜索算法非常简单:在当前点周围设置一个有限的网格,计算网格点上的目标函数(称为轮询),找到目标函数值提高时增加网格间距,未找到提高时减少网格间距。有关详细信息,请参阅模式搜索轮询的工作原理。此示例显示了一些网格缩放选项、网格大小停止条件以及除了轮询之外使用替代搜索方法的效果。
设置模式搜索问题
要最小化的问题是受线性等式和不等式约束的六个变量的二次函数。运行此示例时,目标函数 lincontest7
可用。
type lincontest7
function y = lincontest7(x) %LINCONTEST7 objective function. % y = LINCONTEST7(X) evaluates y for the input X. Make sure that x is a column % vector, whereas objective function gets a row vector. % Copyright 2003-2017 The MathWorks, Inc. x = x(:); %Define a quadratic problem in terms of H and f H = [36 17 19 12 8 15; 17 33 18 11 7 14; 19 18 43 13 8 16; 12 11 13 18 6 11; 8 7 8 6 9 8; 15 14 16 11 8 29]; f = [ 20 15 21 18 29 24 ]'; y = 0.5*x'*H*x + f'*x;
将函数句柄 @lincontest7
指定为目标函数。
objectiveFcn = @lincontest7;
目标函数接受长度为六的行向量。指定优化的初始点。
x0 = [2 1 0 9 1 0];
创建表示约束 Aineq*x <= Bineq
和 Aeq*x = Beq
的线性约束矩阵。有关详细信息,请参阅线性约束。
Aineq = [-8 7 3 -4 9 0 ]; Bineq = [7]; Aeq = [7 1 8 3 3 3; 5 0 5 1 5 8; 2 6 7 1 1 8; 1 0 0 0 0 0]; Beq = [84 62 65 1];
运行 patternsearch
求解器,并记下达到解所需的迭代次数和函数计算次数。
[X1,Fval,Exitflag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq,Aeq,Beq);
patternsearch stopped because the mesh size was less than options.MeshTolerance.
fprintf('The number of iterations is: %d\n', Output.iterations);
The number of iterations is: 80
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 737
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: 2189.18
添加可视化
通过指定选择两个绘图函数的选项来监控优化过程。绘图函数 psplotbestf
绘制每次迭代中的最佳目标函数值,绘图函数 psplotfuncount
绘制每次迭代中评估目标函数的次数。在元胞数组中设置这两个绘图函数。
opts = optimoptions(@patternsearch,'PlotFcn',{@psplotbestf,@psplotfuncount});
运行 patternsearch
求解器,包括 opts
参量。由于该问题没有上界或下界约束,也没有非线性约束,因此为第七、第八和第九个参量传递空数组([]
)。
[X1,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq, ...
Aeq,Beq,[],[],[],opts);
patternsearch stopped because the mesh size was less than options.MeshTolerance.
网格选项
模式搜索涉及评估网格中点的目标函数。网格的大小会影响解的速度。您可以使用选项控制网格的大小。
初始网格大小
每次迭代的网格都是添加到当前点的一组搜索方向的跨度,并按当前网格大小缩放。求解器默认以 1
的初始网格大小开始。要将初始网格大小从 1/2 开始,请设置 InitialMeshSize
选项。
opts = optimoptions(opts,'InitialMeshSize',1/2);
网格缩放
您可以缩放网格来改善缩放不佳的优化问题的最小化。缩放将模式旋转一定角度,并沿着搜索方向缩放。ScaleMesh
选项默认处于开启状态(true
),但如果问题得到很好的缩放,您可以将其关闭。一般来说,如果问题的缩放较小,将此选项设置为 true
可以减少函数计算的次数。对于这个问题,将 ScaleMesh
设置为 false
,因为 lincontest7
是一个良好缩放的目标函数。
opts = optimoptions(opts,'ScaleMesh',false);
网格加速器
与基于导数的优化方法相比,直接搜索方法需要进行许多函数计算。模式搜索算法可以快速找到最优点的邻域,但是在检测最小值方面可能会很慢。patternsearch
求解器可以通过使用加速器来减少函数计算的次数。当加速器打开(opts.AccelerateMesh = true
)时,求解器在达到最小网格大小后会迅速收缩网格大小。此选项仅推荐用于平滑问题;在其他类型的问题中,您可能会失去一些准确性。AccelerateMesh
选项默认是关闭的(false
)。对于这个问题,将 AccelerateMesh
设置为 true
,因为目标函数是平滑的。
opts = optimoptions(opts,'AccelerateMesh',true);
运行 patternsearch
求解器。
[X2,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq, ...
Aeq,Beq,[],[],[],opts);
patternsearch stopped because the mesh size was less than options.MeshTolerance.
fprintf('The number of iterations is: %d\n', Output.iterations);
The number of iterations is: 146
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 560
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: 2189.18
网格选项设置减少了迭代次数和函数计算次数,并且没有明显的准确性损失。
停止标准和容差
MeshTolerance
是网格大小的容差。如果网格大小小于 MeshTolerance
,求解器将停止。StepTolerance
是当前点到下一个点的变化的最小容差。FunctionTolerance
是当前点到下一个点的函数值变化的最小容差。
将 MeshTolerance
设置为 1e-7,比默认值小十倍。此设置可以增加函数计算和迭代的次数,并可得到更准确的解。
opts.MeshTolerance = 1e-7;
模式搜索中的搜索方法
根据 SearchFcn
选项的值,模式搜索算法可以在每次迭代时使用额外的搜索方法。当您使用 SearchFcn
指定搜索方法时,patternsearch
会首先执行指定的搜索,然后进行网格搜索。如果搜索方法成功,patternsearch
将跳过该迭代的网格搜索(通常称为轮询函数)。如果搜索方法无法改进当前点,patternsearch
将执行网格搜索。
您可以为 SearchFcn
指定不同的搜索方法,包括 searchga
和 searchneldermead
,它们是优化算法。仅在第一次迭代中使用这两种搜索方法,这是默认设置。每次迭代使用其中任何一种方法都可能无法改善结果,并且计算成本较高。但是,您可以使用 searchlhs
方法,该方法在每次迭代或每 10 次迭代时生成拉丁超立方体点。
其他搜索方法选择包括轮询方法,例如正基 N+1 或正基 2N。建议的策略是使用正基 N+1(最多需要 N+1 个点来创建一个模式)作为搜索方法,并使用正基 2N(需要 2N 个点来创建一个模式)作为轮询方法。
更新 options 结构体以使用 positivebasisnp1
作为搜索方法。因为正基 2N 是 PollFcn
选项的默认值,所以不要设置该选项。
opts.SearchFcn = @positivebasisnp1;
运行 patternsearch
求解器。
[X5,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq,Aeq,Beq, ...
[],[],[],opts);
patternsearch stopped because the change in X and the mesh size were less than options.StepTolerance.
fprintf('The number of iterations is: %d\n', Output.iterations);
The number of iterations is: 44
fprintf('The number of function evaluations is: %d\n', Output.funccount);
The number of function evaluations is: 562
fprintf('The best function value found is: %g\n', Fval);
The best function value found is: 2189.18
尽管网格容差小于其先前的值并且是停止求解器的停止条件,但总迭代次数和函数计算仍然会减少。