遗传算法到底是什么,它们适合解决什么样的问题?

人工智能 遗传算法 应用 进化算法
2021-10-23 20:13:29

我注意到这个网站上的一些问题提到了遗传算法,这让我意识到我对这些并不太了解。

我以前听说过这个词,但我从来没有使用过这个词,所以我不太了解它们是如何工作的以及它们有什么用处。我所知道的是,它们涉及某种进化和随机变化的价值观。

你能给我一个简短的解释,最好包括一些说明基本原理的实际例子吗?

4个回答

进化算法是基于达尔文自然选择原理的一系列优化算法。作为自然选择的一部分,给定的环境中有一群为生存和繁殖而竞争的个体。每个人实现这些目标的能力决定了他们生育孩子的机会,换句话说,将他们的基因传给下一代,由于遗传原因,他们将有更多的机会做得更好,甚至更好,在实现这两个目标的过程中。

进化算法采用这种世代持续改进的原则来优化问题的解决方案。初始生成中,随机或通过其他方法生成由不同个体组成的种群。个人是问题的解决方案,或多或少是好的:个人对问题的质量称为适应度,它反映了解决方案对要解决的问题的充分性。个体的适应度越高,将其部分或全部基因型传递给下一代个体的可能性就越大。

个体被编码为基因型,可以具有任何形状,例如位向量(遗传算法)或真实向量(进化策略)。在评估个体时,即在计算其适应度时,每个基因型都会转化为表型。在某些情况下,表型与基因型相同:称为直接 编码. 否则,编码称为间接编码。例如,假设您要优化由长、高和宽定义的长方体的大小。为了简化示例,假设这三个量是 0 到 15 之间的整数。然后我们可以使用 4 位二进制数来描述它们中的每一个。潜在解决方案的一个例子可能是基因型 0001 0111 1010。相应的表型是长 1、高 7 和宽 10 的平行六面体。

在从旧代到新一代的过渡过程中,应用了以操纵个体为目的的变异 算子。有两种不同类型的变体运算符:

  • 突变 算子,用于在同一个体内引入变异,作为基因突变
  • 交叉 算子用于交叉至少两种不同的基因型,作为育种的遗传交叉。

进化算法已经在运筹学、机器人学、生物学、细微差别或密码学等各个领域证明了自己。此外,它们可以同时优化多个目标,并且可以用作黑匣子,因为它们不假设数学模型中的任何属性进行优化。它们唯一真正的限制是计算复杂性。

在此处输入图像描述

遗传算法是一种为一个问题随机生成许多尝试解决方案的算法。这组尝试的解决方案称为“人口”。

然后,它会尝试使用给定的适应度函数来查看这些解决方案解决问题的效果具有最佳适应度值的尝试解决方案用于生成新种群。这可以通过对尝试的解决方案(突变)或通过组合现有的尝试解决方案(交叉)进行小的更改来完成。

这个想法是,随着时间的推移,会出现一种尝试性的解决方案,该解决方案具有足够高的适应度值来解决问题。

其灵感来自进化论。最适合的解决方案生存和繁殖。

示例 1

假设您正在寻找从一块木头上切割出多种形状的最有效方法。你想尽可能少地浪费木材。

您尝试的解决方案是在您的木头上随机排列这些形状。适合度将取决于在按照这种安排切割形状后剩下的木材量。
剩下的木头越少,尝试的解决方案就越好。

示例 2

假设您试图找到一个通过多个点的多项式。您尝试的解决方案将是随机多项式。
要确定这些多项式的适应度,您需要确定它们与给定点的拟合程度。(在这种特殊情况下,您可能会使用最小二乘法来确定多项式与点的拟合程度)。经过多次试验,你会得到更适合点的多项式,直到你有一个与点足够接近的多项式。

这里有很多很好的答案来解释什么是遗传算法,并给出了示例应用程序。我正在添加一些关于它们有什么好处的通用建议,以及你不应该使用它们的情况。

如果我的语气听起来很严厉,那是因为在下面不合适的部分中的任何情况下使用 GA 都会导致您的论文立即被任何顶级期刊拒绝。

首先,您的问题必须是优化问题。您需要定义一个您正在尝试优化的“适应度函数”,并且您需要有一种方法来衡量它。

好的

  • 交叉函数易于定义且自然:在处理某些类型的数据时,交叉/变异函数可能很容易定义。例如,字符串(例如 DNA 或基因序列)可以很容易地通过拼接两个候选字符串来获得一个新字符串(这就是大自然使用遗传算法的原因!)。树(如系统发育树或解析树)也可以通过将一棵树的分支替换为另一棵树的分支来进行拼接。通过在形状上绘制网格并组合来自父母的不同网格部分以获得孩子,可以轻松地改变形状(如飞机机翼或船形)。通常这意味着您的问题由不同的部分组成,将来自不同解决方案的部分组合在一起是有效的候选解决方案。
  • 这意味着如果您的问题是在坐标没有任何特殊含义的向量空间中定义的,则 GA 不是一个好的选择。如果很难将您的问题表述为 GA,那就不值得了。
  • 黑盒评估:如果对于候选人,您的适应度函数是在计算机之外评估的,那么 GA 是一个好主意。例如,如果您正在空气隧道中测试机翼形状,遗传算法将帮助您生成良好的候选形状以进行尝试。
  • 例外:模拟如果您的适应度函数正在测量喷嘴设计的性能,并且需要模拟每个喷嘴形状的流体动力学,那么 GA 可能适合您。如果您通过时间模拟物理系统并且对您的设计在操作过程中的执行情况感兴趣,它们也可能起作用,例如。建模运动模式然而,文献中正在开发使用偏微分方程作为约束的方法,例如。PDE 约束优化,所以这在未来可能会改变。

不当

  • 您可以计算函数的梯度:如果您可以访问函数的梯度,则可以进行梯度下降,这通常比 GA 更有效。梯度下降可能存在局部最小值问题(就像 GA 一样),但已经研究了许多方法来缓解这种情况。
  • 您知道封闭形式的适应度函数:然后,您可能可以计算梯度。许多语言都有支持自动微分的库,因此您甚至不需要手动进行。如果您的函数不可微,那么您可以使用subgradient descent
  • 您的优化问题是已知形式的,例如线性程序或二次程序:GA(以及一般的黑盒优化方法)在需要评估的候选者数量方面非常低效,最好尽可能避免。
  • 您的解决方案空间很小:如果您可以有效地对搜索空间进行网格化,则可以保证您找到了最佳解决方案,并且可以制作解决方案空间的等高线图,以查看是否有需要进一步探索的区域。

最后,如果您正在考虑 GA,请考虑最近在进化策略方面的工作。我偏向于CMA-ES,我认为这是一个很好的简单算法,它以传统 GA 不具备的方式捕捉适应度景观中的梯度概念。

这个答案要求提供一个如何使用的实际示例,除了其他答案之外,我将尝试提供该示例。他们似乎很好地解释了遗传算法是什么。所以,这将举一个例子。

假设你有一个神经网络(尽管它们不是它的唯一应用),它从一些给定的输入中会产生一些输出。遗传算法可以创建这些种群,并通过查看哪个输出是最好的,繁殖并杀死种群中的成员。最终,如果神经网络足够复杂,这应该会优化它。

这是我所做的演示,尽管编码很糟糕,但可能会帮助您理解。http://khrabanas.github.io/projects/evo/evo.html 点击进化按钮,搞乱目标。

它使用一种简单的遗传算法来繁殖、变异并决定种群中的哪些个体能够存活下来。根据输入变量的设置方式,网络将能够在一定程度上接近它们。以这种方式,人口最终可能会成为一个同质的群体,其输出类似于目标。

遗传算法试图创建一种“神经网络”,通过接收 RGB,将产生输出颜色。首先,它生成一个随机种群。然后,它从种群中随机抽取 3 个成员,选择适应度最低的成员并将其从种群中删除。适应度等于顶部目标的平方差 + 底部目标的平方差。然后它将剩下的两个一起繁殖,并将孩子添加到与死亡成员相同的位置。当交配发生时,就有可能发生突变。此突变将随机更改其中一个值。

附带说明一下,由于它的设置方式,在许多情况下它不可能完全正确,尽管它会达到相对接近的程度。