主要内容

模式搜索选项的效果

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

为模式搜索设置一个问题

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

类型lincontest7
函数y = lincontest7(x) % lincontest7目标函数。% 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 =说真的.有关详细信息,请参见线性约束条件

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、输出)= patternsearch (x0, objectiveFcn Aineq, Bineq, Aeq, Beq);
优化终止:网格尺寸小于options.MeshTolerance。
流('迭代次数为:%d\n', Output.iterations);
迭代的次数是:80
流('函数的计算次数为:%d\n', Output.funccount);
函数求值的数量是:737
流('找到的最佳函数值是:%g\n', Fval);
找到的最佳函数值是:2189.18

添加可视化

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

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

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

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

{

网格选项

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

初始网格大小

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

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

网格尺度

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

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

网加速器

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

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

运行patternsearch解算器。

(X2, Fval, ExitFlag、输出)= patternsearch (x0, objectiveFcn 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 = 1 e;

模式搜索中的搜索方法

的值,模式搜索算法可以在每次迭代中使用额外的搜索方法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、输出]= patternsearch (x0, objectiveFcn Aineq, Bineq, Aeq,说真的,...[]、[][],选择);
优化终止:更改X小于options.StepTolerance。

{

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

迭代和函数计算的总次数减少了,即使网格公差比以前的值小,并且是停止求解器的停止标准。

相关的话题

Baidu
map