一、遗传算法简介
从做菜说起,小魏是一名大厨,想要创造一道美味的菜肴。首先随机生成多个原始配方,每种配方所用的原料(鸭脖、鸡肉、大肠等)与手法(煎炒焖炸卤炖)组合不同,现实中考虑调料用量、烹饪时间等等变量,会有无穷多种解,传统算法难以求解。
请评委对几种配方做出的菜打分,分数高的配方进行配方交叉,保留一部分评分高的配方要素、舍弃评分低的配方。例如配方A和配方C的分数都高,A是卤鸭脖,C是炖大肠,配方交叉尝试新一组方案:“炖鸭脖”和“卤大肠”。
有时会在配方交叉之后,再变更食材或烹饪方式。就像是在配方中随机使用了一些与原配方无关的调料或者做法(鸭脖改成鼠头),变异可能带来惊喜(评分高),也可能有惊无喜(试试就逝世),所以只小概率进行。
再对新配方的菜评分,继续交叉、小概率变异.....不断循环直至无改进空间为止。
将其类比于生物学和遗传算法
烹饪配方 | 生物学 | 遗传算法 |
多种配方 | 群体 | 可行解集合 |
单个配方 | 个体 | 可行解 |
配方内容(原料、方式等) | 基因 | 可行解的分量 |
评分 | 适应度 | 适应度函数值 |
配方交叉 | 交叉 | 交叉操作 |
随机新操作 | 变异 | 变异操作 |
做出美味佳肴 | 物种进化 | 最优解(近似) |
二、适用赛题
函数优化、组合优化问题
- 对于一些非线性、多模型、多目标的函数优化问题
- 不依赖于问题的背景领域,使用方便,连续1离散、单峰1多峰等等各种形式均可
NP-Hard问题
- 模拟退火算法中讲过的TSP问题、背包问题、图形划分问题等
- 在NP-Hard问题方面普遍来说各类启发式算法均可
优缺点
- 相比模拟退火,相比良好的全局搜索能力,不易陷入局部最优
- 相比粒子群算法,常规的遗传算法可直接求解离散问题
- 缺点:由于变异是随机的,局部搜索能力差;相对其他算法更耗时、思路复杂抽象
- 可多种算法结合改进,例如遗传算法优化神经网络等混合算法(新手慎用)
三、模型流程
四、流程分析
还是以一个例题贯穿流程分析
例题:现有12份快递需要配送,背包容量350,每份快递的体积不同、收益不同,应该将哪些物品放进背包,使得所总体积不超过背包容量且总收益最大?
这是一个很典型的0-1背包问题,如果学过动态规划的同学,这个题目是非常简单的,不过这里我们用遗传算法求解之。
- 用“0”和“1”表示物品的装包状态
- 一个物品装包状态为0代表没有被装进包中,1代表被装进包中
- 例如“100111001001”代表第1,4,5,6,9,12个物品被装进背包
- 每一个物品的装包状态(0或1)作为一个基因
- 问题的一个解:一组12个数构成的数组为一个个体(染色体)
1.种群初始化
- 有N个物品,则随机生成N个数(0或1)构成一个数组,作为一个个体,及可能的解
- 重复上一步,生成多个个体,构成种群(解集)
- 群体规模太小容易陷入局部最优,太大又会使计算复杂度高费时间,一般设置20到200
2.选择运算
- 求每个个体的适应度:把解x带入目标函数求函数值f(x)
- 目的是从第t代群体P(t)中挑选出优良个体,把基因遗传到下一代群体P(t+1)
选择操作的准则
- 适应度越高的个体被选中的概率越大
- 适应度较低的个体仍有被选中的可能
为什么不直接从大到小排序,直接选适应度最高的几个个体进行后续操作?
- 适应度最高的几个个体,也意味着适应度高度相似
- 往往其基因(解分量)也很相似
- 如果每次都只选适应度最高的个体,意味着每轮迭代所选的个体相似度很高
- 那么后代的相似度也会很高,进化陷入停滞,意味着陷入局部最优解
至于选择操作怎么进行,看个人,只要符合上面的准则即可。下面提供一种方法
轮盘赌法
- 1.计算每个个体被选中概率P(xi),概率值与其适应度值成正比
- 2.计算每个个体对应的累积概率qi,为从第1个个体到当前个体的选中概率之和
- 3.随机生成一个数组bet,其中的元素取值在0到1之间,并将元素从小到大排序
- 4.若第i个个体的累积概率qi大于bet(i), 则第i个个体被选中,并更新bet(i)为bet(i+1),否则选择第(i+1)个个体与bet(i)比较,直至选出一个个体为止
- 5.重复步骤4,直至选出与种群数量相等的个体数(其中有的个体被多次选中)
轮盘赌法分析
- 第i个个体适应度值越大→被选中概率P(xi)数值越大
- P(xi)越大→P(xi) = (qi) - (qi-1)越大, 即第i个个体对累积概率带来的“增大幅度”也越大
- 增大幅度(qi - qi-1)越大→新个体满足qi > bet的概率也越大(回忆下bet是怎么变化的)
- 个体满足qi > bet(i)即意味着被选中
- 结论:个体适应度值越大,被选中的概率越大
- 基因好、适应度大使得其对累积概率带来的“增幅”更大
- 类似在轮盘上该个体所占的面积越大,被选中的概率也越大
- 被选择的个体中会有重复
- 因为适应度高的个体被选中概率大而可能被选中多次
- 对应于生物界中基因优良生存能力强的个体可能具有多次交配权
3.交叉
- 在被选择的所有个体中,两个个体之间进行交叉操作
- 先根据交叉概率判断是否执行交叉操作,一般设置为80%到95%(即较大概率)
- 随机选择进行交叉的位置,如何选择看个人,满足随机即可
4.变异
- 变异操作是为了利用“不确定性”来赌一把,或许更好,或许更差
- 先判断每个个体的每个基因是否进行变异运算,一般变异概率设为0.5%到5%即可
- 变异运算就是对变异的基因取反,0变1,1变0
5.输出最优解
当循环完成后,统计种群中所有的适应度,取最优解输出,到底是最大还是最小是最优解根据具体题目
6.补充
进行运算的时候,不要忘记题目本身的一些约束。比如这个背包问题,如果体积超过背包容量上限,即使其适应度可能很高但是这种情况也不能要,所以要进行一些操作避免,比如设置惩罚系数或者直接赋0等,看个人选择。具体题目具体分析。
7.总结
背包问题 | 生物学 | 遗传算法 |
多种背包方案 | 群体 | 可行解集合 |
单个方案 | 个体 | 可行解 |
每个物体是否被选中 | 基因 | 可行解的分量 |
包内总价值 | 适应度 | 适应度函数值 |
两方案中的物品交换 | 交叉 | 交叉操作 |
随机改变物品的选择 | 变异 | 变异操作 |
包内总价值最大 | 物种进化 | 最优解(近似) |