主要内容

探索patternsearch算法

从R2022b开始,patternsearch有四个算法:

  • “经典”

  • “国家联盟”(非均匀模式搜索)

  • “nups-gps”

  • “nups-mads”

这个例子展示了算法的选择如何影响一个具有非光滑目标函数的有界问题。

目标函数

本例的目标函数是基于二维的ps_example运行示例时可用的函数。

类型ps_example
函数f = ps_example(x) % ps_example模式搜索的目标函数。f = 0 (1,size(x,1));我= 1:尺寸(x, 1)如果x(我,1)< 5 f (i) = (x(我,1)+ 5)^ 2 + abs (x(我,2));elseif x (1) < 3 f (i) = 2 * sin (x(我,1))+ abs (x(我,2));elseif x (1) < 0 f (i) = 0.5 * x(我,1)+ 2 + abs (x(我,2));elseif x (1) > = 0 f (i) = 3 * sqrt (x(我,1))+ 5/2 + abs (x(我,2));结束结束

扩展ps_example通过从原点为每两个维度创建伪随机偏移量,并添加结果目标,实现任意偶数个维度的函数。的代码testps的辅助功能此示例结束

指定N = 10尺寸,并为每个组件设置-20到20的边界。开始patternsearchX0 =[0 0…]0]

N = 10;磅= -20 * 1 (1,N);乌兰巴托=磅;x0 = 0(大小(磅));

运行经典算法

设置选项以使用“经典”算法和显示目标函数值。

optscl = optimoptions (“patternsearch”算法=“经典”PlotFcn =“psplotbestf”);

运行优化。

[xclassic, fvalclassic eflagclassic outputclassic] =...patternsearch (@testps x0 ,[],[],[],[], 磅,乌兰巴托,[],optscl)
优化终止:网格尺寸小于options.MeshTolerance。

{

xclassic =1×10-7.9575 5.9058 -8.5047 -5.5481 -8.9402 -2.8633 -7.5058 0.8919 -5.6967 2.9322
fvalclassic = -10.0000
eflagclassic = 1
outputclassic =结构体字段:函数:@testps problemtype: 'boundconstraints' pollmethod: 'gpspositivebasis2n' maxconstraint: 0 searchmethod: [] iterations: 218 funccount: 3487 meshsize: 9.5367e-07 rngstate: [1×1 struct] message: '优化终止:meshsize小于options.MeshTolerance.'

运行nu算法

设置选项以使用“国家联盟”算法。为了获得可复制的结果,设置随机种子。

optsnups = optimoptions (optscl算法=“国家联盟”);rng默认的%的再现性[xnups, fvalnups eflagnups outputnups] =...patternsearch (@testps x0 ,[],[],[],[], 磅,乌兰巴托,[],optsnups)
优化终止:网格尺寸小于options.MeshTolerance。

{

xnups =1×10-7.9575 5.9058 -8.5047 -5.5480 -8.9401 -2.8633 -7.5058 0.8919 -5.6967 2.9322
fvalnups = -9.9999
eflagnups = 1
outputnups =结构体字段:函数:@testps problemtype: 'boundconstraints' pollmethod: 'nups' maxconstraint: 0 searchmethod: [] iterations: 183 funccount: 1827 meshsize: 8.5928e-07 rngstate: [1×1 struct] message: '优化终止:meshsize小于options.MeshTolerance.'

在这种情况下,“国家联盟”算法得到的解本质上与“经典”算法,同时使用较少的函数计算。

进一步的探索

你也可以试试“nups-gps”而且“nups-mads”看看它们在这个问题上的表现。虽然你不能总是预测哪种算法对一个问题最有效,“国家联盟”可以是一个好的开始算法,因为它包含了许多自适应特征,使它可能是最好的算法。

Helper函数

此代码创建testpshelper函数。

函数y = testps(x) N = num (x);变量的百分比如果mod(N,2) == 1 disp("变量的个数必须是偶数"返回结束strm = RandStream (“旋风”、种子= 1);%设置种子一致性使用RandStream以避免影响全局流dsp = 5 * randn (strm、大小(x));Z = x - dsp;%包括随机偏移量y = 0;i = 1:N/2 y = y + ps_example(z([2*i-1,2*i]));结束结束

另请参阅

相关的话题

Baidu
map