平行MultiStart
并行多启动的步骤
如果您拥有多核处理器或可以访问处理器网络,则可以使用并行计算工具箱™函数MultiStart
.这个例子展示了如何使用一个双核处理器并行地为一个问题找到多个极小值。这个问题和在查找全局或多个局部极小值.
写一个函数文件来计算目标:
函数f = sawtoothxy(x,y) [t r] = cart2pol(x,y);%变换到极坐标h = cos(2*t - 1/2)/2 + cos(t) + 2;g = (sin (r) -罪(2 * r) / 2 +罪(3 * r) / 3 -罪(4 * r) / 4 + 4)…。* r。^ 2. / (r + 1);f = g。* h;结束
创建问题结构:
问题= createOptimProblem(“fminunc”,…“客观”,@ (x) sawtoothxy (x(1),(2)),…x0,(100、-50),“选项”,…optimoptions (@fminunc、“算法”、“拟牛顿”));
通过运行它来验证问题结构:
[x,fval] = fminunc(问题)x = 8.4420 -110.2602 fval = 435.2573
创建一个
MultiStart
对象,并设置对象使用并行处理和迭代显示:女士= MultiStart (UseParallel,真的,“显示”,“iter”);
设置并行处理:
使用“local”配置文件启动parpool…连接4个工人。ans = Pool with properties: Connected: true NumWorkers: 4 Cluster: local AttachedFiles: {} IdleTimeout: 30 minute(s) (30 minutes remaining) SpmdEnabled: true
在50个起始点上运行问题:
[x, fval exitflag、输出manymins] =运行(女士,问题,50);并行运行局部求解器。运行Local Local Local Local Local一级索引exitflag f(x) # iter f -count optimality 17 2 3953 4 21 0.1626 16 0 1331 45 201 65.02 34 0 7271 54 201 520.9 33 2 8249 4 18 2.968…许多迭代都忽略了……47 2 2740 5 21 0.0422 35 0 8501 48 201 424.8 50 0 1225 40 201 21.89 MultiStart从起始点完成了一些运行。在50次本地求解器运行中,有17次收敛于正向本地求解器退出标志。
注意,运行索引看起来是随机的。平行
MultiStart
以不可预测的顺序运行起始点。请注意,
MultiStart
在第一行输出中确认并行处理,它声明:“并行运行局部求解器。”完成后,关闭并行环境:
使用'local'配置文件的并行池正在关闭。
有关如何获得此问题的更好解决方案的示例,请参见例子:寻找更好的解决方案.您可以将并行处理与该示例中描述的技术一起使用。
使用并行计算加速
的结果MultiStart
运行是随机的。挤兑的时机也是随机的。尽管如此,在下表中仍有一些明显的趋势。该表的数据来自于一台有两个核的机器上每个起始点的一次运行。
开始点 | 平行秒 | 串行秒 |
---|---|---|
50 | 3.6 | 3.4 |
One hundred. | 4.9 | 5.7 |
200 | 8.3 | 10 |
500 | 16 | 23 |
1000 | 31 | 46 |
当只使用几个起始点时,并行计算可能比串行计算慢。随着起始点数量的增加,并行计算比串行计算效率越来越高。
有许多因素会影响并行处理的加速(或减速)。有关更多信息,请参见用并行计算提高性能.