遗传算法( Gnetic algorithms )是基于自然选择和基因遗传基础上的一种优化算法。
遗传算法 (Genetic Algorithms) 是模拟生物学中"物竞天择、适者生存"的自然选择和基因遗传机制提出的并行随机优化算法。
目前GA在函数优化、自动控制、图象识别、机器学习、机身设计、人工神经网络、分子生物学、优化调度等方面都取得了很大的成功。
从1985年开始,国际上召开了遗传算法的专门会议,并成立了国际遗传算法协会,对遗传算法的基本理论、方法及技巧进行研究,至今已发表论文千余篇。GA已成为国际上跨学科的热门话题。在美国等一些西方国家的电机与计算机科学系中,为本科生和研究生开设了遗传算法的理论及其应用方面的选修课,遗传算法已成为人工智能研究的一个重要领域,同时也成为了解决困难的组合优化问题和复杂的函数优化问题的有效工具,并引起了各学科研究人员的普遍重视,他们希望采用这种新的技术来解决各自学科中长期未能很好解决的困难的组合优化和复杂函数优化问题。
目前GA在函数优化、自动控制、图象识别、机器学习、机身设计、人工神经网络、分子生物学、优化调度等方面都取得了很大的成功。
二、遗传算法原理的简单介绍
在遗传算法中,优化问题的所有参数(Parameter)或者称之为决策变量都被编码(Coding),形成一个有限长的字符串,称之为染色体(Chromosome)或个体(Individual)。每个个体都对应于优化问题的一个可行解(Feasible Solution)。一组个体组成一代(Generation)种群(Population),它描述了遗传算法的搜索空间。优化问题的目标函数作为种群所处的环境,目标函数值经过一定的修正后作为个体对环境的适应度(Fitness)。搜索时先随机产生一定数量的经编码后的祖先个体构成最原始的种群。再从这些种群开始,模拟进化过程,运用优胜劣汰原则,先将个体解码(Decoding),把被编码的参数还原成实际参数,然后利用目标函数计算其适合度,再通过选择(Selection)将适合度高的个体下来,组成新的种群,最后再利用交换(Crossover)、变异(Mutation)等手段使这些新的种群的优良特性得以遗传和保留到下一代。如此"选择-交换-变异-再选择"地不断重复,使各代种群的优良基因成分逐渐积累,种群的平均适合度和最优个体适合度不断上升,直到迭代过程趋于收敛。
三、遗传算法的优缺点
与其他优化算法相比,遗传算法具有如下优点:
(1). 将搜索过程作用在编码后的字符串上,不直接作用在优化问题的具体变量上,在搜索中用到的是随机的变换规则,而不是确定的规则。它在搜索时采用启发式的搜索,而不是盲目的穷举,因而具有更高所搜索效率。
(2). 现行的大多数优化算法都是基于线性、凸性、可微性等要求,而遗传算法只需要适合度信息,不需要导数等其他辅助信息,对问题的依赖性较小,因而具有高度的非线性,适用范围更广。此外还可以写出一个通用算法,以求解许多不同的优化问题。
(3). 遗传算法从一组初始点开始搜索,而不是从某一个单一的初始点开始搜索。而且给出的是一组优化解,而不是一个优化解,这样可以给设计者更大的选择余地。它能在解空间内充分搜索,具有全局优化能力。
(4). 遗传算法具有很强的易修改性。即使对原问题进行很小的改动(比如目标函数的改进),现行的大多数算法就有可能完全不能使用,而遗传算法则只需作很小的修改就完全可以适应新的问题。
(5). 遗传算法具有很强的可并行性,可通过并行计算来提高计算速度,因而更适用于大规模复杂问题的优化。
正是基于以上优点,遗传算法对优化工作者来说充满了吸引力。
但是由于遗传算法是一种较新的算法,在实际中的运用中也还有许多地方有待进一步地深入和改进,主要集中在以下几个方面:
(1). 遗传算法的理论研究比较滞后。由于遗传算法本身也是一种仿生的思想,尽管实践效果很好,但理论证明比较困难。而且这种算法提出来的时间还不是很长,因此其理论和实践的研究几乎是平行进行的。
(2). GA算法本身的参数还缺乏定量的标准,目前采用的都是经验数值,而且不同的编码、不同的遗传技术都会影响到遗传参数的选取,因而会影响到算法的通用性。
(3). GA对处理约束化问题还缺乏有效的手段,传统的罚函数法中对惩罚因子的选取还是一个比较困难的技术问题。
生物遗传物质的主要载体是染色体,在遗传算法中,染色体通常是一串数据(或数组),用来作为优化问题的解的代码,其本身不一定是解。遗传算法一般经过这样几个过程:首先,随机产生一定数量的随机染色体,这些随机产生的染色体组成一个种群。种群中染色体的数目称为种群大小或种群规模。然后用评价函数评价每一个染色体的优劣,即染色体对环境的适应程度(称为适应度),用来作为以后遗传的依据。接着进行选择过程,选择的目的是为了从当前种群中选出优良的染色体,使他们称为新一代的染色体,判断染色体优良与否的标准就是各自的适应度,即染色体的适应度越高,其被选择的机会就越多。通过选择过程,产生一个新的种群。对这个新的种群进行交叉操作,交叉操作是遗传算法中主要的遗传操作之一。接着进行变异操作,变异的操作是挖掘种群中个体的多样性,克服有可能陷入局部解的弊病。这样,经过上述运算产生的染色体称为后代。然后,对新的种群(即后代)重复进行选择、交叉和变异操作,经过给定次数的迭代处理后,把最好的染色体最为优化问题的最优解。
最优化问题的解有两种表示方法:二进制向量和浮点向量。使用二进制向量作为一个染色体来表示决策变量的真实值,向量的长度依赖于要求的精度,使用二进制代码的必要性已经受到一些批评。在求解复杂优化问题时,二进制向量表示结构有时不大方便。
另一种表示方法是浮点向量,每一个染色体由一个浮点向量表示,其长度与解向量相同。这里用 x = ( x 1 , x 2 ,…, x n )表示最优化问题的解,其中 n 是维数,则相应的染色体也是 V = ( x 1 , x 2 ,…, x n )。
处理约束条件的关键在于 (a) 删除约束条件中所有的等式, (b) 设计恰当的遗传操作以保证所有新产生的染色体在可行集中。
评价函数(用 eval(V) 来表示)用来对种群中的每个染色 V 设定一个概率,以使该染色体被选择的可能性与种群中其它染色体的适应性成比例,即通过轮盘赌,适应性强的染色体被选择产生后代的机会要大。
第一种方法,设目前该代中的染色体 V 1 , V 2 ,…, V n ,可以根据染色体的序进行再生分配,而不是根据实际的目标值。无论何种数学规划(单目标、多目标或目标规划)都可以作一合理假设,即在染色体 V 1 , V 2 ,…, V n 中,决策者可以给出一个序的关系,使染色体由好到坏进行重排,就是说,一个染色体体越好,其序号越小。设参数,定义基于序的评价函数为:
, i = 1 , 2 ,…, n
i = 1 意味着染色体最好, i = n 说明染色体是最差的。
第二种方法对适应度进行适当的缩放调整(称为适应度定标)来设计评价函数。用 f 1 , f 2 ,…, f n (即染色体 V 1 , V 2 ,…, V n 各自的目标值)来表示原来的适应度。 Goldberg 〖 1 〗 提出一种线性适应度定标方案:
, i = 1 , 2 ,…, n
其中为新的适应度, a 和 b 为参数。这种方法假定使用者了解目标函数的性质,这样才能设计合理的参数 a 和 b 。这种情况下,评价函数定义为:
, i = 1 , 2 ,…, n
选择过程是以旋转轮盘赌 n 次为基础的。每次旋转都为新的种群选择一个染色体。赌轮是按照每个染色体的适应度进行选择染色体的。无论使用哪一种评价函数,选择函数总可以写成如下形式:
步骤 1 对每个染色体 V i ,计算累计概率 q i
步骤 2 从区间 [0 , q n ] 中产生一个随机数 r;
步骤 3 若,则选择第 i 个染色体 V i ,( 1 i n );
步骤 4 重复步骤 2 和步骤 3 共 n 次,这样可以得到 n 个复制的染色体。
在实际应用中可以将 q i , i = 1 , 2 ,…, n 除以 q n ,使 q n =1 ,新的概率同样与适应度成正比。
首先定义 P c 作为交叉操作的概率,这个概率说明种群中有期望值为 P c · n 个染色体进行交叉操作。为确定交叉操作的父代,从 i = 1 到 n 重复以下操作:从 [0 , 1] 中产生随机数 r ,如果 r < P c ,则选择 V i 作为一个父代。
用,…,表示上面选择的父代,并把他们随机分成下面的对
,,,…,
然后对每对进行交叉操作,以为例,首先产生 (0 , 1) 之间的一个随机数 c ,然后按下列形式在之间进行交叉操作,并产生两个后代 X 和 Y
,
如果可行集是凸的,这种凸组合交叉运算保证两个后代也是可行的;如果可行集不是凸集或很难验证,这时需要对 X , Y 进行检验,如果不符合约束条件,则需重新产生 c 值,重复以上交叉操作。
定义 P m 作为交叉操作的概率,这个概率说明种群中有期望值为 P m · n 个染色体进行交叉操作。
类似交叉操作,首先选择需要变异的父代,然后对每个需变异的父代(用 V 表示),用下列方法进行变异。在 R n 中随机选择变异方向 d ,取 M 为足够大的一个数,如果 V+M · d 是不可行的,则设 M 为 0 到 M 之间的随机数,直到其可行为止。