主要内容

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

这个例子展示了如何使用optimization Toolbox™和Global optimization Toolbox中的函数加速最小化昂贵的优化问题。在示例的第一部分中,我们通过以串行方式评估函数来解决优化问题,在示例的第二部分中,我们使用并行for循环(parfor)特性,通过并行计算函数。我们比较了两种情况下优化函数所花费的时间。

昂贵优化问题

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

函数F = expensive_objfun(x)一个昂贵的目标函数,在optimpar_example中使用。版权所有: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,ceq] = expsive_confun (x)一个昂贵的约束函数,在optimpar_example中使用。版权所有: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];%无非线性等式约束:[qh];

尽量减少使用fmincon

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

startPoint = [-1 1 -1];选项= optimoptions(“fmincon”“显示”“通路”“算法”“内点”);startTime = tic;xsol = fmincon (@expensive_objfun,曾经繁荣 ,[],[],[],[],[],[],@ expensive_confun选项);time_fmincon_sequence = toc(startTime);流(串行FMINCON优化需要%g秒。\n, time_fmincon_sequential);
Iter的一阶范数f -count f(x)可行性最优性步骤5 1.839397e+00 1.500e+00 3.211e+00 00 7.902e-01 2.362e+00 211 -9.760099e +00 7.902e +00 7.902e +00 8.344e-01 1.069e+00 0.000e+00 8.344e +00 1.069e+00 0.000e+00 8.390e +00 1.418e +00 0.000e+00 8.344e +00 1.118e+00 1.004 29 -2.823630e+00 0.000e+00 2.598e+00 1.118e+00 7.302e-01 6 39 -6.212992e+00 3.934e +00 1.934e +00 7.305e +00 7.372e -5.948761e+00 0.000e+00 1.784e+00 1.905e+00 7.307 44 -5.948761e+00 0.000e+00 1.234e +00 1.235e +00 7.8485e +00 1.233e +00 1.233e +00 7.849 -6.940062e+00 1.233e-02 7.668e +00 7.553e-01 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.115e-02 13 74 -7.180116e+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 7.797e-04 3.1200e -04满足约束条件的局部最小值。由于目标函数在可行方向上不减小,优化完成到最优性容限范围内,约束满足到约束容限范围内。串行FMINCON优化耗时18.2876秒。

利用遗传算法最小化

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

rng默认的再现性%试一试gaAvailable = false;Nvar = 4;Gaoptions = optimoptions(“遗传算法”“MaxGenerations”15岁的“显示”“通路”);startTime = tic;据nvar加索尔= ga (@expensive_objfun ,[],[],[],[],[],[],[], gaoptions);time_ga_sequence = toc(startTime);流(串行遗传算法优化需要%g秒。\n, time_ga_sequential);gaAvailable = true;我警告消息(optim: optimdemos: optimparfor: gaNotFound”));结束
单目标优化:4个变量选项: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如果Parallel Computing Toolbox™可用,并且存在并行工作池,则可以使用此功能。同样的,遗传算法gamultiobj,patternsearch全局优化工具箱中的求解器并行计算函数。要使用parfor特性,我们使用parpool函数设置并行环境。发布这个示例的计算机有四个内核,所以parpool启动四个MATLAB®工作人员。如果在运行本例时已经存在并行池,我们将使用该池;请参阅文档parpool了解更多信息。

如果Max (size(gcp)) == 0所需并行池百分比parpool%创建并行池结束

最小化并行的使用fmincon

使用并行最小化我们昂贵的优化问题fmincon函数,我们需要明确地指出我们的目标函数和约束函数可以并行计算,我们想要fmincon尽可能地使用它的并行功能。目前,有限差分可以并行进行。我们感兴趣的是测量所花费的时间fmincon这样我们就可以把它和序列进行比较fmincon运行。

Options = optimoptions(选项,“UseParallel”,真正的);startTime = tic;xsol = fmincon (@expensive_objfun,曾经繁荣 ,[],[],[],[],[],[],@ expensive_confun选项);time_fmincon_parallel = toc(startTime);流(并行FMINCON优化需要%g秒。\n, time_fmincon_parallel);
Iter的一阶范数f -count f(x)可行性最优性步骤5 1.839397e+00 1.500e+00 3.211e+00 00 7.902e-01 2.362e+00 211 -9.760099e +00 7.902e +00 7.902e +00 8.344e-01 1.069e+00 0.000e+00 8.344e +00 1.069e+00 0.000e+00 8.390e +00 1.418e +00 0.000e+00 8.344e +00 1.118e+00 1.004 29 -2.823630e+00 0.000e+00 2.598e+00 1.118e+00 7.302e-01 6 39 -6.212992e+00 3.934e +00 1.934e +00 7.305e +00 7.372e -5.948761e+00 0.000e+00 1.784e+00 1.905e+00 7.307 44 -5.948761e+00 0.000e+00 1.234e +00 1.235e +00 7.8485e +00 1.233e +00 1.233e +00 7.849 -6.940062e+00 1.233e-02 7.668e +00 7.553e-01 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.115e-02 13 74 -7.180116e+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 7.797e-04 3.1200e -04满足约束条件的局部最小值。由于目标函数在可行方向上不减小,优化完成到最优性容限范围内,约束满足到约束容限范围内。并行FMINCON优化需要8.79291秒。

使用并行遗传算法最小化

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

rng默认的%以获得与前一次运行相同的计算值如果gaoptions = optimoptions(gaoptions,“UseParallel”,真正的);startTime = tic;据nvar加索尔= ga (@expensive_objfun ,[],[],[],[],[],[],[], gaoptions);time_ga_parallel = toc(startTime);流(并行遗传算法优化需要%g秒。\n, time_ga_parallel);结束
单目标优化:4个变量选项: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_sequence time_fmincon_parallel];Y = [time_ga_sequence time_ga_parallel];T = [0 1];情节(t X,“r——”、t、Y,“k -”) ylabel (“时间以秒计”)传说(“fmincon”“遗传算法”) ax = gca;斧子。XTick = [0 1];斧子。XTickLabel = {“串行”“平行”};axis([0 1 0] ceil(max([X Y]))]) title(“连环vs平行时代”

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

相关的话题