主要内容

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

此示例显示如何使用优化工具箱™和全局优化工具箱中的函数加快最小化昂贵的优化问题。在示例的第一部分,我们通过以串行方式评估函数来解决优化问题,并且在示例的第二部分中,我们使用并行循环解决相同的问题(议案)通过并行评估函数来进行特征。我们比较两种情况下优化函数所花费的时间。

昂贵的优化问题

出于该示例的目的,我们在四个变量中解决了一个问题,其中目标和约束函数通过暂停构造昂贵。

功能f = ulipal_objfun(x)%EXPENSIVE_OBJFUN一个昂贵的目标函数,使用在optimpars,例如。%版权所有2007-2013 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] = ulipal_confun(x)%EXPENSIVE_CONFUN在optimparar中使用的昂贵的约束函数,例如。%版权所有2007-2013 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];%没有非线性平等约束:CEQ = [];

最小化使用粉刺

我们有兴趣衡量所花费的时间粉刺在串行中,我们可以将其与并行时间进行比较。

startPoint = [-1 1 1 -1];选择= optimoptions ('粉丝''展示''iter'“算法”“内点”);开始时间=抽搐;xsol = fmincon (@expensive_objfun,曾经繁荣 ,[],[],[],[],[],[],@ expensive_confun选项);time_fmincon_sequential = toc(starttime);fprintf('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秒。

遗传算法最小化

自从遗传算法通常需要更多的功能评估粉刺,我们从这个问题中移除昂贵的约束,并执行无约束优化。通过空矩阵[]对于约束。此外,我们将几代数量限制为15遗传算法以便遗传算法可以在合理的时间内终止。我们有兴趣衡量所花费的时间遗传算法这样我们就可以把它和平行线做比较遗传算法评估。注意,运行遗传算法需要全局优化工具箱。

RNG.默认重复性的%尝试Gaavailable = false;nvar = 4;gaoptions = Optimoptions(“遗传算法”'maxgenerations'15,'展示''iter');开始时间=抽搐;据nvar加索尔= ga (@expensive_objfun ,[],[],[],[],[],[],[], gaoptions);time_ga_sequential = toc(开始时间);fprintf('串行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秒。

设置并行计算工具箱

优化工具箱中的功能使用的有限差异与近似衍生物一起使用议案功能如果可用并行计算工具箱,并且有一个并行工人池。相似地,遗传算法gamultiobj, 和patternsearch全局优化工具箱中的求解器并行评估函数。用来议案功能,我们使用parpool.函数设置并行环境。发表这个例子的计算机有四个核,所以parpool.启动四个Matlab®工人。如果在运行此示例时已经有一个并行池,则使用该池;查看文档parpool.为更多的信息。

如果max(size(gcp))== 0需要%并行池parpool.%创建并行池结束

尽量减少使用并行粉刺

用并行最小化我们昂贵的优化问题粉刺功能,我们需要明确表示我们的目标和约束函数可以并行评估,我们想要粉刺尽可能使用其并行功能。目前,可以并行完成有限差异。我们有兴趣衡量所花费的时间粉刺这样我们就可以将其与序列进行比较粉刺运行。

选项= Optimoptions(选项,'使用指平行',真正的);开始时间=抽搐;xsol = fmincon (@expensive_objfun,曾经繁荣 ,[],[],[],[],[],[],@ expensive_confun选项);time_fmincon_parallel = toc(开始时间);fprintf(“平行粉刺优化取得%克秒。\ n',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.默认%以获得与以前的运行相同的评估如果高可行的GaOptions = Optimoptions(GaOptions,'使用指平行',真正的);开始时间=抽搐;据nvar加索尔= ga (@expensive_objfun ,[],[],[],[],[],[],[], gaoptions);time_ga_parallel = toc(开始时间);fprintf(“并行GA优化花费%g秒。\n”,time_ga_parelatel);结束
最佳意味着停滞一代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('在几秒钟内') 传奇('粉丝'“遗传算法”斧头= GCA;ax.xtick = [0 1];ax.xticklabel = {'序列'“平行”};轴([0 1 0 cell (max([X Y]))]) title('串行与平行时间'

通过并行功能评估通过议案提高了两者的效率粉刺遗传算法。改进通常更好地用于昂贵的目标和约束函数。

相关话题