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

时间:2014-02-03 20:26:37

标签: algorithm heuristics greedy

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

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

5 个答案:

答案 0 :(得分:17)

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

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

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

另一种策略(启发式)可能会尝试使用高速公路覆盖尽可能多的旅程(因为对于大多数目的地而言,它们往往更直接),然后使用正常的道路进行转换。在某些情况下,它可能会表现得相当糟糕,但在大多数情况下,它会做得很好,说实话,它可能是我们在通勤时使用的类似启发式(如果不使用卫星导航)。

结束......

  • 所有启发式算法,贪婪算法 - 否

  • 所有贪婪算法,启发式算法 - 总的来说,是的。

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

答案 1 :(得分:4)

  

它们的主要特征是在每次迭代时选择最佳(本地)选项

启发式方法完全不正确。启发式算法正在做出理论上已知不太理想的选择,但在实践中已经证明可以产生合理的结果。 Heuristics通常会找到近似解决方案:

  

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

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

  

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

答案 2 :(得分:3)

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

启发式是一个通用术语,表示任何ad-hoc /直观规则,希望改进算法的行为,但不保证。示例:用于在Quicksort中选择枢轴的三次中值规则。

答案 3 :(得分:1)

这是两个不同的东西:贪婪算法尝试在每次迭代时采用“最佳选择”(例如,如果您按照图形的长度选择边缘,它将在每次迭代中选择最长/最短边缘)。贪心算法提供了精确的解决方案!

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

答案 4 :(得分:0)

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

在我看来,启发式算法就像维基百科所说的那样:

  

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

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