使用缓存
通常,在模式搜索的任何给定迭代中,一些网格点可能与之前迭代的网格点重合。默认情况下,模式搜索会重新计算这些网格点处的目标函数,即使它已经计算了它们的值并发现它们不是最优的。如果计算目标函数需要很长时间,这会使模式搜索运行的时间变得更长。
您可以通过使用缓存来消除这些冗余计算,即存储模式搜索已经访问过的点的历史记录。为此,请在 Cache 选项中将 Cache 设置为 On
。在每次轮询时,模式搜索都会检查当前网格点是否在缓存中某个点的指定容差 Tolerance 范围内。如果是这样,搜索就不会计算该点的目标函数,而是使用缓存的函数值并转到下一个点。
注意
当 Cache 设置为 On
时,模式搜索可能无法识别当前网格中可以改进目标函数的点,因为它位于缓存中某个点的指定容差范围内。因此,将 Cache 设置为 On
时,模式搜索可能比将 Cache 设置为 Off
时运行更多的迭代。通常,将容差的值保持非常小是一个好主意,尤其是对于高度非线性的目标函数而言。
注意
当并行运行求解器时,Cache
不起作用。
例如,将使用 patternsearch 和 Optimize 实时编辑器任务进行约束最小化中描述的问题设置如下:
在命令行输入以下内容:
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;
创建选项来绘制最佳函数值和函数计算。因为问题有线性约束,所以使用
'GSSPositiveBasis2N'
轮询方法。关闭显示器。opts = optimoptions('patternsearch','PollMethod','GSSPositiveBasis2N',... 'PlotFcn',{@psplotbestf,@psplotfuncount},'Display','none');
运行优化。
[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