以下面的函数为例。
下图显示了该函数的绘图。
函数的全局最小值出现在(0,0)处,其值为-25。然而,该函数在(0,9)处也有一个局部最小值,其值为-16。
要创建一个计算函数的文件,将以下代码复制并粘贴到MATLAB中的一个新文件中®编辑器。
函数z = poll_example (x)如果X (1)^2 + X (2)^2 + X (2)^2 + X (2)^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 Poll成功
在这种情况下,目标函数在第一次迭代时被求值四次。因此,模式搜索将向(0,0)处的全局最小值移动。
下图比较了当时返回的点序列完成调查被设置为从
当完成调查是在
.
这个示例展示了几个投票选项如何在迭代和总体功能评估方面相互作用。主要结果有:
对于线性约束问题,GSS比GPS或MADS更有效。
是否设置UseCompletePoll
来真正的
提高效率或降低效率尚不清楚,尽管它会影响迭代的数量。
同样的,是否有2 n
投票或多或少比有一个Np1
民意调查也不清楚。最有效的投票是GSS正基Np1
与完成调查设置为在
.效率最低的是MADS正基Np1
与完成调查设置为在
.
请注意
算法的效率取决于问题本身。GSS对于线性约束问题是有效的。然而,预测其他投票选项的效率影响是困难的,因为要知道哪种投票类型在其他约束条件下效果最好。
这个问题和……一样解决使用模式搜索优化实时编辑器任务.这个线性约束问题使用lincontest7
工具箱自带的文件:
在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];
设定初始选项和目标函数。
选择= optimoptions (“patternsearch”,...“PollMethod”,“GPSPositiveBasis2N”,...“PollOrderAlgorithm”,“连续”,...“UseCompletePoll”、假);有趣= @lincontest7;
运行优化,命名输出
结构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,完成poll on | 491 | 70 |
MADS2N,完成投票 | 922 | 162 |
MADS2N,完成投票 | 2285 | 273 |
MADSNp1,完成投票 | 1155 | 201 |
MADSNp1,完成poll on | 1651 | 201 |
要获取表中的第一行,输入gps2noff.output.funccount
和gps2noff.output.iterations
.您还可以通过双击Workspace Browser中的选项来检查Variables编辑器中的选项,然后双击输出
结构。
或者,您可以从输出结构访问数据。
[outputgps2noff.funccount, outputgps2noff.iterations]
Ans = 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
环境有很大的不同。