作为示例,考虑下面的函数。
下图显示了该功能的曲线图。
函数的全局最小值发生在(0,0),其中其值为-25。但是,该功能也具有局部最小值(0,9),其中其值为-16。
要创建一个计算函数的文件,请将以下代码复制并粘贴到MATLAB中的新文件中®编辑。
函数z = poll_example (x)如果z = X (1)^2 + X (2)^2 - 25;eleesifx (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)朝向局部最小值移动。通过查看命令行显示的前两行来看,您看到了这一点。
erer f count f(x)网眼化方法0 1 0 1 1 3 -7 2成功轮询
请注意,模式搜索仅在第一次迭代中仅执行目标函数的两个评估,从1到3增加总函数计数。
接下来,集合UseCompletePoll
至真正的
然后重新运行优化。
options.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)网眼化方法0 1 0 1 1 5 -9 2成功轮询
在这种情况下,目标函数在第一次迭代时被评估4次。因此,模式搜索会向全局最小值(0,0)移动。
下图比较了返回的点序列完成调查设定为从
当完成调查是上
.
这个示例显示了几个投票选项如何在迭代和总函数计算方面进行交互。主要结果如下:
对于线性约束问题,GSS比GPS或MADS更有效。
是否设置UseCompletePoll
至真正的
提高效率或降低效率是不明确的,尽管它会影响迭代的数量。
类似地,是否有2N
Poll的效率或高或低NP1.
民意调查也不清楚。最有效的民意调查是GSS积极基础NP1
与完成调查设置为上
.效率最低的是Mads积极的基础NP1
与完成调查设置为上
.
请注意
算法的效率取决于问题本身。GSS对于线性约束问题是有效的。然而,预测其他poll选项的效率影响是困难的,知道哪种poll类型与其他约束一起工作最好也是困难的。
问题与中的问题相同在优化Live编辑器任务中使用Patternsearch解决.这种线性约束的问题使用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',......'pollordoralgorithm','连续的',......“UseCompletePoll”、假);有趣= @lincontest7;
运行优化,命名输出
结构体OutputGPS2NOFF.
.
[x,fval,出口,outputgps2noff] = patternsearch(fun,x0,......AINEQ,BINEQ,AEQ,BEQ,[],[],[],选项);
设置选项以使用完整的投票。
options.usecompletepoll = true;
运行优化,命名输出
结构体OutputGPS2Non.
.
[x, fval exitflag, outputgps2non] = patternsearch(有趣,x0,......AINEQ,BINEQ,AEQ,BEQ,[],[],[],选项);
继续以类似的方式为其他轮询方法创建输出结构UseCompletePoll
集真正的
和假
:outputgss2noff
,outputgss2non
,Outputgssnp1off.
,Outputgssnp1on.
,outputmads2noff.
,outputmads2non
,outputmadsnp1off
,outputmadsnp1on
.
您有12个优化运行的结果。下表显示了运行的效率,在总函数计数和迭代中测量。由于疯子是一种随机算法,您的疯狂结果可能有所不同。
算法 | 功能计数 | 迭代 |
---|---|---|
GPS2N,完成poll off | 1462 | 136. |
GPS2N,完整的民意调查 | 1396 | 96. |
GPSNp1,完成轮询 | 864 | 118. |
GPSNP1,完全民意调查 | 1007 | 104. |
GSS2N,完成poll off | 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]
答案: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
设置会有很大的不同。