这个例子展示了模式搜索的一些选项的效果。选项包括绘图、停止标准和其他加速解决方案的算法控制。
最小化问题是一个受线性等式和不等式约束的六变量二次函数。目标函数,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 < = 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];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,说真的 ,[],[],[], 选择);
优化终止:网格尺寸小于选项。网格公差。
模式搜索包括在网格中的点上评估目标函数。网格的大小会影响溶液的速度。你可以使用选项来控制网格的大小。
初始网格大小
每次迭代的网格是添加到当前点的一组搜索方向的跨度,按当前网格大小缩放。求解器的初始网格尺寸为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,说真的 ,[],[],[], 选择);
优化终止:网格尺寸小于选项。网格公差。
流('迭代次数为:%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
选择。使用。指定搜索方法时SearchFcn
,patternsearch
在网格搜索之前,首先执行指定的搜索。如果搜索方法成功,patternsearch
对该迭代跳过网格搜索(通常称为poll函数)。如果搜索方法不能改善当前点,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,说真的,...[]、[][],选择);
优化终止:网格尺寸小于选项。网格公差。
流('迭代次数为:%d\n', Output.iterations);
迭代次数为:63
流('函数的计算次数为:%d\n', Output.funccount);
函数求值次数为:788次
流('找到的最佳函数值是:%g\n', Fval);
找到的最佳函数值为:2189.03
迭代和函数计算的总次数会减少,即使网格公差小于之前的值,并且是停止求解的准则。