贪心算法和启发式算法有啥区别?

Posted

技术标签:

【中文标题】贪心算法和启发式算法有啥区别?【英文标题】:What's the difference between greedy and heuristic algorithm?贪心算法和启发式算法有什么区别? 【发布时间】:2014-02-27 12:14:11 【问题描述】:

贪心算法和启发式算法有什么区别?

我已经阅读了一些关于该论点的文章,在我看来,它们或多或少是同一类型的算法,因为它们的主要特征是在每次迭代中选择最佳(局部)选项来解决问题。

【问题讨论】:

【参考方案1】:

启发式向我描述的方式是它们是“经验法则”。他们产生全局最优解决方案的能力可能无法直接证明,但通常情况下,他们做得很好。当确定最佳解决方案的成本太高时,通常会使用它们。此外,启发式算法通常对过去如何解决问题的经验进行编码。描述启发式的更好方法是“解决策略”。

贪心算法是一种根据目前看起来最好的方法做出选择的算法。换句话说,选择是局部最优的,但不一定是全局最优的(如果幸运的话可能是这样,但你无法证明它)。此外,贪心算法通常不会根据新信息改进其解决方案。这只是一种解决策略(a.k.a heuristic)。

为了提供一个贪心算法如何工作的示例,如果您要使用一个贪心算法来帮助您规划一条从该国一侧以最短距离行驶到另一侧的路线,它可能会选择短慢速道路。它不一定会理解高速公路虽然更长,可能更直接,但会是更好的选择。

另一种策略(启发式)可能会寻求使用高速公路覆盖尽可能多的旅程(因为对于大多数目的地来说,它们往往更直接),然后求助于使用普通道路进行过渡。在某些情况下,它可能会表现得很糟糕,但在大多数情况下,它会做得很好,而且老实说,这可能是我们通勤时使用的类似启发式方法(如果不使用卫星导航)。

结束...

都是启发式、贪心算法 - 否

都是贪心算法,启发式 - 一般来说,是的。

为了帮助提供一些背景知识,我在大学算法课上学到的第一个问题是Traveling Salesman Problem。它属于NP完全类问题,意味着不存在有效的解决方法。也就是说,随着问题规模的扩大,寻找解决方案所需的时间会大幅增加。存在许多可证明的算法,但它们的性能不是很好,在现实世界的应用中,我们倾向于支持启发式算法(包括贪婪算法 - 见链接)。

【讨论】:

可以证明贪心算法在许多情况下产生全局最优值。一个例子是未加权区间选择问题。 稍微修正一下,因为一个问题属于NP完全类并不意味着不存在解决它的有效方法。这只是意味着一个尚未被发现,而且它不太可能存在。 en.wikipedia.org/wiki/NP-completeness。另请参阅simple.wikipedia.org/wiki/P_versus_NP。这基本上提出了我们是否可以在多项式时间内检查问题的解决方案的问题,这是否意味着我们也可以在多项式时间内解决它。 我不同意。 Dijkstra 是贪婪的(我们选择的下一个节点是本地附近可用的最佳选择)但它不是启发式的! (因为该选择不是基于启发式或临时预测,而是基于事实/预先存在的知识)。 Dijkstra 还根据新信息完善自己,尽管它很贪婪,这正是它完整的原因。【参考方案2】:

它们的主要特点是在每次迭代中选择最佳(局部)选项

对于启发式方法来说完全不正确。启发式算法正在做出理论上已知是次优的选择,但在实践中已被证明可以产生合理的结果。 Heuristics 通常会找到一个近似的解决方案:

在计算机科学、人工智能和数学优化中,启发式是一种技术,用于在经典方法太慢时更快地解决问题,或者在经典方法无法找到任何精确解决方案时找到近似解决方案。这是通过以最优性、完整性、准确性或精确性换取速度来实现的。

贪婪是启发式的一个例子(做出最佳的局部选择并希望获得最佳的全局结果),但这并不意味着启发式是贪婪的。有许多与贪婪完全无关的启发式方法,例如。 genetic algorithms are considered heuristic:

在人工智能的计算机科学领域,遗传算法 (GA) 是一种模仿自然选择过程的启发式搜索。

【讨论】:

【参考方案3】:

当您将元素逐一聚合到解决方案(遵循某种选择策略)并且永不回溯时,就会说贪婪。示例:直接选择排序可以被认为是一个贪心过程。

启发式是一个通用术语,表示任何用于改进算法行为的临时/直观规则,但没有保证。示例:用于在快速排序中选择枢轴的三中位数规则。

【讨论】:

【参考方案4】:

这是两件不同的事情:贪心算法尝试在每次迭代时选择“最佳选择”(例如,如果您根据长度选择图中的边,它会在每次迭代中选择可能的最长/最短边)。贪心算法提供了一个精确的解决方案!

启发式算法使用概率和统计数据来避免遍历所有可能性并提供“估计的最佳解决方案”(这意味着如果存在更好的解决方案,它只会稍微好一点)。

【讨论】:

“贪婪算法提供了一个精确的解决方案!” - 不确定。我将所有使用贪心方法的算法都称为“贪心”,即使它们不会产生精确的解决方案。 “精确”和“最佳”一样吗?不,大多数贪心算法不是最优的。 “A greedy algorithm always makes the choice that looks best at the moment. That is, it makes a locally optimal choice in the hope that this choice will lead to a globally optimal solution.” @Dukeling:我认为他的意思是“精确”,就像“不近似”一样。哪个,imo,也不正确。 @LeartS 介意提供一个不提供精确解决方案的贪心算法示例?【参考方案5】:

注意:我不确定以下内容适用于我和我的“社交圈”还是标准 - 全球概念。

在我看来,启发式算法是 Wikipedia 所说的:

启发式是一种技术,用于在经典方法太慢时更快地解决问题,或者在经典方法无法找到任何精确解决方案时找到近似解决方案。这是通过以最优性、完整性、准确性或精确性换取速度来实现的。

另一方面,贪心算法就是您所描述的:一种通过在每一步中选择最佳选项来尝试找到最佳解决方案的算法。差不多就是这样。这并不意味着解决方案的任何内容:有时贪心算法提供了完美和最优的解决方案,而其他时候它可能只是一个启发式 -> 近似(不完美)但更快的解决方案。

【讨论】:

以上是关于贪心算法和启发式算法有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

启发式和元启发式有啥区别?

什么是算法?从枚举到贪心再到启发式(下)-终于有人把邻域搜索讲清了!

零基础学启发式算法-贪心算法(Greedy Algorithm)

什么是算法?从枚举到贪心再到启发式(上)

随机算法和启发式算法之间的区别

什么是算法?从枚举到贪心再到启发式(上)