主要内容

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

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

昂贵的优化问题

为了这个例子的目的,我们用四个变量来解决一个问题,其中目标函数和约束函数通过暂停人为地变得昂贵。

函数f = expensive_objfun (x)%EXPENSIVE_OBJFUN一个昂贵的目标函数,使用在optimpars,例如。版权所有2007-2013 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)%EXPENSIVE_CONFUN在optimparar中使用的昂贵的约束函数,例如。版权所有2007-2013 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(开始时间);流('Serial FMINCON optimization takes %g seconds.\n', time_fmincon_sequential);
Iter的一阶范数f(x)可行性优化步骤05 1.839397e+00 1.500e+00 3.211e+00 1 11 -9.760099e-01 3.708e+00 7.902e-01 2.362e+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.218e+00 4 29 -2.823630e+00 0.000e+00 2.598e+00 1.118e+00 5 34 -3.905339e+00 0.000e+00 1.210e+00 7.302e-01 611 64 -7.155325e+00 0.000e+00 1.365e-01 2.626e-01 12 69 -7.179122e+00 0.000e+00 6.336e- 01 9.115e-02 13 7415 84 -7.180410e+00 0.000e+00 6.189e-06 3.122e-04满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。串行FMINCON优化耗时17.0722秒。

遗传算法最小化

遗传算法通常需要更多的函数求值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;我警告消息(“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 10 550 -1.52 e + 43-3.113e+41 0 11 600 -2.273e+45 -4.67e+43 0 12 650 -2.589e+47 -6.281e+45 0 13 700 -2.589e+47 -1.015e+46 1 14 750 -8.149e+47 -5.855e+46 015 800 -9.503e+47 -1.29e+47 0优化终止:最大代数超过。串行GA优化需要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秒。”, time_fmincon_parallel);
Iter的一阶范数f(x)可行性优化步骤05 1.839397e+00 1.500e+00 3.211e+00 1 11 -9.760099e-01 3.708e+00 7.902e-01 2.362e+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.218e+00 4 29 -2.823630e+00 0.000e+00 2.598e+00 1.118e+00 5 34 -3.905339e+00 0.000e+00 1.210e+00 7.302e-01 611 64 -7.155325e+00 0.000e+00 1.365e-01 2.626e-01 12 69 -7.179122e+00 0.000e+00 6.336e- 01 9.115e-02 13 7415 84 -7.180410e+00 0.000e+00 6.189e-06 3.122e-04满足约束条件的局部最小值。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。并行FMINCON优化需要8.11945秒。

并行遗传算法最小化

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

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 10 550 -1.52 e + 43-3.113e+41 0 11 600 -2.273e+45 -4.67e+43 0 12 650 -2.589e+47 -6.281e+45 0 13 700 -2.589e+47 -1.015e+46 1 14 750 -8.149e+47 -5.855e+46 015 800 -9.503e+47 -1.29e+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 = gca;斧子。XTick = [0 1];斧子。XTickLabel = {“串行”“平行”};轴([0 1 0 cell (max([X Y]))]) title(“串行与并行时间”

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

相关的话题