遗传算法通识

遗传算法(Genetic Algorithms ,GA)来源于自然界自然选择和遗传进化的思想,主要用于解决最优化问题(optimization problems)。遗传算法最早在20世纪70年代由John Holland提出。但实际上,我更认为其发明者是达尔文。遗传算法本质上是达尔文“优胜劣汰,适者生存”的进化论思想在计算机中的映射。

一、基本概念

与进化论相似,遗传算法有几个核心概念。知道进化论或学过生物的很容易理解。
个体(Individual):一个猴子,一个猩猩,一个人。
种群(Population):一群猴子,一群猩猩,一群人。
基因(Gene):个体携带的基因。
染色体(Chromosome):由基因拼接组成;作为个体的蓝本,在算法中一般代表个体自身。
这里写图片描述
遗传算法基于如下进化理论的类比:
(1)个体在种群中因为资源或配偶进行竞争;
(2)优秀的个体在竞争中更有优势;
(3)优秀个体相互结合能够产生更优秀的后代。

二、怎样判断优秀个体?

那么,怎么知道哪个是优秀的个体,哪个是不优秀的个体呢?在遗传算法中用“适应度值(fitness)”来度量,至于适应度值高是优秀还是低是优秀,看具体的问题了。
在算法实施过程中需要一个“适应度值计算函数”,来计算种群中每个个体的适应度值(fitness)。

三、怎样实施进化过程?

这里写图片描述
遗传算法的过程不复杂。
1)根据问题需要,随机生成个体,个体的数量可自行控制。
2)将个体组成一个种群。这前2个过程一般合并在一起。
3)计算个体适应度值。
4)根据适应度值选择优秀的个体。
5)将优秀的个体进行结合,产生一个或多个后代。
6)某个个体产生基因变异,变成了一个新个体。
7)将所有新个体加入到种群中,根据适应度值淘汰较差个体,使种群中个体数量保持不变。
8)满足退出条件就退出,不满足就转向步骤3)。

四、三个核心步骤
(1)选择(selection)

关键思想:优秀的个体有更多的机会把基因传给下一代。
选择的基准就是个体的适应度。而选择的策略根据问题和程序员自身意图,可以采用多种策略。一般使用较广、且易于实现的是轮盘赌策略(roulette wheel selection)。
假设种群中有6个个体,适应度值分别是[2,3,10,5,12,19],其轮盘是如下形式:
这里写图片描述
我们转动轮盘,显然适应度越大的有更大的概率被选中。其简单的解释性代码可以表示如下:

# -*- coding: utf-8 -*-
import numpy as np
s = [2, 3, 10, 5, 12, 19] # 种群和个体
s_sum = sum(s) # 所有适应度的和
m = 0
r = np.random.random() # 0-1之间的随机数
c = 0
for i in range(len(s)):
    m += s[i] / s_sum
    if r <= m:
        c = i
        break
print(c) # 最后选中个体的序号

可以看出,用轮盘赌也有一定的限制。如果适应度值有正有负,就不好处理。所以轮盘赌只是选择策略的一种。最简单的是随机选择策略,在种群中随机选择个体进行进化。

(2)结合(或称交叉,crossover)

交叉过程根据问题和程序员的意图可自行设计。下面给出单点交叉法的过程示意图。
这里写图片描述
两个个体parent1和parent2,各分成2部分基因片段。分别将parent1的前部分基因片段和parent2的后部分基因片段,parent1的后部分基因片段和parent2的前部分基因片段相结合,生成了2个后代child1和child2。每个后代都拥有parent1和parent2的一部分基因。
在每一代进化中,交叉过程不是一定发生的,一般基于设定的概率发生。而这个概率设定的较高,一般在0.6以上。如果交叉不发生,parent1和parent2直接复制进入新种群。如果交叉发生,则对child1,child2,parent1,parent2进行适应度比较后,保留较好的进入新种群,也可以都进入新种群,具体怎么做没有标准,可以根据具体问题自行选择。

(3)变异(mutation)

为了确保种群的多样性,允许种群中有个体的基因变异。在实际问题中是跳出局部最优解。下图表示种群中某个个体的一段基因编码发生变异,生成了一个新个体。在每一代进化中,变异概率设置的较低,一般在0.1以下。注意:交叉概率和变异概率一个较大,一个较小,但不是交叉概率和变异概率之和一定等于1,没有这种说法,这两个概率没有相关性。
这里写图片描述
变异可以基于交叉后产生的个体,也可以基于种群中的所有个体,这个可以根据具体问题自行决策。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值