Main Content

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

使用缓存

通常,在模式搜索的任何给定迭代中,一些网格点可能与之前迭代的网格点重合。默认情况下,模式搜索会重新计算这些网格点处的目标函数,即使它已经计算了它们的值并发现它们不是最优的。如果计算目标函数需要很长时间,这会使模式搜索运行的时间变得更长。

您可以通过使用缓存来消除这些冗余计算,即存储模式搜索已经访问过的点的历史记录。为此,请在 Cache 选项中将 Cache 设置为 On。在每次轮询时,模式搜索都会检查当前网格点是否在缓存中某个点的指定容差 Tolerance 范围内。如果是这样,搜索就不会计算该点的目标函数,而是使用缓存的函数值并转到下一个点。

注意

Cache 设置为 On 时,模式搜索可能无法识别当前网格中可以改进目标函数的点,因为它位于缓存中某个点的指定容差范围内。因此,将 Cache 设置为 On 时,模式搜索可能比将 Cache 设置为 Off 时运行更多的迭代。通常,将容差的值保持非常小是一个好主意,尤其是对于高度非线性的目标函数而言。

注意

当并行运行求解器时,Cache 不起作用。

例如,将使用 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' 轮询方法。关闭显示器。

    opts = optimoptions('patternsearch','PollMethod','GSSPositiveBasis2N',...
        'PlotFcn',{@psplotbestf,@psplotfuncount},'Display','none');
  3. 运行优化。

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

模式搜索完成后,图表如下图所示。

请注意,函数总数为 758。

现在,将 Cache 选项设置为 'On' 并再次运行示例。

opts.Cache = 'on';
[x2,fval2,exitflag2,output2] = patternsearch(F,x0,...
    Aineq,bineq,Aeq,beq,[],[],[],opts);

总函数数量减少至 734 个。

[output.funccount,output2.funccount]
ans =

   758   734

另请参阅

相关主题