首页 / 资料库 / 微软 · AI 入门

资料库8 分钟读完MIT遗传算法优化搜索

遗传算法:让解自己进化出来

译自《Genetic Algorithms》 · 查看英文原文

原文出处Genetic Algorithms 原作者:Microsoft · 许可证:MIT License 中文译本由诸葛AI学院整理,仅供学习参考,版权归原作者与微软所有。

遗传算法

课前小测

遗传算法(Genetic Algorithm,GA)基于一种进化式的思路:这类 AI 方法借用种群的进化过程,为给定问题寻找最优解。1975 年,约翰·亨利·霍兰德(John Henry Holland)提出了这种方法。

遗传算法建立在以下几个想法之上:

  • 问题的可行解可以表示成基因(gene)
  • 通过交叉(crossover),我们可以把两个解结合,得到一个可行的新解
  • 通过选择(selection),用某个适应度函数(fitness function)挑出更优的解
  • 引入变异(mutation),是为了扰动优化过程,帮我们跳出局部极小值(local minimum)

想实现一个遗传算法,你需要准备好下面几件事:

  • 找到一种方法,把问题的解编码成基因 g ∈ Γ
  • 在基因集合 Γ 上定义适应度函数 fit: Γ → R。函数值越小,解越好。
  • 定义交叉机制,把两个基因结合成一个可行的新解:crossover: Γ² → Γ
  • 定义变异机制 mutate: Γ → Γ

在很多情况下,交叉和变异都只是相当简单的算法:把基因当成数字序列或者位向量(bit vector)来操作。

遗传算法的具体实现因问题而异,但整体结构如下:

  1. 选择一个初始种群 G ⊂ Γ
  2. 随机决定这一步执行哪种操作:交叉还是变异
  3. 交叉: * 随机选取两个基因 g₁, g₂ ∈ G * 计算交叉结果 g = crossover(g₁, g₂) * 若 fit(g) < fit(g₁) 或 fit(g) < fit(g₂),就用 g 替换种群中对应的那个基因
  4. 变异:随机选一个基因 g ∈ G,用 mutate(g) 替换它
  5. 回到第 2 步重复,直到 fit 的值足够小,或者达到步数上限。

典型任务

遗传算法通常解决的问题包括:

  1. 排程优化
  2. 最优装箱
  3. 最优下料
  4. 加快穷举搜索

✍️ 动手实践:遗传算法

在下面的笔记本里继续学习:

打开这个笔记本,看遗传算法的两个应用例子:

  1. 公平分赃(宝物如何均分)
  2. 八皇后问题

小结

遗传算法被用来解决很多问题,包括物流和搜索类问题。这个领域的兴起,源于把心理学和计算机科学合并起来的研究。

🚀 挑战

"遗传算法实现起来简单,但它的行为很难理解。"(来源)请做一些调研,找到一个遗传算法的实现例子,比如用遗传算法解数独,再用草图或流程图讲清楚它是怎么工作的。

课后小测

复习与自学

这个很棒的视频,讲的是如何用遗传算法训练神经网络,让电脑学会玩超级马里奥。关于电脑如何学习玩这类游戏,我们会在下一节继续展开。

作业:丢番图方程

你的目标是求解所谓的丢番图方程(Diophantine equation),也就是根为整数的方程。举个例子,看方程 a + 2b + 3c + 4d = 30,你需要找出满足它的整数根。

这份作业的灵感来自这篇帖子

提示:

  1. 可以把根的取值范围限定在 [0, 30] 区间内
  2. 基因可以考虑编码成一组根值的列表

Diophantine.ipynb 开始动手。

这篇在讲什么,跟咱们的课怎么对?

资料库是大厂公开教材的中文译本,偏原理和工程做法。想看面向中小企业的白话版本,去入门课场景课