第七章 基于遗传算法的大规模工程优化设计方法初探
§7.1 概述
前面的章节对单目标遗传算法作了较深入的研究,并作了一些改进,提出了摄动单目标遗传算法,并做了将一般的传统的优化算法(包括改进的MDOD法﹑约束复合形法﹑约束变尺度法)与遗传算法进行结合的研究,取得了较好的效果。
但是如果要解的问题是大规模的优化问题,这些改进措施的效果并不理想。在采用规划类算法求解大规模优化问题时,遇到的问题主要有以下几个:(1)敏度分析计算代价很大,以常用的中心差分为例,假设问题的维数为 ,计算一次需要分析模型 次,对于复杂的结构有限元分析和CFD计算,进行一次完整的分析花费的时间是比较多的。随着维数的增加,需要的计算代价可能会超过我们的承受能力,所以现在在结构设计方面有一些基于结构刚度方程的近似敏度分析算法。但是离完全解决问题还有很长的距离,另外一点就是规划法往往采用一维搜索法,虽然采用的方法都比较的高效,但如果由于某种原因(比如初始点的原因﹑优化参数的原因)导致迭代的步数较多,一维搜索的总的计算量也是相当大的。(2)随着问题维数的增加,对于某些比较高效的算法,需要的存储代价也比较大,虽然现在对于节省内存的迫切性比以前有所降低,但是内存开销较大的缺点将使得采用常规配置的计算机计算时间显著增加,这是因为,目前计算机均是采用位于硬盘上的分页文件来模拟物理内存,所以即使系统满足对大内存的申请,也会付出速度上的较大的代价。(3)由于维数的增加,计算误差不可避免的会增加,对于某些存在误差积累问题的优化算法,这将会是一个比较严重的问题。
目前对于大规模的优化问题出现了一些新的算法,遗传算法就是其中的一个分支,但是关于采用遗传算法求解大规模优化问题目前还处在比较初始的阶段,由于维数的增加,出现的计算困难,采用一般遗传算法求解效果有限,本章将就遗传算法在大规模数值优化问题求解上做一些初步的工作。
§7.2 一种新的基于实数编码的稳态遗传算法
§7.2.1 实数编码的引入
在遗传算法中采用二进制编码有如下一些优点:
(1)二进制编码类似于生物染色体的组成,因而算法易于用生物遗传理论
来解释并使得遗传操作如杂交﹑变异很容易实现;
(2)采用二进制编码,算法处理的模式最多;
但如果用二进制编码的遗传算法在求解连续变量优化问题时,存在以下的缺点:
(1) 相邻整数的二进制编码可能具有较大的Hamming距离,例如15和16
的二进制表示为01111和10000,因此,算法要从15改进到16,则必须改变所有的位。这种缺陷将降低遗传算子的收敛效率。二进制编码的这一缺点有时称为海明悬崖(Hamming cliffs);
(2) 二进制编码时,一般要先给出求解的精度以确定串长,而一当精度
确定后,就很难在算法执行过程中进行调整。从而使算法缺乏微调(fine-turning)的功能。若在算法一开始就选取较高的精度,那么串长就很大,这样也将降低算法的效率。
(3) 在求解高维优化问题时,二进制编码串将非常之长。从而使得算法
的搜索效率很低。
为了克服二进制编码的缺点,对于问题的变量是实向量的情况,可以直接采用实数编码。采用实数编码也便于引入与问题领域相关的启发信息以增加遗传算法的搜索能力。
§7.2.2 一些常用的实数编码遗传算子
对于实数编码的情形,从理论上讲,二进制编码下的各种遗传操作同样可以使用,但在实际中往往是针对实数编码的特性,引入其他一些遗传算子。
以下是一些常用的实数编码的杂交算子:
设 和 是两个父代解向量, , 是通过杂交获得的两个后代。
(1)离散杂交(Discrete Crosssover)
离散杂交又分为部分离散杂交和整体离散杂交。部分离散杂交即是在父代解向量中选择一部分变量(如一个分量或从某个分量以后的所有分量),然后交换这些分量以形成后代,如选择交换第 个分量以后的所有分量,则两个后代为
(7-1)
(7-2)
而整体杂交则是以 的概率交换 和 的所有分量,这有点象二进制编码时的均匀性杂交。也可以通过生成模板的形式来实现。若某一位是1,则交换相应的位置,否则保留。
(2)算术杂交(arithmetical crossover)
算术杂交也分为部分算术杂交和整体算术杂交。
部分算术杂交也是先在父代解向量中选择一部分分量,如第 个分量以后的所有分量,然后生成 个 区间的随机数 ,则两个后代定义为:
(7-3)
(7-4)
当然这里我们也可以取 ,从而只需要一个随机数。
整体算术杂交生成 个 区间的 ,组合方式与部分算术杂交相同。
从几何的角度看,我们可以通过 产生 中的一个超立方体,则离散杂交产生的后代都是这个超立方体的顶点,而算术杂交产生的后代则是超立方体内部的点。从这一点来看,算术杂交的搜索范围比离散杂交要大。在实数编码时,杂交算子的作用远没有二进制编码时显得那样重要,故而采用何种杂交算子对算法的性能影响不是很大。
下面介绍在实数编码遗传算法中起很大作用的变异算子,在实数编码时,变异算子的作用不再象二进制编码时仅仅是简单地恢复群体中多样性的损失,它已经成为一个主要的搜索算子。为此,人们设计了很多的变异算子。
(1)非一致性变异
在传统的遗传算法中,算子的作用和代数是没有直接关系的。从而,当算法演化到一定代以后,由于缺乏局部搜索,传统的遗传算子将很难获得收益。基于以上原因,Z.Michalewicz首先将变异算子的结果与演化代数联系起来,使得在演化的初期,变异算子范围相对较大,而随着演化的推进,变异的范围越来越小,起着一种对演化系统的微调作用。其具体描述如下:
设 是一个父解,分量 被选为进行变异,其定义区间是 ,则变异后的解为 ,其中
(7-5)
注:上式中的 为产生均匀分布随机数的函数。
函数 的具体表达式可以取为
(7-6)
这里 是 上的一个随机数, 为最大代数, 是决定非一致性程度的一个参数,它起着调整局部搜索区域的作用,其取值一般为2到5。
(2)自适应性变异
虽然非一致变异加强了算法的局部搜索能力,但局部搜索的范围只与演化代数有关,而与解的质量无关,即无论解的质量好坏,其搜索范围都是相同的。更为合理的情形应该是使适应值大的个体在较小的范围内搜索而使适应值小的个体在较大的范围内搜索。基于这样的认识,文献【37】提出了自适应性变异的思想。
首先定义解的变异温度如下:
设 是解空间的一个向量, 是它的适应值, 是所解问题的最大适应值,则其变异温度可定义为:
(7-7)
对于很多问题 是难以确定的,我们这里只要一个粗略的上限即可,一般采用当前群体中的最大适应值作为 。
有了变异温度的概念以后,其变异方式与非一致性变异算子相同,函数表达式为:
(7-8)
文献【37】认为这样定义的变异算子将保护较好的解,使搜索在较小的范围内进行,而对适应度不好的解,搜索的领域较大。
不过该假定的正确性是存在一些疑问的。这样导致的一个直接后果就是使得基于该思想构造的算法的适应性有限。
(3)正态性变异
在实数编码的遗传算法中正态性变异算子被采用的较多。具体介绍如下:
在演化策略中,群体的一个个体是由一个解向量 和一个摄动向量 组成,这个摄动向量是变异解向量的控制向量,并且它自己也不断要进行变异,假如 是被选个体,则可按下式产生变异后的新个体 :
(7-9)
(7-10)
这里 称为二级步长控制参数, 是相互独立的均值为0,方差为 的符合正态分布的随机数。另外一种调整 的原则就是采用Rechenberg 提出的1/5成功法则。即:成功的变异概率应为1/5,如果实际成功的比例大于1/5,则增加 (7-5)
注:上式中的
函数
(7-6)
这里 (2)自适应性变异
虽然非一致变异加强了算法的局部搜索能力,但局部搜索的范围只与演化代数有关,而与解的质量无关,即无论解的质量好坏,其搜索范围都是相同的。更为合理的情形应该是使适应值大的个体在较小的范围内搜索而使适应值小的个体在较大的范围内搜索。基于这样的认识,文献【37】提出了自适应性变异的思想。
首先定义解的变异温度如下:
设 (7-7)
对于很多问题
有了变异温度的概念以后,其变异方式与非一致性变异算子相同,函数表达式为:
(7-8)
文献【37】认为 (3)正态性变异
(7-9)
(7-10)
这里 0 Rechenberg 提出的1/5成功法则。即:成功的变异概率应为1/5,如果实际成功的比例大于1/5,则增加
for(k=0;k<N;k=k+2) 注:算法要求参考群体的群体大小能被2整除。
{
采用轮盘赌的方式在 中选择两个父体;
生成0-1间的随机数r;
if 执行复制和变异操作,即先将两个父体不加变更地插入
到新群体 中,然后分别执行正态变异操作;正态变异操作
采用前面的带二级控制步长的算子;
注: 为复制概率。
else执行杂交和变异操作,即先将两个父体进行整体算术杂交,
再将两子个体插入到新群体 中,再分别执行变异操作,变
异方式同前;
}
if then
{
对 有变异后的个体和
的
}
如果当前代为第一代,可能不能得到最优个体(即搜索群体
中所有的个体均为不可行的个体)。在这种情况下,在参考群体中任
选一个可行个体作为最优个体。
将最优个体随机地替换掉搜索群体中一个个体;
}
}
从算法流程可以看出,本算法处理搜索群体
与惩罚函数法不同的是,可行解搜索法只使用目标函数作为适应性的度量,而不需要额外增加附加项,并且它总能返回可行解。它通过一些可行点作参照来进行搜索。其算法特征决定最好参考点的邻域将最有机会被“探测”。
下面为计算
{
对每个个体 do
if then
直接计算
else
{
随机选择
随机生成
给定的试探上限。
{
取
then在
按替代概率
}
else
采用罚函数法计算
}
}
算法新增加的控制参数有:参考群体 ﹑替换概率
§7.2.5 算例
算例1采用前面计算过的十杆桁架只有应力约束的最轻重量设计。采用该算例的目的在于证明本算法的有效性,另外虽然本算法的主要目的在于计算大规模的优化问题,但是由于大规模的优化问题一般都非常费机时,不太适合作为初始的测试算例。
100
20
+0.6
10
500
0.2
0.1
0.2
|
|
|
1 | 1769.333258 | 1758.151105 |
2 | 1950.279207 | 1921.299365 |
3 | 1922.325182 | 1895.743759 |
4 | 1665.495266 | 1651.889819 |
5 | 1750.583766 | 1730.877040 |
6 | 1663.430915 | 1650.183034 |
7 | 1636.119745 | 1625.753858 |
8 | 1721.621357 | 1718.238496 |
9 | 1982.158213 | 1968.391852 |
10 | 1825.880554 | 1823.848546 |
| 1788.72275 | 1774.43769 |
| 1636.119745 | 1625.753858 |
将参考群体减小为10,其他参数不变,随机运行十次得结果如下:
|
|
|
1 | 1611.539457 | 1609.797957 |
2 | 1762.332584 | 1754.502170 |
3 | 1624.950820 | 1622.669394 |
4 | 1702.037140 | 1695.211785 |
5 | 1776.785150 | 1771.267678 |
6 | 1663.548214 | 1655.143873 |
7 | 1729.877825 | 1722.938619 |
8 | 1732.291197 | 1725.324981 |
9 | 1666.098366 | 1654.351463 |
10 | 1654.919162 | 1648.088944 |
| 1692.43799 | 1685.92969 |
| 1611.539457 | 1609.797957 |
计算的效果非常惊人,确实体现出了实数编码较大的优越性。而且发现实际上并不需要设定过大的参考群体规模。
保持参考群体规模为10,最大允许测试次数(即用于修改不可行个体的适应度)减小为10,其他参数不变,随机运行十次得结果如下:
|
|
|
1 | 1811.546895 | 1809.474277 |
2 | 1744.998829 | 1737.641204 |
3 | 1817.052017 | 1802.090705 |
4 | 1616.249943 | 1617.108620 |
5 | 1672.453826 | 1668.948821 |
6 | 1944.128791 | 1931.583628 |
7 | 1742.587601 | 1747.803736 |
8 | 1911.012015 | 1900.174607 |
9 | 1883.661044 | 1869.830386 |
10 | 1684.019360 | 1679.932879 |
| 1782.77103 | 1776.45889 |
| 1616.249943 | 1617.108620 |
可以看出减小最大允许测试次数对算法的平均性能有不利的影响。
前面提到过在实数编码的遗传算法中,起主要作用的算子是变异算子。为此,将复制加变异的概率提高到0.9,其他参数保持不变,随机运行十次得结果如下
|
|
|
1 | 1640.981128 | 1635.687514 |
2 | 1606.744433 | 1602.386323 |
3 | 1755.498511 | 1750.262869 |
4 | 1620.793123 | 1617.742462 |
5 | 1597.355384 | 1596.167686 |
6 | 1836.710158 | 1834.346607 |
7 | 1639.255559 | 1635.242699 |
8 | 1616.698132 | 1614.543106 |
9 | 1829.557425 | 1821.305559 |
10 | 1597.992405 | 1596.892439 |
| 1674.15863 | 1670.45773 |
| 1597.355384 | 1596.167686 |
计算结果非常令人满意。尤其是最优解和采用规划类算法求解的结果非常接近,证实了在演化算法中变异算子的作用远大于杂交算子。
作者认为,如果问题的值域是离散的,比较好的算法仍然是采用二进制编码的遗传算法。而问题的值域如果是连续的,那么比较好的算法是采用实数编码的遗传算法。当然对于取值属于混合变量的问题(即部分变量为离散值,部分变量为连续值),可以考虑采用部分变量采用二进制编码,部分变量采用实数编码,这时我们就需要考虑对遗传算子进行适当的修改。
图7-2为随机运行一次得到的收敛历程:
图7-2
从图中可以看出迭代过程比较平稳,不同于采用二进制编码的遗传算法开始阶段目标函数值急剧改善,而后改善变得非常缓慢的情况。
2200杆最轻重量设计。200杆拓扑结构示意图见图7.3,材料参数
结构有如下5个工况:
11﹑6﹑15﹑20﹑29﹑34﹑43﹑48﹑57﹑62﹑71有 正向载荷1000 ;
25﹑14﹑19﹑28﹑33﹑42﹑47﹑56﹑61﹑70﹑75有 负向载荷
1000 ;
31﹑2﹑3﹑4﹑5﹑6﹑8﹑10﹑12﹑14﹑15﹑16﹑﹑﹑73﹑74﹑75有y
负向载荷10000 ;
(4)工况(1)和工况(3)工况的结合;
(5)工况(2)和工况(3)工况的结合;
图7.3 200杆拓扑结构
该算例共有独立的设计变量200个,约束经过化简为550个(200个应力约束﹑150﹑200个尺寸下限约束)。这里化简的意思是,对于不同的工况分别计算单元应力响应,节点位移响应,将其中最危险的结果作为单元或是节点的响应。
由于问题规模大,进行敏度分析计算代价较大。而且可能引入较大的误差。作者采用前面提到的改进的约束变尺度法进行计算,未能成功求解。后采用作者改进的序列规划法和倒变量策略,求得理论优化结果如下:
杆元编号 |
| 杆元编号 |
| 杆元编号 |
| 杆元编号 |
|
1 | 0.210111 | 51 | 0.332489 | 101 | 0.117325 | 151 | 0.156433 |
2 | 0.100000 | 52 | 4.714133 | 102 | 10.832509 | 152 | 11.396937 |
3 | 0.100000 | 53 | 0.100000 | 103 | 0.132075 | 153 | 1.130866 |
4 | 0.202961 | 54 | 0.267782 | 104 | 0.464708 | 154 | 0.313048 |
5 | 4.625652 | 55 | 7.884743 | 105 | 7.097006 | 155 | 0.307205 |
6 | 0.255035 | 56 | 0.100000 | 106 | 0.406070 | 156 | 1.112113 |
7 | 0.100000 | 57 | 0.100000 | 107 | 0.428955 | 157 | 10.670323 |
8 | 2.517969 | 58 | 0.100000 | 108 | 6.614382 | 158 | 1.887312 |
9 | 0.138652 | 59 | 0.100000 | 109 | 0.446958 | 159 | 0.156433 |
10 | 0.133123 | 60 | 0.100000 | 110 | 0.407249 | 160 | 11.004767 |
11 | 2.678647 | 61 | 0.100000 | 111 | 7.092706 | 161 | 1.364080 |
12 | 0.115250 | 62 | 0.100000 | 112 | 0.461859 | 162 | 0.375055 |
13 | 0.132279 | 63 | 0.100000 | 113 | 0.124650 | 163 | 8.309459 |
14 | 2.522145 | 64 | 9.091965 | 114 | 10.832217 | 164 | 0.384715 |
15 | 0.100000 | 65 | 0.100000 | 115 | 0.879140 | 165 | 1.315923 |
16 | 0.254432 | 66 | 0.348950 | 116 | 0.727912 | 166 | 10.970353 |
17 | 4.630455 | 67 | 5.436994 | 117 | 0.721261 | 167 | 0.156433 |
18 | 0.113690 | 68 | 0.255224 | 118 | 0.871439 | 168 | 1.872591 |
19 | 0.104213 | 69 | 0.381524 | 119 | 10.594874 | 169 | 10.691177 |
20 | 0.104550 | 70 | 5.333691 | 120 | 1.526672 | 170 | 0.156433 |
21 | 0.100000 | 71 | 0.388906 | 121 | 0.117325 | 171 | 0.156433 |
22 | 0.100000 | 72 | 0.260952 | 122 | 8.243121 | 172 | 0.156433 |
23 | 0.100121 | 73 | 5.429994 | 123 | 0.322219 | 173 | 0.156433 |
24 | 0.100121 | 74 | 0.348614 | 124 | 0.759840 | 174 | 0.156433 |
25 | 0.112353 | 75 | 0.100000 | 125 | 7.068655 | 175 | 0.156433 |
26 | 6.549132 | 76 | 9.096941 | 126 | 0.706100 | 176 | 0.156433 |
27 | 0.100000 | 77 | 0.157768 | 127 | 0.323981 | 177 | 0.156433 |
28 | 0.344073 | 78 | 0.100000 | 128 | 8.250747 | 178 | 11.342563 |
29 | 3.579805 | 79 | 0.100000 | 129 | 0.117325 | 179 | 0.168929 |
30 | 0.170422 | 80 | 0.171449 | 130 | 1.508217 | 180 | 1.984326 |
31 | 0.217004 | 81 | 9.889715 | 131 | 10.611878 | 181 | 11.846449 |
32 | 3.846152 | 82 | 0.374440 | 132 | 0.117325 | 182 | 0.420454 |
33 | 0.195036 | 83 | 0.100000 | 133 | 0.117325 | 183 | 1.411970 |
34 | 0.148202 | 84 | 6.509815 | 134 | 0.117325 | 184 | 9.309460 |
35 | 3.585978 | 85 | 0.363901 | 135 | 0.127500 | 185 | 1.361184 |
36 | 0.344639 | 86 | 0.366837 | 136 | 0.127500 | 186 | 0.428781 |
37 | 0.100000 | 87 | 6.012130 | 137 | 0.117325 | 187 | 11.814208 |
38 | 6.552405 | 88 | 0.410056 | 138 | 0.117325 | 188 | 1.965139 |
39 | 0.100000 | 89 | 0.444205 | 139 | 0.117325 | 189 | 0.183595 |
40 | 0.100000 | 90 | 6.506427 | 140 | 11.379923 | 190 | 11.363489 |
41 | 0.100000 | 91 | 0.100000 | 141 | 0.144894 | 191 | 7.857562 |
42 | 0.100000 | 92 | 0.372654 | 142 | 1.624329 | 192 | 6.776273 |
43 | 7.879161 | 93 | 9.889707 | 143 | 8.760705 | 193 | 6.786799 |
44 | 0.269327 | 94 | 0.100000 | 144 | 0.783204 | 194 | 7.862092 |
45 | 0.100000 | 95 | 0.100000 | 145 | 0.354403 | 195 | 14.188158 |
46 | 4.721721 | 96 | 0.100000 | 146 | 7.593633 | 196 | 13.985725 |
47 | 0.323962 | 97 | 0.100000 | 147 | 0.346010 | 197 | 8.520397 |
48 | 0.215902 | 98 | 0.100000 | 148 | 0.729926 | 198 | 8.553420 |
49 | 4.592184 | 99 | 0.100000 | 149 | 8.767548 | 199 | 13.952599 |
50 | 0.217054 | 100 | 0.100000 | 150 | 1.607218 | 200 | 14.195867 |
结构重量为28888.035328
参考文献【26】对于该问题求得的结果如下:
DCOC | DUAL | DOC-FSD |
28903.41 | 28890.30 | 28906.38 |
需要指出的是参考文献【26】的算法是基于桁架结构最轻重量的一些特殊性来得出的,因而不具有普遍性。注:上表中FSD意为满应力法。
由于问题的规模较大,显然搜索群体的规模和搜索代数均需相应增大。
200
20
+0.9
10
2000
2.0
3.0
0.2
0.130.0
|
|
|
1 | 36763.111904 | 36783.179274 |
2 | 36297.883100 | 36307.744050 |
28.0,最大遗传代数增大到3000代,随机运行四次结果如下:
|
|
|
1 | 32164.046678 | 32164.046678 |
2 | 32205.974839 | 32181.220107 |
3 | 33835.051844 | 33823.328592 |
4 | 32407.606855 | 32400.431731 |
7.4§7.3 结论
本章提出了一种基于实数编码的适用于求解大规模问题的遗传算法,算法采用正态变异算子,对于约束的处理采用带最大试探次数的可行解搜索法,对于超过上限试探次数的个体采用罚函数法构造其适应度,对搜索群体和参考群体分别采取了不同的措施以保证算法的稳态。算例说明了本算法对于求解大规模优化问题是适合的,是一种具有工程实用价值的算法,值得进一步的研究。
作者认为进一步研究的方向有如下几个:(1)将算法进行分布式;(2)提出新的有效的变异算子;(3)提出更有效的处理非线性约束的方法;(4)考虑求解具有等式约束的问题。
下面给出作者改进的序列线性规划法(SLP)的示意流程:
1
2
满足约束条件
3
4
2
4
2
图7.4
§7.4 附录