主要内容

尽量减少使用并行计算工具箱™昂贵的优化问题

这个例子展示了如何加快最小化一个昂贵的优化问题中使用函数优化工具箱™和全局优化工具箱。在第一部分的示例中,我们解决优化问题通过评估函数以串行的方式,和在第二部分的示例中,我们使用并行循环解决同样的问题(parfor并行)特性通过评估函数。我们比较的时间在这两种情况下的优化函数。

昂贵的优化问题

为目的的这个例子中,我们解决问题的四个变量,目标和约束函数是由人工昂贵的暂停。

函数f = expensive_objfun (x)% EXPENSIVE_OBJFUN optimparfor示例中使用一个昂贵的目标函数。% 2007 - 2013版权MathWorks公司。通过暂停%模拟一个昂贵的功能暂停(0.1)%计算目标函数f = exp (x (1)) * (4 * x (3) ^ 2 + 2 * (4) ^ 2 + 4 * x (1) * (2) + 2 * x (2) + 1);
函数测查[c] = expensive_confun (x)% EXPENSIVE_CONFUN optimparfor示例中使用一个昂贵的约束函数。% 2007 - 2013版权MathWorks公司。通过暂停%模拟一个昂贵的功能暂停(0.1);%计算约束c = (1.5 + x (1) * (2) * x (3) - (1) - (2) - x (4);x - x (1) * (2) + x (4) - 10];%没有非线性等式约束:测查= [];

尽量减少使用fmincon

我们感兴趣的是测量的时间fmincon在串行,这样我们可以把它比作并行。

曾经繁荣= [1 1 1 1];选择= optimoptions (“fmincon”,“显示”,“通路”,“算法”,“内点”);开始时间=抽搐;xsol = fmincon (@expensive_objfun,曾经繁荣,[],[],[],[],[],[],@expensive_confun,选项);time_fmincon_sequential = toc(开始时间);流(“连环FMINCON优化需要% g秒。\ n ',time_fmincon_sequential);
一阶范数的Iter F-count f (x)可行性最优步骤0 5 e + 00 1.839397 1.500 3.211 e + e + 00 00 1 11 -9.760099 e-01 3.708 7.902 2.362 e-01 e + e + 00 00 2 16 -1.480976 1.069 8.344 0.000 e + e + 00 00 e-01 e + 00 3 21 -2.601599 8.390 0.000 e + e + 00 00 e-01 1.218 e + 00 4 29 -2.823630 0.000 e + e + 00 00 2.598 -3.905339 1.118 e + e + 00 00 5 34 e + 7.302 0.000 1.210 e + e + 00 00 00 e-01 6 39 -6.212992 e + 00 3.934 e-01 7.372 e-01 2.405 e + 00 7 44 -5.948762 1.784 0.000 e + e + 00 00 1.905 e + e + 00 00 8 49 -6.940062 7.553 7.668 1.233 e + 00 e-02 e-01 e-01 9 54 -6.973887 3.920 2.549 0.000 e + e + 00 00 e-01 e-01 10 59 -7.142993 4.735 1.903 0.000 e + e + 00 00 e-01 e-01 11 64 -7.155325 2.626 1.365 0.000 e + e + 00 00 e-01 e-01 12 69 -7.179122 9.115 6.336 0.000 e + e + 00 00 e-02 e-02 13 74 -7.180116 4.670 1.069 0.000 e + e + 00 00 e 03 e-02 14 79 -7.180409 2.815 7.799 0.000 e + e + 00 00 e-04 e 03 15 84 -7.180410 3.122 6.189 0.000 e + e + 00 00 e-06 e-04局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。串行FMINCON优化需要17.0722秒。

尽量减少使用遗传算法

遗传算法比通常更多的功能评估fmincon,我们把昂贵的约束从这个问题,转而执行无约束优化。通过空矩阵[]为约束条件。此外,我们一代又一代的最大数量限制为15遗传算法遗传算法可以在合理的时间内终止。我们感兴趣的是测量的时间遗传算法这样我们可以比较平行遗传算法评估。注意,运行遗传算法需要全局优化工具箱。

rng默认的%的再现性试一试gaAvailable = false;据nvar = 4;gaoptions = optimoptions (“遗传算法”,“MaxGenerations”15岁的“显示”,“通路”);开始时间=抽搐;据nvar,加索尔= ga (@expensive_objfun [], [], [], [], [], [], [], gaoptions);time_ga_sequential = toc(开始时间);流(“串行遗传算法优化需要% g秒。\ n ',time_ga_sequential);gaAvailable = true;我警告消息(“optimdemos: optimparfor: gaNotFound”));结束
最佳意味着停滞一代Func-count f (x) f (x)代1 100 -5.546 e + 05年1.483 e + 15 0 2 150 -5.581 -1.116 e + e + 17 16 0 3 200 -7.556 6.679 e + e + 17 22 0 4 250 -7.556 -7.195 e + e + 17 16 1 5 300 -9.381 e + 27 -1.876 e + 26 0 6 350 -9.673 e + 27 -7.497 e + 26 0 7 400 -4.511 -9.403 e + 36 e + 34 0 8 450 -5.111 -3.011 e e + 36 + 35 0 9 500 -7.671 9.346 e + e + 36 37 0 550 -1.52 e + 43 -3.113 e + 41 0 11 600 -2.273 -4.67 e e + 45 + 43 0 12 650 -2.589 e + 47 -6.281 e + 45 0 13 700 -2.589 -1.015 e + e + 47 46 1 14 750 -8.149 -5.855 e + e + 47 46 0 15 800 -9.503 -1.29 e + e + 47 47 0优化终止:超过了一代又一代的最大数目。串行遗传算法优化需要80.2351秒。

设置并行计算工具箱

优化工具箱中的函数使用的有限差分近似衍生品在并行使用parfor功能如果并行计算工具箱是可用的和有一个平行的工人。同样的,遗传算法,gamultiobj,patternsearch解决在全球优化工具箱并行评估函数。使用parfor特性,我们使用parpool函数设置并行环境。这个例子的计算机出版有四个核心,所以parpool开始四MATLAB®工人。如果已经有一个平行的池当您运行这个示例中,我们使用池;看到的文档parpool为更多的信息。

如果max(大小(gcp)) = = 0%平行池需要parpool%创建并行池结束

尽量减少使用并行fmincon

减少我们的成本优化问题使用并行fmincon功能,我们需要明确地表明,我们的目标和约束函数可以并行进行,我们想要的fmincon尽可能使用其并行功能。目前,有限差分可以并行完成。我们感兴趣的是测量的时间fmincon这样我们可以比较连续fmincon运行。

选择= optimoptions(选项,“UseParallel”,真正的);开始时间=抽搐;xsol = fmincon (@expensive_objfun,曾经繁荣,[],[],[],[],[],[],@expensive_confun,选项);time_fmincon_parallel = toc(开始时间);流(“平行FMINCON优化需要% g秒。\ n ',time_fmincon_parallel);
一阶范数的Iter F-count f (x)可行性最优步骤0 5 e + 00 1.839397 1.500 3.211 e + e + 00 00 1 11 -9.760099 e-01 3.708 7.902 2.362 e-01 e + e + 00 00 2 16 -1.480976 1.069 8.344 0.000 e + e + 00 00 e-01 e + 00 3 21 -2.601599 8.390 0.000 e + e + 00 00 e-01 1.218 e + 00 4 29 -2.823630 0.000 e + e + 00 00 2.598 -3.905339 1.118 e + e + 00 00 5 34 e + 7.302 0.000 1.210 e + e + 00 00 00 e-01 6 39 -6.212992 e + 00 3.934 e-01 7.372 e-01 2.405 e + 00 7 44 -5.948762 1.784 0.000 e + e + 00 00 1.905 e + e + 00 00 8 49 -6.940062 7.553 7.668 1.233 e + 00 e-02 e-01 e-01 9 54 -6.973887 3.920 2.549 0.000 e + e + 00 00 e-01 e-01 10 59 -7.142993 4.735 1.903 0.000 e + e + 00 00 e-01 e-01 11 64 -7.155325 2.626 1.365 0.000 e + e + 00 00 e-01 e-01 12 69 -7.179122 9.115 6.336 0.000 e + e + 00 00 e-02 e-02 13 74 -7.180116 4.670 1.069 0.000 e + e + 00 00 e 03 e-02 14 79 -7.180409 2.815 7.799 0.000 e + e + 00 00 e-04 e 03 15 84 -7.180410 3.122 6.189 0.000 e + e + 00 00 e-06 e-04局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。平行FMINCON优化需要8.11945秒。

减少使用并行遗传算法

尽量减少我们使用昂贵的优化问题遗传算法功能,我们需要明确地表明,目标函数可以并行进行,我们想要的遗传算法尽可能使用其并行功能。使用并行遗传算法我们也要求“矢量”选项被设置为默认(即。,“关闭”)。我们再一次测量的时间感兴趣遗传算法这样我们可以比较连续遗传算法运行。虽然这可能不同于串行因为运行遗传算法使用一个随机数发生器,昂贵的功能评估的数量都是一样的。注意,运行遗传算法需要全局优化工具箱。

rng默认的%得到相同的评估之前运行如果gaAvailable gaoptions = optimoptions (gaoptions,“UseParallel”,真正的);开始时间=抽搐;据nvar,加索尔= ga (@expensive_objfun [], [], [], [], [], [], [], gaoptions);time_ga_parallel = toc(开始时间);流(“并行GA优化需要% g秒。\ n ',time_ga_parallel);结束
最佳意味着停滞一代Func-count f (x) f (x)代1 100 -5.546 e + 05年1.483 e + 15 0 2 150 -5.581 -1.116 e + e + 17 16 0 3 200 -7.556 6.679 e + e + 17 22 0 4 250 -7.556 -7.195 e + e + 17 16 1 5 300 -9.381 e + 27 -1.876 e + 26 0 6 350 -9.673 e + 27 -7.497 e + 26 0 7 400 -4.511 -9.403 e + 36 e + 34 0 8 450 -5.111 -3.011 e e + 36 + 35 0 9 500 -7.671 9.346 e + e + 36 37 0 550 -1.52 e + 43 -3.113 e + 41 0 11 600 -2.273 -4.67 e e + 45 + 43 0 12 650 -2.589 e + 47 -6.281 e + 45 0 13 700 -2.589 -1.015 e + e + 47 46 1 14 750 -8.149 -5.855 e + e + 47 46 0 15 800 -9.503 -1.29 e + e + 47 47 0优化终止:超过了一代又一代的最大数目。并行GA优化需要15.6984秒。

串行和并行时间进行比较

X = [time_fmincon_sequential time_fmincon_parallel];Y = [time_ga_sequential time_ga_parallel];t = [0, 1];情节(t X,“r——”、t、Y,“k -”)ylabel (的时间间隔,以秒为单位)传说(“fmincon”,“遗传算法”甘氨胆酸)ax =;斧子。XTick = [0 1];斧子。XTickLabel = {“串行”“平行”};轴([0 1 0装天花板(max ((X, Y)))))标题(“串行与并行倍”)

利用并行函数评估通过parfor提高双方的效率fmincon遗传算法。改善通常更昂贵的目标和约束函数。

相关的话题