在很久很久以前,小编只在传说中听说过遗传算法,but,这究竟是个啥玩意儿,一无所知,只在内心里感觉这应该是个很牛逼的存在,到底是怎么回事儿,到底有啥用,摸不着头脑哇。。。
直到有一天,小编看ABAQUS相关的文献的时候,发现一篇文章《基于Abaqus和遗传算法的预应力混凝土风机塔架优化设计》,知道了这个算法是求最优化问题的工具,就是通过遗传算法,可以得到某个问题在多个变量影响下的最优解。但面对那么一堆复杂的公式,已然丧失了深究遗传算法的勇气。
再又到一天,小编看《Grasshopper参数化建模技术》这本书,发现grasshopper自带的galapagos,oh,这不又是遗传算法吗?
照着例题,小编试着在grasshopper中做了个简单的遗传算法的优化:
酷炫啊,遗传算法驱动了输入变量的变化,在变化中寻找最优解,eh~~~eh~~~
既然如此,我是不是可以和有限元软件结合起来,做最优化问题的求解呢?
还是来看看这个简单的例子:
整个遗传算法最优化问题可以分成了三个部分:
(1)输入变量
(2)运算函数
(3)遗传算法驱动
再来畅想一下,把变量定义成结构的几何参数,把运算函数替换成grasshopper和sap2000的接口,再来连接这个遗传算法驱动,是不是能做建筑结构的最优化问题求解了?
于是,小编写了这个遗传算法和sap2000结合的电池组。简单地求解一个单榀单跨框架在侧向力作用下的最小位移。
连接完成这组电池,打开遗传算法模块做好相关设置后,就让他们跑起来吧。
虽然小编成功地利用grasshopper中的galapagos结合了sap2000,可以做相关的最优化分析,但是似乎局限性还是存在的:
(1)galapagos是单目标优化的遗传算法求解器,就是它只能设置一个目标,对于多目标优化问题,譬如我们结构设计当中,不仅要满足层间位移角最小的要求,还要满足质量最小的要求,这个模块显得有点无能为力。
(2)无法对目标的约束条件进行设定。譬如在运算得到的层间位移角超过规范时,需要舍弃相应的基因组,而galapagos在这里也无法实现我们的要求。
(3)使用galapagos需要借助于grasshopper的平台,无法解决不能通过grasshopper表达的最优化问题。
小编还是想做多目标优化算法来优化结构设计问题的。想想要是调模型的时候让GA自己跑起来,我们该喝茶喝茶,该打游戏打游戏,该睡觉睡觉,想想不要太爽。
but,遗传算法到底是什么鬼,对于一直学cad学pkpm的学yjk的小编,算法这玩意儿八竿子打不着啊~~~那么,难道小编就这样放弃了吗?!!放弃吗?!放弃吗?!
挣扎,挣扎着要么还是去研究一下吧。
什么是遗传算法?
遗传算法,看这名字就知道,它的灵感来自于达尔文的“优胜劣汰,适者生存”的进化论。生物学的最基本常识,生物的遗传是通过基因(gene)来实现的,而这许多的基因共同组成了染色体(chromosome),我们假设多个染色体的集合共同构成了一个种群(population)。这些,就构成了遗传算法的最基本元素。
那么,它的具体的计算过程是怎么样的呢?
我们通过一个简单的例子,来阐述一下简单遗传算法(SGA)的计算过程。
第一步:生成初始种群
这里,我们需要确定的几个变量:
(1)编码规则
传统的优化方法是以变量本身的值作为优化对象的,如变量x1=5,x2=4,直接将变量的值输入需要被优化的函数,而对遗传算法是以决策变量的编码作为运算对象的。借鉴生物学的概念,这些变量都需要被转换为基因。
编码规则一般有二进制编码法,格雷码编码法,浮点数编码法。这里我们用二进制编码法来对刚才的变量进行编码,x1=101,x2=100,x1及x2分别是染色体中的两个基因,因此将其合并组成一个染色体,即x1和x2共同的染色体为101100。
(2)种群数量
在遗传算法中,定义多个种群数量是接下来染色体进行交叉操作的基础,定义越多的染色体,计算量越大,但是染色体的离散度也越大,得到的结果符合要求。
这里,我们假设初始化了一个有四个染色体的种群。
第二步:个体评价
这是对染色体的遗传概率进行计算的操作。
这里需要结合被优化函数f(x),假设f(x)=x1^2+x2^2,计算各个染色体对应的函数值。
完成以上适应度评价后,根据各染色体的累积和的值,进行选择操作。
第三步:选择染色体
在生物进化过程中,对环境适应程度高的物种更容易进化到下一代,而这里的选择染色体的步骤,就是通过适应度来选择进入下一代的染色体。适应度的计算,已经通过之前个体评价完成。简单来说,1号染色体的适应度是34,所有染色体适应度的和是143,那么34/143=0.24就是这个染色体能够传递到下一代的概率。
在这里,我们用轮盘赌选择机制来选择算子,即随机生成一个0-1之间的数,如果这个数在某个染色体的概率区间,那么,我们就选择这个染色体进入下一代。譬如随机生成了0.46,那么在这个例子中0.24<0.46<0.48,那么就选择第二条染色体进入下一代遗传。
第四步:交叉染色体
在生物进化过程中,两个同源染色体通过交配而重组,形成新的染色体。在遗传算法中,也引入了相关的机制。交叉染色体,是指对两个相互配对的染色体按某种方式进行基因互换,从而形成两个新的个体。
在交叉过程中,首先要做的就是配对,即将染色体两两分组。一般的配对策略是随机的,即任意选择两条染色体进行配对。
接下来就是要进行交叉操作。交叉可分为单点交叉,双点交叉多点交叉等。对于大多数的交叉方法,交叉点位置的选取都是随机的。
通过选择运算,追根溯源,红色部分为选择后的1号染色体的成分,绿色部分为选择后的2号染色体成分,蓝色部分为选择后的3号染色体成分,橙色部分为选择后的4号染色体成分。其交叉点均为随机的。
第五步:变异
在生物进化过程中,由于一些偶然因素的作用,会产生某些基因的变化,从而出现新的染色体。遗传算法中的变异运算,是指将个体染色体编码串中的某些基因按照其等效基因进行替换。简而言之,在二进制编码中,将基因中的某些0成分替换成1或者将某些1成分替换成0。这个操作主要是要维持基因的多样性,同时改善遗传算法的局部搜索能力。
在以上例子中红色部分即为基因产生的变异点。变异完成后,即完成遗传算法一代的运算操作。再将变异后的染色体进行解码,得到十进制下的变量值,提交到适应度计算步骤进行运算,循环往复,即可形成多代遗传算法的进化,实现最优化问题的求解。
综合前述求解过程,得到以下遗传算法流程图。其中需要特别强调的是,随机是遗传算法中一个特别重要的概念,它是通过一定的机制,将一组随机过程引导至最优化结果的过程。其中,初始种群的生成,选择算子,交叉算子,变异算子的操作,都需要随机过程。对于不习惯用随机运算的土木狗来说,理解起来确实有一定的困难。
学习完这些,小编还只处在纸上谈兵的阶段。能不能自己码一个遗传算法呢?!纠结,彷徨,迷茫~~~小编又陷入了挣扎,挣扎,挣扎。。。但是,想到了上班的时候可以喝茶,打游戏,睡觉的日子,小编的求知欲又被激发了出来。
当然码代码和理论比起来差距还是有点大的。细节的处理还是很复杂的。
小编随机构造了一个函数进行求解:
定义了x1,x2,x3,x4四个变量,求解函数最大值的问题。
从以上案例可以得到,虽然优化过程存在较大的震荡,当时在运算到20-30代以后,优化结果趋于稳定,得到相应的优化结果。
那么,接下来是不是就可以和有限元软件结合起来了呢?!
小编建立了一个三榀三跨三层的框架,以侧向力作用下每层的梁柱截面尺寸作为优化条件,设置首层层间位移最小为优化目标,进行遗传算法的优化运算。
look,look,遗传算法已经愉快的跑起来了。。。小编可以去喝茶睡觉打游戏了。。。。
喝完一顿茶,查看一下计算结果,模型在第30-40代左右趋于稳定,最小位移在0.33左右,40代之后的计算结果虽然也有些跳跃,但是还是比较稳定的。计算结果表明,遗传算法和sap2000的有限元计算结合之后,能够达到预期的最优化目标。
这只是最简单的遗传算法的案例,对于小编最开始讲的多目标优化问题,分类问题等等,还有其他的遗传算法模式可以进行求解,小编后续将对AGGA,NSGA-II等优化算法进行介绍,敬请期待。
后记:
之前小编在读一篇网文的时候对有句话的印象特别深刻:“跳过因果,直接从数据的关系中找到答案。“在众多的非线性问题中,传统的数学优化对于无法用纯数学方式表达的问题,显得有点捉襟见肘,而通过遗传算法,模拟退火算法等进化算法进行优化问题的分析,虽然不能得到精确解,但是他能给你提供一个接近最优解的形式。在一众甲方带着优化公司天天扣钢筋的当下,基于参数化的概念,利用算法做结构优化分析,对结构设计的意义显得不言而喻。
“转自:非解构-公众号”上海结构设计圈仅限在上海从事结构设计的朋友们。