轮询类型
在广义模式搜索中使用完全轮询
例如,考虑下面的函数。
下图显示了函数的图形。
函数的全局最小值出现在(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.这个线性约束问题有一个二次目标函数。
在您的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;
设置初始选项和目标函数。
选择= optimoptions (“patternsearch”,...“PollMethod”,“GPSPositiveBasis2N”,...“PollOrderAlgorithm”,“连续”,...“UseCompletePoll”、假);
运行优化,命名
输出
结构outputgps2noff
.[x, fval exitflag, outputgps2noff] = patternsearch(有趣,x0,...Aineq、bineq Aeq,说真的 ,[],[],[], 选项);
设置选项以使用完整的轮询。
选项。UseCompletePoll = true;
运行优化,命名
输出
结构outputgps2non
.[x, fval exitflag, outputgps2non] = patternsearch(有趣,x0,...Aineq、bineq Aeq,说真的 ,[],[],[], 选项);
继续以类似的方式为其他轮询方法创建输出结构
UseCompletePoll
集真正的
而且假
:outputgss2noff
,outputgss2non
,outputgssnp1off
,outputgssnp1on
,outputmads2noff
,outputmads2non
,outputmadsnp1off
,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的迭代次数,但会大幅增加函数计算的次数。最有效的算法/选项设置,效率意味着最低的函数计数:
“GSSPositiveBasisNp1”
与UseCompletePoll
设置为真正的
(函数数491)“GSSPositiveBasisNp1”
与UseCompletePoll
设置为假
(函数数533)“GSSPositiveBasis2N”
与UseCompletePoll
设置为假
(函数数758)“GSSPositiveBasis2N”
与UseCompletePoll
设置为真正的
(函数数889)
其他投票方法的函数数超过900。
对于这个问题,最有效的轮询是
“GSSPositiveBasisNp1”
与UseCompletePoll
设置为真正的
,虽然UseCompletePoll
设置只起很小的作用。效率最低的轮询是“MADSPositiveBasis2N”
与UseCompletePoll
设置为真正的
.在这种情况下,UseCompletePoll
环境有很大的不同。