主要内容

使用并行计算工具箱最小化昂贵的优化问题

此示例演示如何使用优化工具箱™和全局优化工具箱中的函数加速最小化代价高昂的优化问题。在该示例的第一部分中,我们通过串行方式求函数值来解决优化问题,在该示例的第二部分中,我们使用并行for循环(parfor)的特征,通过并行计算函数。我们比较了优化函数在两种情况下所花费的时间。

昂贵的优化问题

出于本例的目的,我们在四个变量中解决了一个问题,其中目标函数和约束函数通过暂停而人为地变得昂贵。

函数f = expensive_objfun (x)例如,optimpara中使用的昂贵的目标函数。版权所有The MathWorks, Inc.通过暂停模拟一个昂贵的函数。暂停(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)例如,在optimpara中使用的昂贵约束函数。版权所有The MathWorks, Inc.通过暂停模拟一个昂贵的函数。暂停(0.1);%计算约束C = [1.5 + x(1)*x(2)*x(3) - x(1) - x(2) - x(4);-x(1)*x(2) + x(4) - 10];%无非线性等式约束:测查= [];

尽量减少使用fmincon

我们感兴趣的是测量时间fmincon这样我们就可以把它和并行时间进行比较。

startPoint = [-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)可行性最优步骤05 1.839397e+00 1.500e+00 3.211e+00 1 11 -9.760099e-01 3.708e+00 0.000e+00 8.344e-01 1.069e+00 2 16 -1.480976e+00 0.000e+00 8.344e-01 1.069e+00 3 21 -2.601599e+00 0.000e+00 8.390e-01 1.069e+00 4 29 -2.823630e+00 0.000e+00 2.598e+00 8.390e-01 1.118e+00 4 29 - 3.8235338e +00 0.000e+00 2.598e+00 1.118e+00 5 34 -3.905338e+00 0.000e+00 2.598e+00 3.934e-01 7.372e-01 3.948761e +00 0.000e+00 1.784e+00 1.905e+00 8 49 -6.940062e+00 7.668e-01 7.553e +00 9 54-6.973887e+00 0.000e+00 2.549e-01 3.920e-01 10 59 -7.142993e+00 0.000e+00 1.903e-01 4.735e-01 11 64 -7.155325e+00 0.000e+00 1.365e-01 2.626e-01 12 69 -7.179122e+00 0.000e+00 6.336e-02 9.670e -02 13 74 - 7.1801116 e+00 0.000e+00 1.069e-03 4.670e-02 14 79 -7.180409e+00 0.000e+00 7.797e-04 2.815e-03 15 84 -7.180410e+00 0.000e+00 6.368e-06 3.120e-04发现满足约束条件的局部极小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。串行FMINCON优化耗时18.2876秒。

利用遗传算法最小化

遗传算法通常需要更多的函数求值fmincon,我们从这个问题中删除了昂贵的约束,并执行无约束优化。通过空矩阵[]为约束条件。此外,我们将最大代数限制为15遗传算法遗传算法可以在合理的时间内终止。我们感兴趣的是测量时间遗传算法这样我们就可以把它和平行线进行比较遗传算法评估。注意,运行遗传算法需要全局优化工具箱。

rng默认的%的再现性试一试gaAvailable = false;据nvar = 4;gaoptions = optimoptions (“遗传算法”“MaxGenerations”15岁的“显示”“通路”);开始时间=抽搐;据nvar加索尔= ga (@expensive_objfun ,[],[],[],[],[],[],[], gaoptions);time_ga_sequential = toc(开始时间);流('串行GA优化需要%g秒。\n', time_ga_sequential);gaAvailable = true;我警告消息(optim: optimdemos: optimparfor: gaNotFound”));结束
单目标优化:4个变量(s)选项:CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn:@mutationgaussian最佳意味着停滞一代Func-count f (x) f (x)代1 100 -5.546 e + 05年1.483 e + 15 0 2 147 -5.581 -1.116 e + e + 17 16 0 3 194 -7.556 6.679 e + e + 17 22 0 4 241 -7.556 -7.195 e + e + 17 16 1 5 288 -9.381 e + 27 -1.876 e + 26 0 6 335 -9.673 e + 27 -7.497 e + 26 0 7 382 -4.511 -9.403 e + 36 e + 34 0 8 429 -5.111 -3.011 e e + 36 + 35 0 9 476 -7.671 9.346 e + e + 36 37 0 523 -1.52 e + 43 -3.113 e + 41 0 11 570 -2.273 -4.67 e e + 45 + 43 0 12 617 -2.589 e + 47 -6.281 e + 45 0 13 664 -2.589 -1.015 e + e + 47 46 1 14 711 -8.149 e + 47 -5.855 e + 46 0 15758 -9.503e+47 -1.29e+47 0 Optimization terminated: maximum number of generations exceeded. Serial GA optimization takes 81.5878 seconds.

设置并行计算工具箱

最优化工具箱中的函数用来近似导数的有限差分是用parfor如果并行计算工具箱™可用,并且存在并行工作器池,则提供此特性。同样的,遗传算法gamultiobj,patternsearch全局优化工具箱中的求解器并行计算函数。使用parfor功能,我们使用parpool函数设置并行环境。发布此示例的计算机有四个核,因此parpool启动四个MATLAB®worker。如果在运行此示例时已经存在一个并行池,则使用该池;请参阅相关文档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)可行性最优步骤05 1.839397e+00 1.500e+00 3.211e+00 1 11 -9.760099e-01 3.708e+00 0.000e+00 8.344e-01 1.069e+00 2 16 -1.480976e+00 0.000e+00 8.344e-01 1.069e+00 3 21 -2.601599e+00 0.000e+00 8.390e-01 1.069e+00 4 29 -2.823630e+00 0.000e+00 2.598e+00 8.390e-01 1.118e+00 4 29 - 3.8235338e +00 0.000e+00 2.598e+00 1.118e+00 5 34 -3.905338e+00 0.000e+00 2.598e+00 3.934e-01 7.372e-01 3.948761e +00 0.000e+00 1.784e+00 1.905e+00 8 49 -6.940062e+00 7.668e-01 7.553e +00 9 54-6.973887e+00 0.000e+00 2.549e-01 3.920e-01 10 59 -7.142993e+00 0.000e+00 1.903e-01 4.735e-01 11 64 -7.155325e+00 0.000e+00 1.365e-01 2.626e-01 12 69 -7.179122e+00 0.000e+00 6.336e-02 9.670e -02 13 74 - 7.1801116 e+00 0.000e+00 1.069e-03 4.670e-02 14 79 -7.180409e+00 0.000e+00 7.797e-04 2.815e-03 15 84 -7.180410e+00 0.000e+00 6.368e-06 3.120e-04发现满足约束条件的局部极小值。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。并行FMINCON优化需要8.79291秒。

用并行遗传算法最小化

来最小化我们昂贵的优化问题遗传算法函数,我们需要明确表明我们的目标函数可以并行计算,我们想要遗传算法尽可能使用它的并行功能。要使用平行运算遗传算法我们还要求'Vectorized'选项设置为默认值(即'off')。我们再次对测量所花费的时间感兴趣遗传算法这样我们就可以把它和序列进行比较遗传算法运行。虽然这次可能和上次不一样,因为遗传算法使用随机数生成器,在两次运行中,昂贵的函数求值的次数是相同的。注意,运行遗传算法需要全局优化工具箱。

rng默认的%以获得与前一次运行相同的计算结果如果gaAvailable gaoptions = optimoptions(gaoptions,“UseParallel”,真正的);开始时间=抽搐;据nvar加索尔= ga (@expensive_objfun ,[],[],[],[],[],[],[], gaoptions);time_ga_parallel = toc(开始时间);流('并行GA优化需要%g秒。\n', time_ga_parallel);结束
单目标优化:4个变量(s)选项:CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn:@mutationgaussian最佳意味着停滞一代Func-count f (x) f (x)代1 100 -5.546 e + 05年1.483 e + 15 0 2 147 -5.581 -1.116 e + e + 17 16 0 3 194 -7.556 6.679 e + e + 17 22 0 4 241 -7.556 -7.195 e + e + 17 16 1 5 288 -9.381 e + 27 -1.876 e + 26 0 6 335 -9.673 e + 27 -7.497 e + 26 0 7 382 -4.511 -9.403 e + 36 e + 34 0 8 429 -5.111 -3.011 e e + 36 + 35 0 9 476 -7.671 9.346 e + e + 36 37 0 523 -1.52 e + 43 -3.113 e + 41 0 11 570 -2.273 -4.67 e e + 45 + 43 0 12 617 -2.589 e + 47 -6.281 e + 45 0 13 664 -2.589 -1.015 e + e + 47 46 1 14 711 -8.149 e + 47 -5.855 e + 46 0 15758 -9.503e+47 -1.29e+47 0 Optimization terminated: maximum number of generations exceeded. Parallel GA optimization takes 15.2253 seconds.

比较串行和并行时间

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 = gca;斧子。XTick = [0 1];斧子。XTickLabel = {“串行”“平行”};轴([0 1 0 cell (max([X Y]))])“串行与并行时间”

利用并行函数求值parfor提高了两者的效率fmincon而且遗传算法。对于昂贵的目标函数和约束函数,这种改进通常更好。

相关的话题

Baidu
map