主要内容

使用遗传算法解决混合整数工程设计问题,具体问题具体分析

这个例子展示了如何使用遗传算法解决混合整数工程设计问题(遗传算法在全球优化工具箱)解算器。例子使用了具体问题具体分析的方法。对于一个版本使用solver-based方法,明白了使用遗传算法解决混合整数工程设计问题

问题说明在这个例子中包括一个梯形悬臂梁的设计。特别是,梁必须能够携带规定的负载。优化问题是减少梁的体积受到各种工程设计约束。

这个问题被描述在Thanedar和Vanderplaats[1]

悬臂梁的设计问题

支持加强悬臂梁的一端,在自由端和负载应用,如下列图所示。金宝app光束必须能够支持给定的负载金宝app P 在一个固定的距离 l 的支持。金宝app梁的设计师可以改变宽度( b )和高度( h )的每个步骤,或部分。每个部分的悬臂长度相同, l = l 1

梁的体积

梁的体积 V 是各个部分的体积的总和。

V = l ( b 1 h 1 + b 2 h 2 + b 3 h 3 + b 4 h 4 + b 5 h 5 )

限制设计:弯曲应力

考虑一个悬臂梁,其横截面中心坐标中心在梁的自由端。弯曲应力在一个点 ( x , y , z ) 在梁的方程

σ b = ( x ) y / ,

在哪里 ( x ) 弯矩在吗 x , x 距离结束的负载, 是梁的惯性矩。

图中所示的加强悬臂梁中,每个部分的梁的最大力矩 P D ,在那里 D 最大距离最后加载吗 P 每个部分的光束。因此,的最大应力部分的梁 σ 是由

σ = P D ( h / 2 ) / ,

的最大应力出现在梁的边缘, y = h / 2 。该地区的惯性矩部分梁是由

= b h 3 / 1 2

用这个表达式的方程 σ 给了

σ = 6 P D / b h 2

的每一部分悬臂的弯曲应力不得超过最大允许压力 σ 一个 x 。因此,五个弯曲应力约束悬臂的为每个步骤(一):

6 P l b 5 h 5 2 σ 一个 x

6 P ( 2 l ) b 4 h 4 2 σ 一个 x

6 P ( 3 l ) b 3 h 3 2 σ 一个 x

6 P ( 4 l ) b 2 h 2 2 σ 一个 x

6 P ( 5 l ) b 1 h 1 2 σ 一个 x

限制设计:偏转

你可以计算悬臂梁的挠度使用卡斯蒂利亚诺第二定理,即

δ = U P ,

在哪里 δ 梁的挠度, U 是能量存储在梁由于作用力吗 P

能量存储在一个悬臂梁是由

U = 0 l 2 / 2 E d x ,

在哪里 应用力的时刻吗 x

考虑到 = P x 悬臂梁,你可以写前面的方程

U = P 2 / 2 E 0 l ( ( x + 4 l ) 2 / 1 + ( x + 3 l ) 2 / 2 + ( x + 2 l ) 2 / 3 + ( x + l ) 2 / 4 + x 2 / 5 ] d x ,

在哪里 n 惯性矩的面积nth悬臂的一部分。评估积分给这个表达式 U

U = ( P 2 / 2 ) ( l 3 / 3 E ) ( 6 1 / 1 + 3 7 / 2 + 1 9 / 3 + 7 / 4 + 1 / 5 )

应用卡斯蒂利亚诺定理,最后给出梁的挠度

δ = P l 3 / 3 E ( 6 1 / 1 + 3 7 / 2 + 1 9 / 3 + 7 / 4 + 1 / 5 )

悬臂梁的挠度 δ 必须小于最大允许偏差 δ 一个 x ,提供的约束

P l 3 / 3 E ( 6 1 / 1 + 3 7 / 2 + 1 9 / 3 + 7 / 4 + 1 / 5 ) δ 一个 x

限制设计:长宽比

对于悬臂的每一步,长宽比不得超过最大允许长宽比 一个 一个 x 。也就是说,

h / b 一个 一个 x = 1 , , 5

限制设计:边界和整数约束

光束可以加工的第一步只精确到厘米。也就是说, b 1 h 1 必须是整数。其余的变量是连续的。变量的范围是:

1 b 1 5

3 0 h 1 6 5

2 4 b 2 , b 3 3 1

4 5 h 2 , h 3 6 0

1 b 4 , b 5 5

3 0 h 4 , h 5 6 5

设计参数对这个问题

这个问题在这个例子中,最后加载梁必须支持金宝app P = 5 0 0 0 0 N

梁长度和最大挠度结束:

  • 梁总长度, l = 5 0 0 c

  • 梁的个别部分的长度, l = l 1 = 1 0 0 c

  • 最大的梁端挠度, δ 一个 x = 2 7 c

最大允许应力在梁的每一步 σ 一个 x = 1 4 0 0 0 N / c 2

杨氏模量的光束的每一步 E = 2 × 1 0 7 N / c 2

具体问题具体分析设置

关于这个问题创建优化变量。第一部分的宽度和高度变量类型的光束是整数,所以你必须创建它们独立于其他四个变量,这是连续的。

b1 = optimvar (“b1”,“类型”,“整数”,“下界”,1“UpperBound”5);h1 = optimvar (“标题”,“类型”,“整数”,“下界”30岁的“UpperBound”,65);公元前= optimvar (“公元前”4“下界”(2.4 2.4 - 1 1),“UpperBound”[3.1 - 3.1 5 5]);hc = optimvar (“hc”4“下界”(45岁30 30),“UpperBound”[60 60 65 65]);

为了方便起见,把高度和宽度变量成单个变量。然后您可以轻松表达目标和约束这些变量。

h = (h1, hc);b = (b1;公元前);

创建一个优化问题与梁的体积为目标函数,在每一步(或部分)的光束 l 1 = 1 0 0 厘米长:体积= l 1 h w

l1 = 100;%的每一步悬臂的长度概率= optimproblem (“客观”,l1 *点(h, b));

创建约束压力。

P = 50000;%端负载E = 2 e7;% ^ N /厘米2中杨氏模量铁镍薄板= 2.7;%最大偏转结束sigmaMax = 14000;%最大应力在梁的每个部分aMax = 20;%最大比例的每个部分压力= 6 * P * L_1. / (b。* (h ^ 2));stepnum = (5: 1:1);压力=压力。* stepnum;prob.Constraints。压力=压力< = sigmaMax;

创建约束偏转。

deflectionMultiplier = (P * l1 ^ 3 / E) * (28 244 148 76 4);bh3 = 1. / (b。* (h ^ 3));prob.Constraints.deflection = deflectionMultiplier * bh3 < =国际接轨;

创建纵横比的限制。

prob.Constraints。一个spect = h <= aMax*b;

审查问题的设置。

显示(概率)
OptimizationProblem:解:b1,公元前,h1, hc地点:b1, h1整数最小化:100 * h1 * b1公元前+ 100 * hc(1) *(1) +公元前100 * hc (2) * (2) + 100 * hc(3) *(3)公元前公元前+ 100 * hc(4) *(4)受压力:arg_LHS < = arg_RHS地点:最长= 0 (5、1);__arg1 = 0 (5、1);__arg1 (1) = h1;__arg1 (2:5) = hc;最长(1)= b1;公元前最长(2:5)=;arg_LHS =((30000000。/(最长(:)* __arg1 (:)。^ 2))。* extraParams {1});最长= 14000;__arg1 =最长((1、5));arg_RHS = __arg1 (:); extraParams{1}: 5 4 3 2 1 subject to deflection: arg_LHS <= 2.7 where: arg2 = zeros(5, 1); arg1 = zeros(5, 1); arg1(1) = h1; arg1(2:5) = hc; arg2(1) = b1; arg2(2:5) = bc; arg_LHS = (extraParams{1} * (1 ./ (arg2(:) .* arg1(:).^3))); extraParams{1}: 610000 370000 190000 70000 10000 subject to aspect: -20*b1 + h1 <= 0 -20*bc(1) + hc(1) <= 0 -20*bc(2) + hc(2) <= 0 -20*bc(3) + hc(3) <= 0 -20*bc(4) + hc(4) <= 0 variable bounds: 1 <= b1 <= 5 2.4 <= bc(1) <= 3.1 2.4 <= bc(2) <= 3.1 1 <= bc(3) <= 5 1 <= bc(4) <= 5 30 <= h1 <= 65 45 <= hc(1) <= 60 45 <= hc(2) <= 60 30 <= hc(3) <= 65 30 <= hc(4) <= 65

解决这个问题

设置选项使用适度人口规模150人,400年一代又一代的温和的最大数量,比默认的精英计数的一个小函数1 e-8公差,和一块功能显示在迭代函数值。

选择= optimoptions (@ga,“PopulationSize”,150,“MaxGenerations”,400,“EliteCount”10“FunctionTolerance”1 e-8“PlotFcn”,@gaplotbestf);

解决问题,指定遗传算法解算器和选择。

rng默认的%的再现性[溶胶,fval exitflag] =解决(概率,“规划求解”,“遗传算法”,“选项”选择)
用遗传算法解决问题。

图遗传算法包含一个坐标轴对象。坐标轴对象与标题最好:63671的意思是:124959年,包含一代,ylabel惩罚值包含2线类型的对象。一个或多个行显示的值只使用这些对象标记代表最好的惩罚值,意味着惩罚值。

优化终止:超过了一代又一代的最大数目。
索尔=结构体字段:b1:公元前3:x1双[4]h1: 60 hc: [4 x1双)
fval = 6.3671 e + 04
exitflag = SolverLimitExceeded

查看变量及其边界的解决方案。

宽度= [sol.b1; sol.bc];身高= [sol.h1; sol.hc];widthbounds = [b1。lowerBound b1.UpperBound; bc.LowerBound bc.UpperBound]; heightbounds = [h1.LowerBound h1.UpperBound; hc.LowerBound hc.UpperBound]; T = table(widths,heights,widthbounds,heightbounds,“VariableNames”,(“宽度”“高度”“宽度范围”“高度界限”])
T =5×4表宽度高度宽度范围高度范围交_______ _________________ 3 60 1 5 65 2.8105 56.211 2.4 3.1 45 45 60 60 2.6183 52.301 2.4 3.1 2.2351 43.822 1 5 65 65 1.902 33.566 - 1 5 30

解决方案是没有任何界限。第一个解决方案价值变量是整数,指定。

添加离散Noninteger变量约束

假设工程师学习,第二个和第三个步骤悬臂可以有宽度和高度选择的一套标准。的约束,是相同的一个解决这个问题[1]。

首先,描绘出额外的约束加入到优化:

  • 第二个和第三个步骤的宽度必须选择梁的设置(2.4,2.6,2.8,3.1)厘米。

  • 第二个和第三个步骤的高度必须选择梁的设置(45岁,50岁、55岁,60岁)厘米。

为了解决这个问题,您需要指定的变量 w c ( 1 ) , w c ( 2 ) , h c ( 1 ) , h c ( 2 ) 离散变量。理想情况下,您将使用 年代 ( x j ) 作为离散值, 年代 代表和允许的值 x j 变量代表一个问题。然而,您不能使用一个优化变量作为一个索引。您可以通过调用绕过这个问题fcn2optimexpr

widthlist = (2.4, 2.6, 2.8, 3.1);heightlist = [45 55 50 60];b23 = optimvar (“w23”2,“类型”,“整数”,“下界”,1“UpperBound”长度(widthlist));h23 = optimvar (“h23”2,“类型”,“整数”,“下界”,1“UpperBound”长度(heightlist));b45 = optimvar (“b45”2,“下界”,1“UpperBound”5);h45 = optimvar (“h45”2,“下界”30岁的“UpperBound”,65);%首选语法是我们= [widthlist (b23 (1)); widthlist (b23 (2)));然而,%这个语法是非法的。%,而不是叫fcn2optimexpr。我们= fcn2optimexpr (@ (x) [widthlist (x (1)); widthlist (x (2))), b23);他= fcn2optimexpr (@ (x) [heightlist (x (1)); heightlist (x (2))), h23);

早些时候,创建表达式bh来表示变量。

b = (b1;我们;b45);h = (h1;他;h45);

其余问题的配方是一样的。

prob2 = optimproblem (“客观”,l1 *点(h, b));

创建约束压力。

压力= 6 * P * L_1. / (b。* (h ^ 2));stepnum = (5: 1:1);压力=压力。* stepnum;prob2.Constraints。压力=压力< = sigmaMax;

创建约束偏转。

deflectionMultiplier = (P * l1 ^ 3 / E) * (28 244 148 76 4);bh3 = 1. / (b。* (h ^ 3));prob2.Constraints.deflection = deflectionMultiplier * bh3 < =国际接轨;

创建纵横比的限制。

prob2.Constraints。一个spect = h <= aMax*b;

审查问题的设置。

显示(prob2)
OptimizationProblem:解:b1, b45, h1, h23, h45, w23地点:b1, h1, h23 w23整数最小化:(100 * (__arg1 (:)。‘*最长(:)))地点:最长= 0 (5、1);__arg1 = 0 (5、1);anonymousFunction2 = @ (x) [heightlist (x (1)); heightlist (x (2)));__arg1 (1) = h1;__arg1 (2:3) = anonymousFunction2 (h23);__arg1 (4:5) = h45;anonymousFunction1 = @ (x) [widthlist (x (1)); widthlist (x (2)));最长(1)= b1;最长(2:3)= anonymousFunction1 (w23);最长(4:5)= b45; subject to stress: arg_LHS <= arg_RHS where: arg2 = zeros(5, 1); arg1 = zeros(5, 1); anonymousFunction2 = @(x)[heightlist(x(1));heightlist(x(2))]; arg1(1) = h1; arg1(2:3) = anonymousFunction2(h23); arg1(4:5) = h45; anonymousFunction1 = @(x)[widthlist(x(1));widthlist(x(2))]; arg2(1) = b1; arg2(2:3) = anonymousFunction1(w23); arg2(4:5) = b45; arg_LHS = ((30000000 ./ (arg2(:) .* arg1(:).^2)) .* extraParams{1}); arg2 = 14000; arg1 = arg2(ones(1,5)); arg_RHS = arg1(:); extraParams{1}: 5 4 3 2 1 subject to deflection: arg_LHS <= 2.7 where: arg2 = zeros(5, 1); arg1 = zeros(5, 1); anonymousFunction2 = @(x)[heightlist(x(1));heightlist(x(2))]; arg1(1) = h1; arg1(2:3) = anonymousFunction2(h23); arg1(4:5) = h45; anonymousFunction1 = @(x)[widthlist(x(1));widthlist(x(2))]; arg2(1) = b1; arg2(2:3) = anonymousFunction1(w23); arg2(4:5) = b45; arg_LHS = (extraParams{1} * (1 ./ (arg2(:) .* arg1(:).^3))); extraParams{1}: 610000 370000 190000 70000 10000 subject to aspect: arg_LHS <= arg_RHS where: arg1 = zeros(5, 1); arg1(1) = h1; anonymousFunction2 = @(x)[heightlist(x(1));heightlist(x(2))]; arg1(2:3) = anonymousFunction2(h23); arg1(4:5) = h45; arg_LHS = arg1(:); arg1 = zeros(5, 1); anonymousFunction1 = @(x)[widthlist(x(1));widthlist(x(2))]; arg1(1) = b1; arg1(2:3) = anonymousFunction1(w23); arg1(4:5) = b45; arg_RHS = (20 .* arg1(:)); variable bounds: 1 <= b1 <= 5 1 <= b45(1) <= 5 1 <= b45(2) <= 5 30 <= h1 <= 65 1 <= h23(1) <= 4 1 <= h23(2) <= 4 30 <= h45(1) <= 65 30 <= h45(2) <= 65 1 <= w23(1) <= 4 1 <= w23(2) <= 4

解决离散变量约束的问题

解决问题,指定遗传算法解算器和选择。

rng默认的%的再现性[sol2, fval2 exitflag2] =解决(prob2,“规划求解”,“遗传算法”,“选项”选择)
用遗传算法解决问题。

图遗传算法包含一个坐标轴对象。坐标轴对象与标题最好:64803.2的意思是:69025.3,包含一代,ylabel惩罚值包含2线类型的对象。一个或多个行显示的值只使用这些对象标记代表最好的惩罚值,意味着惩罚值。

优化终止:超过了一代又一代的最大数目。
sol2 =结构体字段:b1: 3 b45 (2 x1双):h1: 60 h23: [2 x1双]h45: [2 x1双]w23: [2 x1双)
fval2 = 6.4803 e + 04
exitflag2 = SolverLimitExceeded

客观价值增加,因为增加约束只能增加的目标。

查看解决方案并比较其边界。

宽度= [sol2.b1; widthlist (sol2.w23 (1)); widthlist (sol2.w23 (2)); sol2.b45);身高= [sol2.h1; heightlist (sol2.h23 (1)); heightlist (sol2.h23 (2)); sol2.h45);widthbounds = [b1。lowerBound b1.UpperBound; widthlist(1) widthlist(end); widthlist(1) widthlist(end); b45.LowerBound b45.UpperBound]; heightbounds = [h1.LowerBound h1.UpperBound; heightlist(1) heightlist(end); heightlist(1) heightlist(end); h45.LowerBound h45.UpperBound]; T = table(widths,heights,widthbounds,heightbounds,“VariableNames”,(“宽度”“高度”“宽度范围”“高度界限”])
T =5×4表宽度高度宽度范围高度范围交_______ _________________ 3 60 55 1 5 65 3.1 2.4 3.1 2.6 45 60 50 60 2.286 - 45.72 2.4 - 3.1 45 1 5 65 65 1.8532 34.004 - 1 5 30

唯一的解决办法在绑定变量是第二部分的宽度,为3.1,其最大值。

引用

[1]Thanedar, p . B。,G. N. Vanderplaats. "Survey of Discrete Variable Optimization for Structural Design."结构工程杂志121(3),1995年,页301 - 306。

另请参阅

||

相关的话题