主要内容

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

设置网格选项

网格扩张和收缩

MeshExpansionFactorMeshContractionFactor 选项控制每次迭代时网格大小的扩大或收缩程度。使用默认的 MeshExpansionFactor2,模式搜索在每次成功轮询后将网格大小乘以 2。使用默认的 MeshContractionFactor0.5,模式搜索会在每次轮询不成功后将网格大小乘以 0.5

您可以通过将 @psplotmeshsize 设置为 PlotFcn 选项来查看模式搜索中网格大小的膨胀和收缩。为了在命令行中显示网格大小和目标函数的值,请将 Display 选项设置为 'iter'

例如,将使用 patternsearch 和 Optimize 实时编辑器任务进行约束最小化中描述的问题设置如下:

  1. 在命令行输入以下内容:

    x0 = [2 1 0 9 1 0]';
    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 9; 1 -1 2 -2 3 -3];
    beq = [84 62 65 1];
    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 ]';
     
    F = @(x)0.5*x'*H*x + f'*x;
  2. 创建选项以使用 GSSPositiveBasis2N 轮询方法、提供迭代显示并绘制网格大小。

    options = optimoptions('patternsearch',...
        'PollMethod','GSSPositiveBasis2N',...
        'PlotFcn',@psplotmeshsize,...
        'Display','iter');
  3. 运行优化。

    [x,fval,exitflag,output] = patternsearch(F,x0,...
        Aineq,bineq,Aeq,beq,[],[],[],options);

为了更清楚地看到网格大小的变化,将 y 轴更改为对数缩放,如下所示:

  1. 从绘图窗口的编辑菜单中选择轴属性

  2. 在属性编辑器中,选择标尺选项卡。

  3. YScale 设置为 Log

在 MATLAB® 属性编辑器中更新这些设置将显示下图中的图表。

前 5 次迭代均成功完成轮询,因此在此期间网格大小稳步增加。通过查看命令行显示,您可以看到第一次不成功的轮询发生在第 6 次迭代中。

Iter     f-count          f(x)      MeshSize     Method
    0        1        2273.76             1      
    1        2        2251.69             2     Successful Poll
    2        3        2209.86             4     Successful Poll
    3        4        2135.43             8     Successful Poll
    4        5        2023.48            16     Successful Poll
    5        6        1947.23            32     Successful Poll
    6       15        1947.23            16     Refine Mesh

请注意,第 5 次迭代成功后,下一次迭代的网格大小将加倍。但在第 6 次迭代中,网格大小乘以了 0.5,但这次迭代失败了。

要查看 MeshExpansionFactorMeshContractionFactor 如何影响模式搜索,请将 MeshExpansionFactor 设置为 3.0 并将 MeshContractionFactor 设置为 2/3

options = optimoptions(options,'MeshExpansionFactor',3.0,...
    'MeshContractionFactor',2/3);
[x,fval,exitflag,output] = patternsearch(F,x0,...
    Aineq,bineq,Aeq,beq,[],[],[],options);

最终的目标函数值与之前的设置大致相同,但求解器需要更长的时间才能达到该点。

当您将 y 轴的缩放更改为对数时,网格大小图将如下图所示。

请注意,与默认值 MeshExpansionFactor 相比,将 3.0 设置为 2.0 时,网格大小增加得更快,而与默认值 MeshContractionFactor 相比,将 2/3 设置为 0.5 时,网格大小减小得更慢。

网格加速器

网格加速器可以通过减少达到网格容差所需的迭代次数,使模式搜索更快地收敛到最优点。当网格大小低于某个值时,模式搜索会将网格大小收缩一个小于 MeshContractionFactor 因子的因子。网格加速器仅适用于 GPS 和 GSS 算法。

注意

为了获得最佳效果,请使用网格加速器来解决目标函数在最优点附近不太陡峭的问题,否则可能会失去一些准确性。对于可微问题,这意味着导数的绝对值在解附近不会太大。

要使用网格加速器,请将 AccelerateMesh 选项设置为 true

例如,将使用 patternsearch 和 Optimize 实时编辑器任务进行约束最小化中描述的问题设置如下:

  1. 在命令行输入以下内容:

    x0 = [2 1 0 9 1 0];
    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 9; 1 -1 2 -2 3 -3];
    beq = [84 62 65 1];
    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 ]';
     
    F = @(x)0.5*x'*H*x + f'*x;
  2. 创建选项,包括网格加速器。

    options = optimoptions('patternsearch',...
        'PollMethod','GSSPositiveBasis2N',...
        'Display','iter','AccelerateMesh',true);
  3. 运行优化。

    [x,fval,exitflag,output] = patternsearch(F,x0,... 
       Aineq,bineq,Aeq,beq,[],[],[],options);

patternsearch 在 78 次迭代中完成,而当网格加速器未打开时则需要 84 次迭代。您可以在迭代显示中看到网格加速器的效果。运行具有和不具有网格加速的示例。直到第 70 次迭代时网格大小都相同,但在第 71 次迭代时网格大小有所不同。MATLAB 命令窗口在没有加速器的情况下显示第 70 次和第 71 次迭代的以下行。

Iter     f-count        f(x)       MeshSize      Method
   70      618        1919.54     6.104e-05     Refine Mesh
   71      630        1919.54     3.052e-05     Refine Mesh

注意网格大小乘以了 0.5,默认值为 MeshContractionFactor

为了进行比较,命令窗口使用加速器显示相同迭代次数的以下行。

Iter     f-count        f(x)       MeshSize      Method
   70      618        1919.54     6.104e-05     Refine Mesh
   71      630        1919.54     1.526e-05     Refine Mesh

在这种情况下,网格大小乘以 0.25

另请参阅

主题