用遗传算法求解一个混合整数工程设计问题
这个例子展示如何用遗传算法(遗传算法
)全局优化工具箱中的求解器。
本例中所阐述的问题涉及阶梯式悬臂梁的设计。特别地,梁必须能够承受规定的末端载荷。我们将在各种工程设计约束条件下解决一个最小化梁体积的问题。
在本例中,我们将解决在[1]中发布的问题的两个有界版本。
阶梯式悬臂梁设计问题
一端支撑阶梯式悬臂梁,自由端受力,如下图所示。万博1manbetx横梁必须能够支撑给定的载荷,万博1manbetx,在固定的距离来自支持。万博1manbetx梁的设计者可以改变宽度()和高度()。我们假设悬臂的每一段都有相同的长度,.
光束体积
光束的体积,,为各截面体积之和
设计约束条件:1 -弯曲应力
考虑一个单一的悬臂梁,其坐标中心在其横截面的中心在梁的自由端。一点上的弯曲应力在梁中由下面的方程给出
在哪里弯矩在吗,到终点的距离是载荷和是梁的面积惯性矩。
现在,在图中所示的阶梯式悬臂梁中,梁各截面的最大弯矩为,在那里是到末端载荷的最大距离,,为梁的每一段。因此,最大应力为梁的-截面,,由
当最大应力出现在梁的边缘时,.面积转动惯量梁的第-截面由
把这个代入方程给了
悬臂各部分的弯曲应力不应超过最大许用应力,.因此,我们最终可以陈述5个弯曲应力约束(一个用于悬臂的每一步)
设计约束条件:2 -端部偏转
悬臂梁的末端挠度可以用Castigliano第二定理来计算,该定理指出
在哪里是梁的偏转,是由于施加的力而储存在梁中的能量,.
储存在悬臂梁中的能量由
在哪里力的力矩在吗.
考虑到对于悬臂梁,我们可以把上面的方程写成
在哪里面积的转动惯量是多少悬臂的-th部分。求积分的表达式如下.
应用Castigliano定理,给出了梁的末端挠度
现在,悬臂的末端偏转,,应小于最大允许挠度,,得到如下约束条件。
设计限制:3 -长宽比
对于悬臂的每一步,长宽比不得超过最大允许长宽比,.也就是说,
为
阐述优化问题
我们现在能够陈述问题,找到阶梯悬臂梁的最佳参数给定的约束条件。
让,,,,,,,,而且
最小化:
主题:
光束的第一步只能加工到最近的厘米。也就是说,而且必须为整数。其余变量是连续的。变量的边界如下:-
本问题的设计参数
对于本例中我们要解决的问题,梁必须支撑的端荷载为万博1manbetx.
梁长和最大端部挠度为:
总光束长度,
梁的单个截面,
最大梁端挠度,
梁的每一步的最大允许应力,
梁的每一阶杨氏模量,
求解混合整数优化问题
我们现在解决了中描述的问题阐述优化问题.
定义适应度和约束函数
检查MATLAB®文件cantileverVolume.m
而且cantileverConstraints.m
看看适应度和约束函数是如何实现的。
关于线性约束的注意事项:将线性约束指定为遗传算法
时,通常通过一个
,b
,Aeq
而且说真的
输入。在这种情况下,我们通过非线性约束函数来指定它们。这是因为在这个例子的后面,一些变量将成为离散的。当问题中存在离散变量时,在非线性约束函数中指定线性约束要容易得多。另一种方法是修改线性约束矩阵以在转换后的变量空间中工作,这不是简单的,也许是不可能的。同样,在混合整数中遗传算法
在求解器中,线性约束与非线性约束没有任何区别,无论它们是如何指定的。
设定界限
创建包含下界(磅
)和上限约束(乌兰巴托
).
Lb = [1 30 2.4 45 2.4 45 1 30 1 30];Ub = [5 65 3.1 60 3.1 60 5 65 5 65];
设置选项
为了获得更精确的解,我们增加PopulationSize
,MaxGenerations
选项从其默认值,并减少EliteCount
而且FunctionTolerance
选项。这些设置导致遗传算法
使用更大的种群(增加PopulationSize),增加设计空间的搜索(减少EliteCount),并一直进行,直到其最佳成员的变化很小(小FunctionTolerance)。我们还指定了一个绘图函数来监视惩罚函数值为遗传算法
的进展。
注意,有一组有限的遗传算法
解决混合整数问题时可用的选项-有关详细信息,请参阅全局优化工具箱用户指南。
Opts = optimoptions(@ga,...“PopulationSize”, 150,...“MaxGenerations”, 200,...“EliteCount”10...“FunctionTolerance”1 e-8...“PlotFcn”, @gaplotbestf);
调用遗传算法
解决问题
我们现在可以调用遗传算法
解决问题。在问题陈述中而且都是整数变量。我们通过传递下标向量来指定它(1 2)
来遗传算法
在非线性约束输入之后,在选项输入之前。为了重现性,我们还在这里设置随机数生成器。
rng (0,“旋风”);[xb, fb, exitflag] = ga (@cantileverVolume 10 , [], [], [], [],...lb, ub, @悬臂约束,[1 2],opts);
优化终止:超过最大代数。
分析结果
如果一个问题有整数约束,遗传算法
在内部重新制定。特别地,问题中的适应度函数被处理约束的惩罚函数所取代。对于可行种群成员,惩罚函数与适应度函数相同。
溶液从遗传算法
如下所示。注意,最靠近支撑的部分被限制为宽度(万博1manbetx)和高度(),这是一个整数值,该约束已被GA所遵守。
显示(xb);
xbest =第1 ~ 7列3.0000 60.0000 2.8504 57.0057 2.6114 50.6243 2.2132第8 ~ 10列44.2349 1.7543 35.0595
我们也可以问遗传算法
返回光束的最佳体积。
流('\nCost函数由ga返回= %g\n'、fb);
ga返回的代价函数= 63408.9
添加离散非整数变量约束
工程师们现在被告知,悬臂的第二和第三级台阶的宽度和高度只能从标准设置中选择。在本节中,我们将展示如何将此约束添加到优化问题中。注意,添加这个约束后,这个问题与[1]中解决的问题相同。
首先,我们说明将添加到上述优化中的额外约束
梁的第二步和第三步的宽度必须从以下一组中选择:-[2.4,2.6,2.8,3.1]厘米
梁的第二步和第三步的高度必须从以下集合中选择:-[45,50,55,60]厘米
为了解决这个问题,我们需要能够指定变量,,而且作为离散变量。要指定一个组件从集合中取离散值,优化取值为1到的整数变量,并使用作为离散值。要指定范围(1到),设1为下界,作为上界。
首先我们变换离散变量的边界。每个集合有4个成员,我们将离散变量映射到范围[1,4]的整数。为了将这些变量映射为整数,我们将每个变量的下界设为1上界设为4。
Lb = [1 30 1 1 1 1 1 30 1 30];Ub = [5 65 4 4 4 4 5 5 65 5 65];
的转换(整数)版本,,而且现在将传递到适应度和约束函数时遗传算法
解算器叫做。为了正确计算这些函数,,,而且需要转换为这些函数中给定离散集的一个成员。要了解这是如何做到的,请检查MATLAB文件cantileverVolumeWithDisc.m
,cantileverConstraintsWithDisc.m
而且cantileverMapVariables.m
.
现在我们可以调用遗传算法
用离散变量来解决这个问题。在这种情况下都是整数。这意味着我们传递下标向量1:6
来遗传算法
定义整数变量。
rng (0,“旋风”);[xbestDisc, fbestDisc, exitflagDisc] = ga(@悬臂volumewithdisc,...10, [], [], [], [], lb, ub, @cantileverConstraintsWithDisc, 1:6, opts);
优化终止:超过最大代数。
分析结果
xbestDisc(三6)
返回。遗传算法
作为整数(即转换后的状态)。我们需要反向转换以检索其工程单元中的值。
xbestDisc = cantileverMapVariables(xbestDisc);显示(xbestDisc);
xbestDisc =列1 ~ 7 3.0000 60.0000 3.1000 55.0000 2.6000 50.0000 2.2430列8 ~ 10 44.8603 1.8279 36.5593
和以前一样,溶液从遗传算法
遵守约束条件而且都是整数。我们也可以看到,从[2.4,2.6,2.8,3.1]cm和,从[45,50,55,60]cm中选择。
回想一下,我们在变量上添加了额外的约束x (3)
,x (4)
,x (5)
而且x (6)
.正如预期的那样,当这些变量上存在额外的离散约束时,最优解具有更高的最小体积。进一步注意,[1]中报告的解决方案的最小体积为并且我们找到了一个与[1]中报道的近似相同的解决方案。
流('\nCost函数由ga返回= %g\n', fbestDisc);
ga返回的代价函数= 64795
总结
这个例子说明了如何使用遗传算法求解器,遗传算法
,求解具有整数约束的约束非线性优化问题。这个例子还展示了如何处理问题公式中有离散变量的问题。
参考文献
Thanedar, P. B.和G. N. Vanderplaats。结构设计中的离散变量优化研究综述土木工程学报(自然科学版),2005,第3期。