模拟退火和遗传算法有什么区别?

模拟退火(带豆搜索)和遗传算法在性能和用例方面有哪些相关差异?

我知道 SA 可以被认为是种群大小仅为 1 的 GA,但我不知道两者之间的关键区别。

另外,我正在尝试设想一种 SA 胜过 GA 或 GA 胜过 SA 的情况。 仅需一个简单的示例即可帮助我理解。


回答:

严格来说,模拟退火 (SA) 和遗传算法既不是算法,其目的也不是“数据挖掘”。

两者都是元启发式算法——在抽象层次上比“算法”高几个级别。 换句话说,这两个术语都指的是高级隐喻——一个借用于冶金学,另一个借用于进化生物学。在元启发式分类中,SA 是一种单状态方法,而 GA 是一种种群方法(与 PSO、ACO 等属于一个子类,通常被称为生物启发式元启发式算法)。

这两种元启发式算法用于解决优化问题,尤其是在组合优化(又称约束满足规划)中(但不限于此)。 组合优化是指通过从一组离散项目中进行选择来进行优化——换句话说,没有需要最小化的连续函数。 背包问题、旅行商问题、切割下料问题——都是组合优化问题。

与数据挖掘的联系在于,许多(大多数?)监督机器学习 (ML) 算法的核心是优化问题的解决方案——(例如,多层感知器和支持向量机)。

无论采用何种算法,解决 CAP 问题的所有技术都将基本上包含以下步骤(这些步骤通常被编码为递归循环中的单个块):

  1. 将特定于域的详细信息编码
    到成本函数中(逐步最小化
    从该函数返回的值构成了
    c/o 问题的“解决方案”);

  2. 评估成本函数,传入
    一个初始“猜测”(开始
    迭代);

  3. 根据从
    成本函数返回的值,生成后续的
    候选解决方案(或多个,具体取决于
    元启发式);

  4. 通过
    将参数集传递给
    成本函数来评估每个候选解决方案;

  5. 重复步骤 (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)。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注