Main Content

本页采用了机器翻译。点击此处可查看英文原文。

基于问题的模式搜索选项的影响

这个例子展示了基于问题的方法中模式搜索的一些选项的效果。这些选项包括绘图、停止条件和其他用于加快解的算法控制。有关 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' <= BineqAeq*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 指定不同的搜索方法,包括 searchgasearchneldermead,它们是优化算法。仅在第一次迭代中使用这两种搜索方法,这是默认设置。每次迭代使用其中任何一种方法都可能无法改善结果,并且计算成本较高。但是,您可以使用 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

尽管网格容差小于其先前的值并且是停止求解器的停止条件,但总迭代次数和函数计算仍然会减少。

另请参阅

|

相关主题