基于问题的模式搜索选项的影响
这个例子展示了基于问题的方法中模式搜索的一些选项的效果。这些选项包括绘图、停止条件和其他用于加快解的算法控制。有关 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;
创建一个六元素优化变量 x
作为行向量。
x = optimvar("x",1,6);
用目标函数 lincontest7(x)
创建一个优化问题。
prob = optimproblem("Objective",lincontest7(x));
指定优化的初始点。
x0.x = [2 1 0 9 1 0];
为约束 Aineq*x' <= Bineq
和 Aeq*x' = Beq
创建线性约束矩阵。您需要在这些约束中使用 x'
,因为 x
是一个行向量。
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]'; prob.Constraints.Aineq = Aineq*x' <= Bineq; prob.Constraints.Aeq = Aeq*x' == Beq;
运行 patternsearch
求解器,并记下达到解所需的迭代次数和函数计算次数。
[sol,Fval,eflag,output] = solve(prob,x0,"Solver","patternsearch");
Solving problem using patternsearch. 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: 76
fprintf('The number of function evaluations is: %d\n', output.funccount);
The number of function evaluations is: 709
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
参量。
[sol2,Fval2,eflag2,output2] = solve(prob,x0,"Solver","patternsearch",... "Options",opts);
Solving problem using patternsearch. patternsearch stopped because the mesh size was less than options.MeshTolerance.
网格选项
模式搜索涉及评估网格中点的目标函数。网格的大小会影响解的速度。您可以通过设置选项来控制网格的大小。
初始网格大小
每次迭代的网格都是添加到当前点的一组搜索方向的跨度,并按当前网格大小缩放。求解器默认以 1
的初始网格大小开始。要以初始网格大小 1/2 开始,请设置 InitialMeshSize
选项。当初始点相对于尺寸为 1 的网格较好时,这可以节省一次迭代和几次函数计算。
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
求解器。
[sol3,Fval3,eflag3,output3] = solve(prob,x0,"Solver","patternsearch",... "Options",opts);
Solving problem using patternsearch. patternsearch stopped because the mesh size was less than options.MeshTolerance.
fprintf('The number of iterations is: %d\n', output3.iterations);
The number of iterations is: 144
fprintf('The number of function evaluations is: %d\n', output3.funccount);
The number of function evaluations is: 753
fprintf('The best function value found is: %g\n', Fval3);
The best function value found is: 2189.18
网格选项设置减少了迭代次数和函数计算次数,并且没有明显的准确性损失。
停止标准和容差
MeshTolerance
是网格大小的容差。如果网格大小小于 MeshTolerance
,求解器将停止。StepTolerance
是当前点到下一个点的变化的最小容差。FunctionTolerance
是当前点到下一个点的函数值变化的最小容差。
将 MeshTolerance
设置为 1e-7,比默认值小 10 倍。此设置可以增加函数计算和迭代的次数,并可得到更准确的解。
opts.MeshTolerance = 1e-7;
模式搜索中的搜索方法
根据 SearchFcn
选项的值,模式搜索算法可以在每次迭代时使用额外的搜索方法。当您使用 SearchFcn
指定搜索方法时,patternsearch
会首先执行指定的搜索,然后进行网格搜索。如果搜索方法成功,patternsearch
将跳过该迭代的网格搜索(通常称为轮询函数)。如果搜索方法无法改进当前点,patternsearch
将执行网格搜索。
您可以为 SearchFcn
指定不同的搜索方法,包括 searchga
和 searchneldermead
,它们是优化算法。仅在第一次迭代中使用这两种搜索方法,这是默认设置。每次迭代使用其中任何一种方法都可能无法改善结果,并且计算成本较高。但是,您可以使用 searchlhs
方法,该方法在每次迭代或每 10 次迭代时生成拉丁超立方体点。
其他搜索方法选择包括轮询方法,例如正基 N+1 或正基 2N。建议的策略是使用正基 N+1(最多需要 N+1 个点来创建一个模式)作为搜索方法,并使用正基 2N(需要 2N 个点来创建一个模式)作为轮询方法。
更新选项结构体以使用 positivebasisnp1
作为搜索方法。因为正基 2N 是 PollFcn
选项的默认值,所以不要设置该选项。
opts.SearchFcn = @positivebasisnp1;
运行 patternsearch
求解器。
[sol4,Fval4,eflag4,output4] = solve(prob,x0,"Solver","patternsearch",... "Options",opts);
Solving problem using patternsearch. patternsearch stopped because the mesh size was less than options.MeshTolerance.
fprintf('The number of iterations is: %d\n', output4.iterations);
The number of iterations is: 48
fprintf('The number of function evaluations is: %d\n', output4.funccount);
The number of function evaluations is: 605
fprintf('The best function value found is: %g\n', Fval4);
The best function value found is: 2189.18
尽管网格容差小于其先前的值并且是停止求解器的停止条件,但总迭代次数和函数计算仍然会减少。