主要内容

模式搜索选项的效果

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

为模式搜索设置一个问题

最小化问题是一个受线性等式和不等式约束的六变量二次函数。目标函数,lincontest7,包含在全局优化工具箱中。

类型lincontest7
函数y = lincontest7(x);% LINCONTEST7目标函数。% y = LINCONTEST7(X)为输入X计算y,确保X是列%向量,而目标函数获取的是行向量。% Copyright 2003-2004 The MathWorks, Inc. x = x';用H和f定义一个二次问题(From web unknown source)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 < = BineqAeq * x =说真的.有关详细信息,请参见线性约束条件

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];Beq = [84 62 65 1];

运行patternsearch求解器,并注意达到解决方案所需的迭代次数和功能评估。

(X1, Fval, Exitflag、输出)= patternsearch (x0, objectiveFcn Aineq, Bineq, Aeq, Beq);
优化终止:网格尺寸小于选项。网格公差。
流('迭代次数为:%d\n', Output.iterations);
迭代次数为:132
流('函数的计算次数为:%d\n', Output.funccount);
函数求值次数为:1531
流('找到的最佳函数值是:%g\n', Fval);
找到的最佳函数值为:2189.03

添加可视化

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

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

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

(X1, Fval, ExitFlag、输出)= patternsearch (x0, objectiveFcn Aineq, Bineq,...Aeq,说真的 ,[],[],[], 选择);
优化终止:网格尺寸小于选项。网格公差。

图模式搜索包含2个轴对象。标题为“最佳函数值:2189.03”的轴对象1包含一个类型为line的对象。标题为“总函数计算:1531”的axis对象2包含一个类型为line的对象。

网格选项

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

初始网格大小

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

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

网格尺度

您可以缩放网格,以改进规模较差的优化问题的最小化。缩放会在一定程度上旋转模式,并沿着搜索方向缩放。的ScaleMesh选择已开启(真正的),但如果问题可以很好地扩展,则可以将其关闭。一般来说,如果问题的可伸缩性很差,则将此选项设置为真正的可以减少函数计算的次数。对于这个问题,setScaleMesh,因为lincontest7是一个标度良好的目标函数。

选择= optimoptions(选择,“ScaleMesh”、假);

网加速器

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

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

运行patternsearch解算器。

(X2, Fval, ExitFlag、输出)= patternsearch (x0, objectiveFcn Aineq, Bineq,...Aeq,说真的 ,[],[],[], 选择);
优化终止:网格尺寸小于选项。网格公差。

图模式搜索包含2个轴对象。标题为“最佳函数值:2189.03”的轴对象1包含一个类型为line的对象。标题为“总函数计算:868”的axis对象2包含一个类型为line的对象。

流('迭代次数为:%d\n', Output.iterations);
迭代次数为:83
流('函数的计算次数为:%d\n', Output.funccount);
函数求值次数为:868次
流('找到的最佳函数值是:%g\n', Fval);
找到的最佳函数值为:2189.03

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

停止标准和公差

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

设置MeshTolerance到1e-7,比默认值小10倍。此设置可以增加函数评估和迭代的次数,并可以得到更精确的解决方案。

选择。MeshTolerance = 1 e;

模式搜索中的搜索方法

的值为基础,模式搜索算法可以在每次迭代时使用额外的搜索方法SearchFcn选择。使用。指定搜索方法时SearchFcnpatternsearch在网格搜索之前,首先执行指定的搜索。如果搜索方法成功,patternsearch对该迭代跳过网格搜索(通常称为poll函数)。如果搜索方法不能改善当前点,patternsearch执行网格搜索。

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

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

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

选择。SearchFcn = @positivebasisnp1;

运行patternsearch解算器。

[X5, Fval ExitFlag、输出]= patternsearch (x0, objectiveFcn Aineq, Bineq, Aeq,说真的,...[]、[][],选择);
优化终止:网格尺寸小于选项。网格公差。

图模式搜索包含2个轴对象。标题为“最佳函数值:2189.03”的轴对象1包含一个类型为line的对象。标题为“总函数计算:788”的axis对象2包含一个类型为line的对象。

流('迭代次数为:%d\n', Output.iterations);
迭代次数为:63
流('函数的计算次数为:%d\n', Output.funccount);
函数求值次数为:788次
流('找到的最佳函数值是:%g\n', Fval);
找到的最佳函数值为:2189.03

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

相关的话题