主要内容

模式搜索选项的影响

这个例子展示了一些模式搜索选项的效果。选项包括绘图、停止标准和其他加速解决方案的算法控制。的可用选项列表patternsearch算法,看到模式搜索算法选项表

为模式搜索设置一个问题

最小化问题是受线性等式和不等式约束的六变量的二次函数。目标函数,lincontest7,在运行此示例时可用。

类型lincontest7
函数y = lincontest7(x) %% y = LINCONTEST7(X)为输入X计算y。确保X是一个列%向量,而目标函数得到一个行向量。版权所有The MathWorks, Inc. x = x(:);用H和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;

目标函数接受一个长度为6的行向量。为优化指定一个初始点。

X0 = [2 1 0 9 1 0];

创建表示约束的线性约束矩阵Aineq*x <= Bineq而且Aeq*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);
优化终止:网格尺寸小于options.MeshTolerance。
流(迭代次数为:%d\n, Output.iterations);
迭代次数为:80
流(函数求值的次数是:%d\n, Output.funccount);
函数求值的数量为:737
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值为:2189.18

添加可视化

通过指定选择两个绘图函数的选项来监视优化过程。图函数psplotbestf绘制每次迭代的最佳目标函数值,并绘制函数psplotfuncount绘制目标函数在每次迭代中被评估的次数。在单元格数组中设置这两个绘图函数。

Opts = optimoptions(@patternsearch,“PlotFcn”, {@psplotbestf, @psplotfuncount});

运行patternsearch求解器,包括选择论点。由于问题没有上界或下界约束,也没有非线性约束,因此传递空数组([])用于第7、8和9个参数。

[X1,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq,...Aeq,说真的 ,[],[],[], 选择);
优化终止:网格尺寸小于options.MeshTolerance。

{

网格选项

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

初始网格尺寸

每次迭代的网格是一组搜索方向的跨度,这些搜索方向被添加到当前点,按当前网格大小缩放。求解器的初始网格大小为1默认情况下。开始初始网格大小为1/2,设置InitialMeshSize选择。

Opts = optimoptions(Opts,“InitialMeshSize”1/2);

网格尺度

您可以缩放网格以提高缩放不好的优化问题的最小化。缩放将模式旋转一定程度,并沿搜索方向缩放。的ScaleMesh选项已开启(真正的),但如果问题的规模很好,则可以将其关闭。一般来说,如果问题的规模不好,请将此选项设置为真正的可以减少函数求值的次数。对于这道题,设ScaleMesh,因为lincontest7是一个缩放良好的目标函数。

Opts = optimoptions(Opts,“ScaleMesh”、假);

网加速器

与基于导数的优化方法相比,直接搜索方法需要进行许多函数计算。模式搜索算法可以快速找到最优点的邻域,但在检测最小值本身时速度较慢。的patternsearch求解器可以通过使用加速器来减少函数计算的数量。当加速器打开时(选择。AccelerateMesh = true)时,求解器在达到最小网格尺寸后迅速收缩网格尺寸。此选项仅推荐用于平滑问题;在其他类型的问题中,你可能会失去一些准确性。的AccelerateMesh选项已关闭()。对于这道题,设AccelerateMesh真正的因为目标函数是光滑的。

Opts = optimoptions(Opts,“AccelerateMesh”,真正的);

运行patternsearch解算器。

[X2,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq,...Aeq,说真的 ,[],[],[], 选择);
优化终止:网格尺寸小于options.MeshTolerance。

{

流(迭代次数为:%d\n, Output.iterations);
迭代次数为:146
流(函数求值的次数是:%d\n, Output.funccount);
函数求值的数量是:560
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值为:2189.18

网格选项设置减少了迭代次数和函数计算次数,并且没有明显的准确性损失。

停止标准和公差

MeshTolerance是对网目尺寸的公差。如果网目尺寸小于MeshTolerance,解算器停止。StepTolerance是当前点到下一点变化上的最小容差。FunctionTolerance是函数值从当前点到下一点变化的最小容差。

设置MeshTolerance变为1e-7,小于默认值的10倍。此设置可以增加函数计算和迭代的数量,并可以得到更准确的解决方案。

选择。MeshTolerance = 1e-7;

模式搜索中的搜索方法

的值,模式搜索算法可以在每次迭代中使用额外的搜索方法SearchFcn选择。指定搜索方法时使用SearchFcnpatternsearch在网格搜索之前,首先执行指定的搜索。如果搜索方法成功,patternsearch跳过该迭代的网格搜索,通常称为轮询函数。如果搜索方法无法改进当前点,patternsearch执行网格搜索。

可以指定不同的搜索方法SearchFcn,包括searchga而且searchneldermead,这是优化算法。只在第一次迭代中使用这两个搜索方法,这是默认设置。在每次迭代中使用这两种方法中的任何一种都不能改善结果,而且计算成本可能很高。但是,您可以使用searchlhs方法,该方法在每次迭代或可能每10次迭代时生成拉丁超立方点。

搜索方法的其他选择包括投票方法,如正基N+1或正基2N。推荐的策略是使用正基N+1(最多需要N+1个点来创建一个模式)作为搜索方法,使用正基2N(需要2N个点来创建一个模式)作为投票方法。

更新要使用的选项结构positivebasisnp1作为搜索方法。因为正基底2N是默认的PollFcn选项,不要设置那个选项。

选择。SearchFcn = @positivebasisnp1;

运行patternsearch解算器。

[X5,Fval,ExitFlag,Output] = patternsearch(objectiveFcn,x0,Aineq,Bineq,Aeq,Beq,...[]、[][],选择);
优化终止:X的变化小于选项。步进公差。

{

流(迭代次数为:%d\n, Output.iterations);
迭代次数为:44
流(函数求值的次数是:%d\n, Output.funccount);
函数求值的数量是:562
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值为:2189.18

迭代和函数计算的总数减少,即使网格公差小于它之前的值,并且是停止求解器的停止准则。

相关的话题