主要内容

轮询类型

在广义模式搜索中使用完全轮询

例如,考虑下面的函数。

f x 1 x 2 x 1 2 + x 2 2 25 x 1 2 + x 2 2 25 x 1 2 + x 2 9 2 16 x 1 2 + x 2 9 2 16 0 否则

下图显示了函数的图形。

生成图形的代码

函数的全局最小值出现在(0,0)处,其值为-25。然而,该函数在(0,9)处也有一个局部最小值,其值为-16。

要创建一个计算函数的文件,请将以下代码复制并粘贴到MATLAB中的新文件中®编辑器。

函数z = poll_example (x)如果X(1)²+ X(2)²<= 25 z = X(1)²+ X(2)²- 25;elseifx (1) ^ 2 + (x (2) - 9) ^ 2 < = 16 z = x (1) ^ 2 + (x (2) - 9) ^ 2 - 16;其他的z = 0;结束

将文件保存为poll_example.m在MATLAB路径下的文件夹中。

要在函数上运行模式搜索,输入以下内容。

选择= optimoptions (“patternsearch”“显示”“通路”);[x, fval] = patternsearch (@poll_example (0 5),...[],[],[],[],[],[],[], 选项)

MATLAB返回一个迭代表和解。

X = 0 9 fval = -16

算法从a=求函数在初始点的值开始,f(0,5) = 0。该轮询在其第一次迭代期间评估以下内容。

f((0,5) + (1,0)) =f(1,5) = 0

f((0,5) + (0,1)) =f(0,6) = -7

一旦搜索轮询目标函数值小于初始点的网格点(0,6),它就停止轮询当前网格,并将下次迭代时的当前点设为(0,6)。因此,搜索在第一次迭代时向(0,9)处的局部最小值移动。您可以通过查看命令行显示的前两行来了解这一点。

Iter f-count f(x) MeshSize Method 0 1 0 1 1 3 -7 2成功轮询

注意,模式搜索在第一次迭代时只执行目标函数的两次计算,将总函数计数从1增加到3。

接下来,设置UseCompletePoll真正的然后重新运行优化。

选项。UseCompletePoll = true;[x, fval] = patternsearch (@poll_example (0 5),...[],[],[],[],[],[],[], 选项);

这一次,模式搜索在(0,0)处找到全局最小值UseCompletePoll设置为真正的,在第一次迭代时,模式搜索轮询所有四个网格点。

f((0,5) + (1,0)) =f(1,5) = 0

f((0,5) + (0,1)) =f(0,6) = -6

f((0,5) + (- 1,0)) =f(- 1,5) = 0

f((0,5) + (0, -1)) =f(0,4) = -9

由于最后一个网格点的目标函数值最低,因此模式搜索选择它作为下一次迭代的当前点。命令行显示的前两行显示了这一点。

Iter f-count f(x) MeshSize Method 0 1 0 1 1 5 -9 2成功轮询

在这种情况下,目标函数在第一次迭代时被评估了四次。结果,模式搜索在(0,0)处向全局最小值移动。

下图比较了返回点的序列完成调查被设置为用当的顺序完成调查

生成图形的代码

比较投票选项的效率

这个例子展示了几个投票选项如何在迭代和总函数计算方面相互作用。主要结果如下:

  • 对于线性约束问题,GSS比GPS或MADS更有效。

  • 是否设置UseCompletePoll真正的提高效率或降低效率是不清楚的,尽管它影响迭代的数量。

  • 同样,是否有一个2 n民意调查的效率或高或低比有一个Np1民调结果也不清楚。最有效的民意调查是GSS正基Np1完成调查设置为.效率最低的是MADS正基Np1完成调查设置为

请注意

算法的效率取决于问题本身。GSS是求解线性约束问题的有效方法。然而,预测其他轮询选项的效率影响是困难的,因为要知道哪种轮询类型与其他约束条件最匹配也是困难的。

问题的设置

这个问题和在在优化实时编辑器任务中解决使用patternsearch.这个线性约束问题有一个二次目标函数。

  1. 在您的MATLAB工作区中输入以下内容。

    X0 = [2 1 0 9 1 0];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 9;1 -1 2 -2 3 -3];Beq = [84 62 65 1];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 ]'; fun = @(x)0.5*x'*H*x + f'*x;
  2. 设置初始选项和目标函数。

    选择= optimoptions (“patternsearch”...“PollMethod”“GPSPositiveBasis2N”...“PollOrderAlgorithm”“连续”...“UseCompletePoll”、假);
  3. 运行优化,命名输出结构outputgps2noff

    [x, fval exitflag, outputgps2noff] = patternsearch(有趣,x0,...Aineq、bineq Aeq,说真的 ,[],[],[], 选项);
  4. 设置选项以使用完整的轮询。

    选项。UseCompletePoll = true;
  5. 运行优化,命名输出结构outputgps2non

    [x, fval exitflag, outputgps2non] = patternsearch(有趣,x0,...Aineq、bineq Aeq,说真的 ,[],[],[], 选项);
  6. 继续以类似的方式为其他轮询方法创建输出结构UseCompletePoll真正的而且outputgss2noffoutputgss2nonoutputgssnp1offoutputgssnp1onoutputmads2noffoutputmads2nonoutputmadsnp1off,outputmadsnp1on

检查结果

您得到了12次优化运行的结果。下表显示了运行的效率,以总函数计数和迭代计算。您的MADS结果可能不同,因为MADS是一个随机算法。

算法 函数计算 迭代
GPS2N,完成投票 1462 136
GPS2N,完成投票 1396 96
GPSNp1,完成投票 864 118
GPSNp1,完成投票 1007 104
GSS2N,完成轮询 758 84
GSS2N,完成投票 889 74
GSSNp1,完成投票 533 94
GSSNp1,完成投票 491 70
MADS2N,完成投票 922 162
MADS2N,完成投票 2285 273
MADSNp1,投票结束 1155 201
MADSNp1,完成投票 1651 201

例如,要获取表中的第一行,请输入gps2noff.output.funccount而且gps2noff.output.iterations.还可以通过双击Workspace Browser中的选项来检查Variables编辑器中的选项,然后双击输出结构。

或者,您也可以从输出结构访问数据。

[outputgps2noff.funccount, outputgps2noff.iterations]
an = 1462

从表中收集到的主要结果如下:

  • 设置UseCompletePoll真正的一般降低了GPS和GSS的迭代次数,但函数计算次数的变化是不可预测的。

  • 设置UseCompletePoll真正的不一定会改变MADS的迭代次数,但会大幅增加函数计算的次数。

  • 最有效的算法/选项设置,效率意味着最低的函数计数:

    1. “GSSPositiveBasisNp1”UseCompletePoll设置为真正的(函数数491)

    2. “GSSPositiveBasisNp1”UseCompletePoll设置为(函数数533)

    3. “GSSPositiveBasis2N”UseCompletePoll设置为(函数数758)

    4. “GSSPositiveBasis2N”UseCompletePoll设置为真正的(函数数889)

    其他投票方法的函数数超过900。

  • 对于这个问题,最有效的轮询是“GSSPositiveBasisNp1”UseCompletePoll设置为真正的,虽然UseCompletePoll设置只起很小的作用。效率最低的轮询是“MADSPositiveBasis2N”UseCompletePoll设置为真正的.在这种情况下,UseCompletePoll环境有很大的不同。

相关的话题

Baidu
map