主要内容

使用缓存

通常,在任何给定模式搜索的迭代中,某些网格点可能与先前迭代时的网格点一致。默认情况下,模式搜索即使已经计算出它们的值并发现它们不是最佳的,也可以在这些网格点处重新计算目标函数。如果计算目标函数需要很长时间,则可以使模式搜索的运行明显更长。

您可以通过使用缓存来消除这些冗余计算,也就是说,通过存储模式搜索已经访问的点的历史记录。为此,设置缓存缓存选项。在每个民意调查中,模式搜索检查以查看当前的网格点是否在指定的公差之内,宽容,缓存中的一个点。如果是这样,搜索不会计算该点的目标函数,而是使用缓存的函数值并将其移至下一个点。

笔记

什么时候缓存被设定为,模式搜索可能无法识别当前网格中改善目标函数的点,因为它在缓存中的点的指定公差范围内。结果,模式搜索可能会进行更多迭代缓存调成而不是缓存调成离开。通常是一个好主意宽容很小,特别是对于高度非线性的目标函数。

笔记

缓存并行运行求解器时不起作用。

例如,设置了所描述的问题使用PatternSearch限制最小化并优化实时编辑器任务如下:

  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];
  2. 创建选项以绘制最佳功能值和功能评估。因为问题具有线性约束,请使用'gsspositivebasis2n'投票方法。关闭显示器。

    opts = optimoptions(“模式搜索”,,,,“ pollmethod”,,,,'gsspositivebasis2n',,,,...'plotfcn',{@psplotbestf,@psplotfuncount},'展示',,,,'没有任何');
  3. 运行优化。

    [x,fval,exitflag,output] = patternsearch(@lincontest7,x0,...aineq,bineq,aeq,beq,[],[],[],opts);

在模式搜索完成后,这些图出现如下图所示。

请注意,总功能计数为758。

现在,设置缓存选项'上'并再次运行示例。

opts.cache ='上';[x2,fval2,exitflag2,output2] = patternsearch(@lincontest7,x0,...aineq,bineq,aeq,beq,[],[],[],opts);

总功能数量减少到735。

[output.funccount,output2.funccount]
ANS = 758 735

也可以看看

相关话题