最近学习了遗传算法,尝试着把它按照理解写下来。对于遗传算法从名字上就可以看出来是和生物有关的东西,可以认为是和生物进化有关系,在生物进化里面又有一句话叫:物竞天择,适者生存。也就是说受环境的影响,最终会留下那些能适应环境的生物。如果从生物学里面进行考虑可能会涉及到 一堆的概念名词,如:染色体,个体,种群,基因突变等。如果遗传算法是根据生物进化进行设计其必定包含这些概念和过程。下面从概念和过程这两个方面对遗传算法进行一个简单的说明。
1.遗传算法中的概念
- 染色体
- 个体
- 种群
- 适应度函数
- 选择操作
- 交叉操作
- 变异操作
染色体其实就是问题的一个解,如何理解呢,首先你有一个问题,比如求一个函数式里面的x的使得函数式里面的值最大,那么这个解就是这个x的具体某一个值。
函数式:f(x)=x+10sin(x) ,x取值范围为(1,10)
这里可以把x的解作为一条染色体。那么染色体的取值范围就是x的取值范围。既然是一个解那么对于计算机来说染色体用什么来表示呢?这里就涉及到编码的问题。编码的方式有二进制编码和实数编码。
假设x=5,如果染色体采用二进制编码,定义染色体的长度为5的话那么它应该是下面的形式
二进制编码:[00101]
那么问题来了,如果问题是求一堆货物存放的位置,使得它满足某个函数式。如空间坐标,那么应该怎么定义。
首先需要知道的是要求的解是什么。这里的解其实就是货物的坐标,那么是不是就是(x,y)呢?是(x,y)。但更确切的说是每个货物的(x,y)。也就是说你有多少个货物就应该有多少个(x,y)。加入有五个货物,那么染色体应该是至少有十个基因,每个基因代表一个(x,y)。但这往往不好求,实际当中染色体可以是十个基因,也就是x和y分别用一个基因表示。如下图:
z=(x,y)
[z1,z2,z3,z4,z5] | [x1,y1,x2,y2,x3,y3,x4,y4,x5,y5] |
也就是说每两个基因就是一个解。最终得到就是上面的染色体。
若采用实数编码则:
坐标:(1,2)-(4,5)-(1,3)-(6,2)-(5,7)
实数编码 [1,2,4,5,1,3,6,2,5,7]
个体这里可以理解成是一条染色体
种群是由很多个个体组成,可以自己定义种群的大小。
适应度函数是用来评价个体的好坏,它指导着整个群体的进化方向。上面的函数式就可以作为适应度函数。适应度函数很多情况下可以用目标函数代替,也就是求解的函数。
此时可能你应该知道适应度函数式需要根据实际情况来定。当你有一个问题需要解决,你首先会建立数学模型,也就是变成函数,如果想用遗传算法来解这个函数,那么此时需要对这个函数式分析,将其转成适应度函数,或者是根据这个目标函数写出相应的适应度函数。
选择操作:从种群中挑选出比较好的两个个体,形成一对,然后将基因传给下一代,也就是成为新的染色体。
交叉操作:交换基因
变异操作:根据变异概率对染色体进行变异
过程
过程也就是计算过程:
上图的操作过程只是比较简单的操作过程,在实际当中还会还有很多别的方法来实现。