进化策略 - 进化算法 (Evolutionary-Algorithm) | 莫烦Python
切换视频源:

进化策略

作者: 莫烦 编辑: 莫烦 2017-08-28

学习资料:

要点

如果你想对进化策略有一个快速了解, 这个几分钟的短动画是个很好的方式.

进化策略 (Evolution Strategy) 后面都简称 ES. 它和 遗传算法 GA 是好兄弟. 步骤和流程都非常相似. 如果你对遗传算法也感兴趣, 前面几节内容都是有关于遗传算法的. 要我用一句话概括ES: 在程序里生宝宝, 杀死不乖的宝宝, 让乖宝宝继续生宝宝. 乍一听, 怎么和 GA 是完全一样的逻辑呢? 没关系, 我们在接下来的内容中揭晓他们的不同.

本节要实践的内容提前看:

3-1-0.gif

和遗传算法的异同

遗传算法 (后面简称 GA) 和 ES 真 TM 差不多. 导致很多朋友学习的时候, 都傻傻分不清. 不过我具体的列出来, 方便看清楚.

  • 选好父母进行繁殖 (GA); 先繁殖, 选好的孩子 (ES)
  • 通常用二进制编码 DNA (GA); 通常 DNA 就是实数, 比如 1.221 (ES)
  • 通过随机让 1 变成 0 这样变异 DNA (GA); 通过正态分布(Normal distribution)变异 DNA (ES)

具体来说, 传统的 GA 的 DNA 形式是这样:

DNA=11010010

而传统的 ES DNA 形式分两种, 它有两条 DNA. 一个 DNA 是控制数值的, 第二个 DNA 是控制这个数值的变异强度. 比如一个问题有4个变量. 那一个 DNA 中就有4个位置存放这4个变量的值 (这就是我们要得到的答案值). 第二个 DNA 中就存放4个变量的变动幅度值.

DNA1=1.23, -0.13, 2.35, 112.5 可以理解为4个正态分布的4个平均值.

DNA2=0.1, 2.44, 5.112, 2.144 可以理解为4个正态分布的4个标准差.

所以这两条 DNA 都需要被 crossovermutate.

进化啦

写基础的 ES 算法其实很简单. 我总结起来, 其实就两个功能, make_kidkill_bad

对于今天的问题, 我们就是要找这张图中的最高点.

2-1-1.png

而这个点只有一个, 所以我们的 DNA 的长度就只有一个. 我们用一个 python 字典来存这两种 DNA 的信息. 这里 DNA 存的是均值, mut_strength 存的是标准差.

训练的主循环, (生死循环... 觉得血腥味很重..为什么我的遗传算法教程就没这么重血腥味呢..) 如下:

首先的 make_kid 功能. 我们随机找到一对父母, 然后将父母的 DNAmut_strength 基因都 crossover 给 kid. 然后再根据 mut_strength mutate 一下 kid 的 DNA. 也就是用正态分布抽一个 DNA sample. 而且 mut_strength 也能变异. 将变异强度变异以后, 他就能在快收敛的时候很自觉的逐渐减小变异强度, 方便收敛.

接下来到了惊心动魄的杀人时间. 根据适应度 fitness 选择适应度最靠前的一些人, 抛弃掉那些适应度不佳的人. 这个很简单.

这样我们就完成了最一般的 ES 算法的主体. 还有一些零散的, 可视化的代码都可以在我的 github 中找到. 这里就不细说了.

下次我们会总结基础的 ES 算法类型. 并且看看一种比较流行的 ES 算法.


降低知识传递的门槛

莫烦很常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛免费 奉献我的所学正是受这种态度的影响。 通过 【赞助莫烦】 能让我感到认同,我也更有理由坚持下去。

    进化算法 (Evolutionary-Algorithm)