主要内容

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

模式搜索选项的效果

这个例子展示的是模式搜索的一些选项的效果。这些选项包括绘图、停止条件和其他用于加快解的算法控制。有关 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 <= BineqAeq*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.

Figure Pattern Search contains 2 axes objects. Axes object 1 with title Best Function Value: 2189.18, xlabel Iteration, ylabel Function value contains an object of type scatter. Axes object 2 with title Total Function Evaluations: 737, xlabel Iteration, ylabel Function evaluations contains an object of type scatter.

网格选项

模式搜索涉及评估网格中点的目标函数。网格的大小会影响解的速度。您可以使用选项控制网格的大小。

初始网格大小

每次迭代的网格都是添加到当前点的一组搜索方向的跨度,并按当前网格大小缩放。求解器默认以 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.

Figure Pattern Search contains 2 axes objects. Axes object 1 with title Best Function Value: 2189.18, xlabel Iteration, ylabel Function value contains an object of type scatter. Axes object 2 with title Total Function Evaluations: 560, xlabel Iteration, ylabel Function evaluations contains an object of type scatter.

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 指定不同的搜索方法,包括 searchgasearchneldermead,它们是优化算法。仅在第一次迭代中使用这两种搜索方法,这是默认设置。每次迭代使用其中任何一种方法都可能无法改善结果,并且计算成本较高。但是,您可以使用 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.

Figure Pattern Search contains 2 axes objects. Axes object 1 with title Best Function Value: 2189.18, xlabel Iteration, ylabel Function value contains an object of type scatter. Axes object 2 with title Total Function Evaluations: 562, xlabel Iteration, ylabel Function evaluations contains an object of type scatter.

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

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

另请参阅

主题