严格来说,这两件事——模拟退火(SA)和遗传算法既不是算法,也不是它们的目的“数据挖掘”。
两者都是元启发式——在抽象尺度上比“算法”高出几个层次。换句话说,这两个术语都指的是高级隐喻——一个来自冶金学,另一个来自进化生物学。在元启发式分类法中,SA 是一种单态方法,GA 是一种种群方法(在与 PSO、ACO 等一起的子类中,通常称为受生物学启发的元启发式算法)。
这两种元启发式算法用于解决优化问题,特别是(但不限于)组合优化(又名约束满足编程)。组合优化是指通过从一组离散项中进行选择来进行优化——换句话说,没有可以最小化的连续函数。背包问题、旅行商问题、库存问题——都是组合优化问题。
与数据挖掘的联系在于,许多(大多数?)监督机器学习 (ML) 算法的核心是优化问题的解决方案——(例如多层感知器和支持向量机)。
解决上限问题的任何解决方案技术,无论采用何种算法,都基本上由以下步骤组成(通常在递归循环中编码为单个块):
对特定于域的详细信息进行编码
在成本函数中(它是
逐步最小化值
从这个函数返回
构成对 c/o 的“解决方案”
问题);
评估成本函数传递
在最初的“猜测”中(开始
迭代);
基于从
成本函数,生成后续
候选解决方案(或超过
一,取决于
元启发式)到成本
功能;
通过以下方式评估每个候选解决方案
将它传递到参数集中,以
成本函数;
重复步骤 (iii) 和 (iv) 直到
要么一些收敛标准是
满意或最大数量
达到迭代次数。
元启发式针对上述步骤 (iii);因此,SA 和 GA 的不同之处在于它们如何生成用于通过成本函数进行评估的候选解决方案。换句话说,这是了解这两种元启发式方法有何不同的地方。
非正式地,针对组合优化解决方案的算法的本质是它如何处理从成本函数返回的值差比当前最佳解决方案的候选解决方案候选解决方案(从成本函数返回最小值的解决方案)。优化算法处理这种候选解决方案的最简单方法是彻底拒绝它——这就是爬山算法所做的。但是这样做,简单的爬山总是会错过一个更好的解决方案,与当前的解决方案相隔一个山丘。换句话说,一个复杂的优化算法必须包含一种技术,用于(暂时)接受比当前最佳解决方案更差的候选解决方案(即,上坡),因为比当前解决方案更好的解决方案可能位于更差的路径上解决方案。
那么 SA 和 GA 是如何生成候选解的呢?
SA 的本质通常用成本更高的候选解决方案被接受的概率来表示(双括号内的整个表达式是一个指数:
p = e((-highCost - lowCost)/temperature)
或者在python中:
p = pow(math.e, (-hiCost - loCost) / T)
“温度”项是一个变量,其值在优化过程中会衰减 - 因此,SA 接受较差解决方案的概率会随着迭代次数的增加而降低。
换句话说,当算法开始迭代时,T 非常大,如您所见,这会导致算法移动到每个新创建的候选解决方案,无论是比当前最佳解决方案更好还是更差——即,它正在解决方案空间中进行随机游走。随着迭代次数的增加(即,随着温度的降低),算法对解空间的搜索变得不那么允许,直到 T = 0,行为与简单的爬山算法相同(即,只有比当前最佳的解更好解决方案被接受)。
遗传算法非常不同。一方面——这是一件大事——它产生的不是单一的候选解决方案,而是整个“他们的群体”。它的工作原理是这样的:GA 调用总体中每个成员(候选解决方案)的成本函数。然后,它按照从成本函数返回的值(“最佳”具有最低值)对它们进行排序,从最好到最差。从这些排名值(及其相应的候选解决方案)创建下一个总体。人口的新成员基本上是通过以下三种方式之一产生的。第一种通常被称为“精英主义”,在实践中通常是指仅采用排名最高的候选解决方案并将它们直接传递——未经修改——传递给下一代。人口中新成员的另外两种方式通常被称为“突变”和“交叉”。突变通常涉及从当前总体中更改候选解向量中的一个元素以在新总体中创建解向量,例如 [4, 5, 1, 0, 2] => [4, 5, 2, 0 , 2]。交叉操作的结果就像如果向量可以有性会发生什么 - 即,一个新的子向量,其元素由来自两个父母中的每一个的一些组成。
所以这些是 GA 和 SA 之间的算法差异。性能上的差异如何?
在实践中:(我的观察仅限于组合优化问题)GA 几乎总是优于 SA(从成本函数返回较低的“最佳”返回值——即接近解空间全局最小值的值),但是以更高的计算成本。据我所知,教科书和技术出版物在分辨率上都引用了相同的结论。
但事情是这样的:GA 本质上是可并行化的;更重要的是,这样做是微不足道的,因为组成每个群体的各个“搜索代理”不需要交换消息——即,它们彼此独立工作。显然这意味着GA 计算可以分布式,这意味着在实践中,您可以获得更好的结果(接近全局最小值)和更好的性能(执行速度)。
在什么情况下 SA 可能优于 GA?我认为一般情况是那些解决方案空间很小的优化问题,因此 SA 和 GA 的结果实际上是相同的,但执行上下文(例如,数百个类似问题以批处理模式运行)有利于更快的算法(应始终为 SA)。