遗传算法
概述
遗传算法的基本思想是从初始种群出发,采用优胜劣汰、适者生存的自然法则选择个体,并通过杂交、变异来产生新一代种群,如此逐代进化,直到满足目标为止。
遗传算法起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。
概念
遗传算法所涉及到的基本概念主要有以下几个:
• 种群(Population):
种群是指用遗传算法求解问题时,初始给定的多个解的集合。遗传算法的求解过程是从这个子集开始的。
•个体(Individual):
个体是指种群中的单个元素,它通常由一个用于描述其基本遗传结构的数据结构来表示。例如,可以用0、1组成的长度为l的串来表示个体。
• 染色体(Chromosome):
染色体是指对个体进行编码后所得到的编码串。染色体中的每1位称为基因,染色体上由若干个基因构成的一个有效信息段称为基因组。
• 适应度(Fitness)函数:
适应度函数是一种用来对种群中各个个体的环境适应性进行度量的函数。其函数值是遗传算法实现优胜劣汰的主要依据
• 遗传操作(Genetic Operator):
遗传操作是指作用于种群而产生新的种群的操作。标准的遗传操作包括以下3种基本形式:
– 选择(Selection)
– 杂交(Crosssover)
– 变异(Mutation)
基础遗传算法
遗传算法一般步骤
开始循环直至找到满意的解。
1.评估每条染色体所对应个体的适应度。
2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方。
3.抽取父母双方的染色体,进行交叉,产生子代。
4.对子代的染色体进行变异。
5.重复2,3,4步骤,直到新种群的产生。
结束循环。
遗传算法具体步骤
1.编码:
遗传算法中的编码可以采用实数编码,以及二进制编码,在这里我们主要介绍二进制编码。假设优化问题的解为,其中每个决策变量对应的的编码长度为,则一个个体的总的编码长度记做,即每个个体被编码为一个长度为的二进制串。由于我们上文中说明了种群数量为,因此,我们在初始化种群时,将对个个体进行随机编码,即生成个长度为的二进制串作为我们的初始种群,其中每一个二进制串为一个个体。
2.解码:
解码的目的是为了得到每个个体对应的解的实际值。具体过程如下。首先我们需要取出一个个体中每个决策变量对应的二进制编码段,某个个体的决策变量对应的编码段为个体的位置到位置,即(假设个体的下标从0开始,并且设),其中包含开始位置对应的二进制位,不包含结束位置对应的二进制位。之后将编码段转换为对应的十进制值。设的取值范围为,则解码后的实际值为。最后我们根据一个个体可以得到一个对应的优化问题的解,最后对整个种群解码后,得到个解。
3.求解适应度:
通过第二步解码后,我们便得到了个解,依次将这些解带入到目标函数,求取出目标函数值便得到了这些解所对应的适应度值,我们记为。
4.复制:
首先,我们可以将适应度最优的个体找出来,作为复制得到的种群中的第一个个体,作为当前种群最优个体,这个操作也称之为精英保留策略。之后我们再从种群中通过某种选择方案选出个个体,和一开始选出的最优个体组成复制后形成的种群。接下来介绍选择方案,即如何选出个个体。首先通过公式计算出,之后再通过公式计算得出。之后我们通过产生一个0到1之间的随机数,判断位于的哪个位置,例如,如果,则将原先种群中第个个体选出,如此循环次便得到了选出的个个体。
5.交叉:
将种群中的的第一个个体,也就是之前选出的最优个体排除在外不参加交叉操作,其他个个体进行交叉操作。首先有序生成个0到1之间的随机数,记录其中小于交叉概率的随机数的位置,将这些位置对应的个体选出来作为进行交叉操作的个体(在程序编写中,我一般限制选出个体的数量大于零且为偶数,如不符合条件则重新生成随机数进行选择)。之后,从选出的个体中每次按顺序遍历出两个个体进行交叉操作。接下来介绍两个个体之间如何进行交叉操作,设个体起始位下标为0,则个体的最后一位对应的下标为。首先产生一个1(包含)到(不包含)之间的随机数,作为这两个个进行体交叉位置,之后将这两个个体在这个位置之后的片段进行交换便完成了交叉操作。依次对之前选出的个体进行此操作,直到被选出的个体全部完成,则种群的交叉操作完成。由于进行了变异操作,种群中最优个体有可能已经发生了变化,因此当完成遍历操作时我们也可以再次进行解码,求适应度,将种群中最优的个体放置在种群的第一个作为新的。
6.变异:
首先同交叉操作相同,种群中的第一个个体不进行变异操作,之后的个个体进行变异操作。变异操作的具体方法如下,首先将参加变异操作的个个体连成一条串,其长度为,之后一次产生个0到1之间的随机数,记录小于变异概率的随机数的位置,所有小于变异概率的随机数的位置便是这条串上发生变异的位置,通过这个位置可以找到发生变异的个体的,以及在这个个体上的哪个位置发生的变异。例如,某个小于变异概率的随机数在这条串上的位置为,则可以求得发生变异的个体索引为,“//”表示整除(向下取整),在这个个体上发生变异的位置为,“mod"表示取余。最终确定了变异位置之后,只需观察这个位置上的二进制值是0还是1,如果是0则变异为1,如果是1则变异为0。如此循环直到把所有的发生变异的位置均进行变异操作。最终便产生了新的种群。
最后依次循环执行2至6步来进行种群迭代。
代码实现(python)
GA.h