智能算法-遗传算法(2)

259 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

1. 遗传算法

遗传算法基本解释及概念术语请参考上篇文章智能算法-遗传算法(1)

简单回顾一下遗传算法大体思想:遗传算法首先需要把初始解集以某种手段编译成遗传基因序列(染色体),如下图所示就是一个编译完成的染色体,这个染色体代表(对应)着一个初始解。当然,为了涵盖所有种群基因,需要先编译产生很多很多类似的染色体。 然后,很多很多这样的染色体就组成一个初始种群。接下来就开始繁衍,计算出该种群内的每个染色体的优劣程度(适应度)进行比较,淘汰一部分比较差的个体。

对于剩下的个体进行基因重组,两两染色体进行基因序列交换(交叉),组成新的子代染色体序列。对于新的子代染色体序列,有一定几率出现变异(染色体基因序列某几个基因发生改变)。

接下来,这些子代作为父代,再重复以上所有操作,实现了优胜劣汰,经过多代的繁衍,最终省下来的染色体就是找到的最优解。

2. 简单实例详解

2.1 问题阐述

总共有 1010 种物品,1010 种物品有各自的重量和价值。现有一个背包,最大载重量为 MM,想要把挑选一些物品装进背包,使得不超过最大载重量的同时,所携带的物品价值总和最大。

2.2 步骤一:编码操作

考虑使用长度为1010的染色体进行编码,编码方式为二进制编码,即染色体的每一个位置使用0011进行表示。解释:因为有1010个物品,染色体长度选为1010,如果选择将物品nn装入背包,则染色体的第nn个位置用11表示。如果不装入背包,则对应位置用00表示。
例如,01001000000100100000 代表的含义为将第22个物品和第55个物品装入背包,其余物品不装入。

2.2 步骤二:产生初始种群

随机产生10个初始种群(为了方便起见此处选10个初始种群,也可以选其他数量),产生的初始种群如下所示。

从另一个角度来讲,这10个初始种群就相当于是10个初始选择方案。

image.png

2.3 步骤三:计算适应度

对于本题,适应度可以用每个染色体物品总价值表示,即每个方案的总价值。假设经过计算后,每个染色体的适应度如下表所示。

个体染色体适应度
110001100000000110000088
220101111001010111100155
330000000101000000010122
44100111010010011101001010
551010101010101010101077
66111001011011100101101212
771001011011100101101155
88110000000111000000011919
99100111010010011101001010
1010000101001100010100111414

为简单起见,此处假设以上染色体均符合最大重量要求。(正常情况下,需要在此处加一步判断,若某个染色体表示的物品重量总和超过背包最大重量,需要将该染色体舍弃掉)

2.4 选择

计算出每个[个体的适应度]占[总体适应度总和]的比值。

image.png

例如对于个体1,选择概率为:8/8521071251910148/8+5+2+10+7+12+5+19+10+14,其他个体计算方式以此类推。

此处,我们将这些个体按比例概率大小画成一个飞镖盘,随机投出8只飞镖,看看最后落在哪里,被飞镖击中的区域所代表的个体保留下来,其余的淘汰掉(这就是轮盘赌选择法的大体思想,概率大的个体,保留下来的概率也大)。

假设本轮经过轮盘赌选择法,将个体2和个体3淘汰掉了。

2.4 步骤四:交叉

此处我们选择单点交叉:首先将刚才选择保留下来的染色体,两两排成一对儿(如果存在“没有被排成对”的染色体,可以将其舍弃),然后,随机选择一个点位,将染色体一刀切断,两两互相交换。如下图所示。

image.png

2.5 步骤五:变异

将交叉完的个体,每一个点位以一定概率进行变异,如下图所示,该点位的基因由1变成0。

image.png 经过以上步骤,就走完了完整的一代繁衍,繁衍出了第2代个体。接下来再重复以上所有操作繁衍第3代,第4代直到算法结束,这就是遗传算法的基本步骤流程。