主要内容

模式搜索选项的效果,基于问题

这个例子展示了基于问题的方法中模式搜索的一些选项的效果。选项包括绘图、停止标准和其他加速解决方案的算法控制。的可用选项列表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;

创建一个六元素优化变量x作为一个行向量。

X = optimvar(“x”1、6);

用目标函数创建一个优化问题lincontest7 (x)

问题=优化问题(“客观”lincontest7 (x));

为优化指定一个初始点。

x0。x= [2 1 0 9 1 0];

为约束创建线性约束矩阵Aineq*x' <= Bineq而且Aeq*x' = Beq.你需要使用x '在这些约束条件下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]';probe . constraints .Aineq = Aineq*x' <= Bineq;probe . constraints .Aeq = Aeq*x' == Beq;

运行patternsearch求解器,并注意到达解决方案所需的迭代和函数计算的数量。

[sol,Fval,eflag,output] = solve(prob,x0,“规划求解”“patternsearch”);
使用模式搜索解决问题。优化终止:网格尺寸小于options.MeshTolerance。
流(迭代次数为:%d\n, output.iterations);
迭代次数为:76
流(函数求值的次数是:%d\n, output.funccount);
函数求值的数量是:709
流(找到的最佳函数值是:%g\n, Fval);
找到的最佳函数值为:2189.18

添加可视化

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

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

运行patternsearch求解器,包括选择论点。

[sol2,Fval2,eflag2,output2] = solve(prob,x0,“规划求解”“patternsearch”...“选项”、选择);
使用模式搜索解决问题。优化终止:网格尺寸小于options.MeshTolerance。

{

网格选项

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

初始网格尺寸

每次迭代的网格是一组搜索方向的跨度,这些搜索方向被添加到当前点,按当前网格大小缩放。求解器的初始网格大小为1默认情况下。开始与初始网格大小的1/2,设置InitialMeshSize选择。当初始点相对于大小为1的网格很好时,这可以节省一次迭代和多次函数计算。

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

网格尺度

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

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

网加速器

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

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

运行patternsearch解算器。

[sol3,Fval3,eflag3,output3] = solve(prob,x0,“规划求解”“patternsearch”...“选项”、选择);
使用模式搜索解决问题。优化终止:网格尺寸小于options.MeshTolerance。

{

流(迭代次数为:%d\n, output3.iterations);
迭代次数为:144
流(函数求值的次数是:%d\n, output3.funccount);
函数求值的数量是:753
流(找到的最佳函数值是:%g\n, Fval3);
找到的最佳函数值为: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解算器。

[sol4,Fval4,eflag4,output4] = solve(prob,x0,“规划求解”“patternsearch”...“选项”、选择);
使用模式搜索解决问题。优化终止:网格尺寸小于options.MeshTolerance。

{

流(迭代次数为:%d\n, output4.iterations);
迭代次数为:48
流(函数求值的次数是:%d\n, output4.funccount);
函数求值的数量是:605
流(找到的最佳函数值是:%g\n, Fval4);
找到的最佳函数值为:2189.18

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

另请参阅

|

相关的话题