主要内容

并行优化的颂歌

这个例子展示了如何优化参数的颂歌。

它还展示了如何避免计算目标和非线性约束函数返回两次当ODE的解决方案。这个例子比较patternsearch遗传算法运行的时间解算器和质量的解决方案。金宝搏官方网站

你需要一个并行计算工具箱™许可使用并行计算。

步骤1。定义问题。

问题是改变炮发射弹丸的位置和角度尽可能超越了一堵墙。大炮初速300米/秒。墙上是20米高。如果炮太靠近墙壁,它太陡峭的一个角,开火,弹不足够远的旅行。如果太远从墙上大炮,弹不旅行足够远。

空气阻力降低弹丸。阻力正比于速度的平方,比例常数为0.02。重力作用于弹丸,加速下行与常数9.81 m / s2。因此,运动方程的轨迹x(t)

d 2 x ( t ) d t 2 = 0.02 v ( t ) v ( t ) ( 0 , 9.81 ) ,

在哪里 v ( t ) = d x ( t ) / d t

初始位置x0和初始速度xp0是二维向量。然而,最初的高度x0 (2)是0,所以初始位置只取决于标量吗x0 (1)。和初速度xp0300级(炮口速度),所以只取决于初始角,一个标量。对于一个初始角th,xp0=300 * (cos (th), sin (th))。因此,只取决于两个标量优化问题,所以这是一个二维问题。使用水平距离和角度作为决策变量。

步骤2。制定ODE模型。

ODE解决需要你制定你的模型作为一个一阶系统。增加轨迹向量(x1(t),x2(t)及其时间导数(x1(t),x2(t),形成一个四维轨迹向量。这个增广向量、微分方程

d d t x ( t ) = ( x 3 ( t ) x 4 ( t ) 02 ( x 3 ( t ) , x 4 ( t ) ) x 3 ( t ) 02 ( x 3 ( t ) , x 4 ( t ) ) x 4 ( t ) 9.81 ]

把微分方程写成一个函数文件,并将其保存在你的MATLAB®路径。

函数f = cannonfodder (t, x) f = [x (3), (4); x (3); x (4)];%初始,得到f f(1)和(2)正确全国抵抗运动=规范(x (3:4)) * 02;%的速度乘以常数f (3) = - x(3) *全国抵抗运动;%的水平加速度f (4) = - x(4) *全国抵抗运动- 9.81;%的垂直加速度

可视化的解决方案》开始在一个角度从墙上30米π/ 3

代码生成图

步骤3。使用patternsearch解决。

问题是找到初始位置x0 (1)和初始角x0 (2)从墙上的距离最大化弹丸之地。因为这是一个最大化问题,减少负的距离(见最大化和最小化)。

使用patternsearch为了解决这个问题,你必须提供客观、约束,最初的猜测,和选项。

这两个文件是目标和约束函数。将它们复制到一个文件夹在你MATLAB路径。

函数f = cannonobjective x0 (x) = (x (1); 0; 300 * cos (x (2)); 300 * sin (x (2)));索尔=数值(@cannonfodder [0, 15], x0);% y_2时找到时间t (t) = 0zerofnd = fzero (@ (r)德瓦尔(sol r 2), [sol.x (2), sol.x(结束)]);%然后找到当时的坐标f =德瓦尔(sol zerofnd 1);f = - f;%采取消极的距离最大化函数测查[c] = cannonconstraint测查(x) = [];x0 = [x (1), 0; 300 * cos (x (2)); 300 * sin (x (2)));索尔=数值(@cannonfodder [0, 15], x0);如果sol.y (1) < = 0%弹从未达到墙c = 20 - sol.y (2);其他的%找到当弹丸穿过x = 0zerofnd = fzero (@ (r)德瓦尔(溶胶,r, 1), [sol.x (2), sol.x(结束)]);%然后发现高度,减去20c = 20 -德瓦尔(sol zerofnd 2);结束

注意,目标和约束函数的输入变量x04 d ODE求解器的初始点。ODE求解器不停止如果弹到墙上。相反,约束函数简单地变得积极,指示一个不可行的初始值。

初始位置x0 (1)不能高于0,它是低于-200是无意义的。(应该是-20点附近,因为没有空气阻力,最长的轨迹将会从-20年开始在一个角度π/ 4)。同样,初始角x0 (2)不能低于0,不能π/ 2。设置范围稍微远离这些初始值:

磅= (-200;0.05);乌兰巴托=(1;π/ 2 . 05);x0 =(-30,π/ 3);%初始猜测

设置UseCompletePoll选项真正的。这给了一个高质量的解决方案,与并行处理,使直接比较,因为并行计算需要此设置。

选择= optimoptions (“patternsearch”,“UseCompletePoll”,真正的);

调用patternsearch来解决这个问题。

抽搐%的解决方案[xsolution、距离、eflag, outpt] = patternsearch (x0, @cannonobjective[],[]、[][],磅,乌兰巴托,@cannonconstraint选择)toc
优化终止:网格大小小于选项。MeshTolerance和约束违反小于options.ConstraintTolerance。xsolution = -28.8123 - 0.6095 = -125.9880距离eflag = 1 outpt =结构体字段:功能:@cannonobjective problemtype:“nonlinearconstr”pollmethod:“gpspositivebasis2n”maxconstraint: 0 searchmethod:[]迭代:5 funccount: 269 meshsize: 8.9125 e-07 rngstate: [1×1 struct]消息:“优化终止:网格大小小于选项。MeshTolerance↵和约束违反小于options.ConstraintTolerance。运行时间是0.792152秒。

从墙上开始弹约29米0.6095一个角弧度结果最远的距离,大约126米。距离是负面报道,因为目标函数是负的距离在墙上。

可视化的解决方案。

x0 = [xsolution (1), 0; 300 * cos (xsolution(2)); 300 *罪(xsolution (2)));索尔=数值(@cannonfodder [0, 15], x0);%找到弹丸之地的时候zerofnd = fzero (@ (r)德瓦尔(sol r 2), [sol.x (2), sol.x(结束)]);t = linspace (0, zerofnd);% =时间阴谋x =德瓦尔(sol t 1);%以内插值替换的x值y =德瓦尔(sol t 2);%以内插值替换的y值情节(x, y)情节([0,0],[0,20],“k”)%画出墙包含(的水平距离)ylabel (的轨道高度)传说(“轨迹”,“墙”,“位置”,“西北”70)ylim ([0])

步骤4。避免昂贵的子例程调用两次。

客观和非线性约束函数调用ODE求解器计算它们的值。使用这项技术客观和非线性约束在同一功能为了避免两次调用解算器。的runcannon文件实现这种技术。将该文件复制到一个文件夹在MATLAB的路径上。

函数[x, f, eflag, outpt] = runcannon (x0,选择)如果输入参数个数= = 1%没有提供选项选择= [];结束xLast = [];% ode求解器被称为最后的地方索尔= [];%的颂歌解决方案结构有趣= @objfun;%的目标函数,下面的嵌套cfun = @constr;%的约束函数,下面的嵌套磅= (-200;0.05);乌兰巴托=(1;π/ 2 . 05);%叫patternsearch[x, f, eflag, outpt] = patternsearch(有趣,x0,[]、[][],[],磅,乌兰巴托,cfun,选择);函数y = objfun (x)如果~ isequal (x, xLast)%检查计算是否必要x0 = [x (1), 0; 300 * cos (x (2)); 300 * sin (x (2)));索尔=数值(@cannonfodder [0, 15], x0);xLast = x;结束%计算目标函数%首先找到当弹丸撞击地面zerofnd = fzero (@ (r)德瓦尔(sol r 2), [sol.x (2), sol.x(结束)]);%然后计算坐标y =德瓦尔(sol zerofnd 1);y = - y;%的负距离结束函数测查[c] =若干测查(x) = [];如果~ isequal (x, xLast)%检查计算是否必要x0 = [x (1), 0; 300 * cos (x (2)); 300 * sin (x (2)));索尔=数值(@cannonfodder [0, 15], x0);xLast = x;结束现在%计算约束功能%首先找到当弹丸穿过x = 0zerofnd = fzero (@ (r)德瓦尔(溶胶,r, 1), [sol.x (1) sol.x(结束)]);%然后发现高度,减去20c = 20 -德瓦尔(sol zerofnd 2);结束结束

重新启动时间和调用的问题runcannon

x0 =(-30;π/ 3);(xsolution抽搐,距离、eflag outpt] = runcannon (x0,选择);toc
优化终止:网格大小小于选项。MeshTolerance和约束违反小于options.ConstraintTolerance。运行时间是0.670715秒。

的解算器比以前跑得更快。如果你检查解决方案,您看到的输出是相同的。

第5步。并行计算。

尝试通过并行计算来节省更多的时间。首先打开一个平行的工人。

parpool
parpool开始使用“本地”概要文件…连接到平行池(工人数量:6)。ans = ProcessPool属性:连接:真正的NumWorkers: 6集群:本地AttachedFiles: {} AutoAddClientPath:真正的IdleTimeout: 30分钟(30分钟)SpmdEnabled:真的

将选项设置为使用并行计算,重新运行解算器。

选择= optimoptions (“patternsearch”选择,“UseParallel”,真正的);x0 =(-30;π/ 3);(xsolution抽搐,距离、eflag outpt] = runcannon (x0,选择);toc
优化终止:网格大小小于选项。MeshTolerance和约束违反小于options.ConstraintTolerance。运行时间是1.894515秒。

在这种情况下,并行计算是较慢的。如果你检查解决方案,您看到的输出是相同的。

步骤6。与遗传算法进行比较。

你也可以尝试使用遗传算法来解决这个问题。然而,遗传算法通常是缓慢和不可靠。

在解释客观和非线性约束在同一功能使用时,你不能节省时间遗传算法嵌套函数所使用的技术patternsearch在步骤4。相反,叫遗传算法同时通过设置适当的选项。

选择= optimoptions (“遗传算法”,“UseParallel”,真正的);rng默认的%的再现性抽搐%的解决方案[xsolution、距离、eflag, outpt] = ga (@cannonobjective 2[],[]、[][],磅,乌兰巴托,toc @cannonconstraint、期权)
优化终止:健身价值低于平均变化的选择。FunctionTolerance和约束违反小于options.ConstraintTolerance。xsolution = -37.6217 - 0.4926 = -122.2181距离eflag = 1 outpt =结构体字段:problemtype:“nonlinearconstr”rngstate: [1×1 struct]代:4 funccount: 9874信息:优化终止:健身的平均变化值小于选项。FunctionTolerance↵和约束违反小于options.ConstraintTolerance。“maxconstraint: 0 hybridflag:[]运行时间是12.529131秒。

遗传算法解决方案是不如patternsearch解决方案:122米和126米。遗传算法需要更多时间:大约12和2岁以下的年代;patternsearch花更少时间在串行和嵌套,小于1。运行遗传算法连续需要更长时间,大约30年代在一个测试运行。

相关的例子

更多关于