113

启发式和算法之间有什么区别?

4

12 回答 12

108

算法是对问题的自动解决方案的描述。该算法的作用是精确定义的。该解决方案可能是也可能不是最好的解决方案,但您从一开始就知道您将获得什么样的结果。您使用某种编程语言来实现算法以获取(一部分)程序

现在,有些问题很难解决,您可能无法在可接受的时间内得到可接受的解决方案。在这种情况下,您通常可以通过应用一些任意选择(有根据的猜测)更快地获得不太糟糕的解决方案:这是一种启发式.

启发式仍然是一种算法,但它不会探索问题的所有可能状态,或者会从探索最可能的状态开始。

典型的例子来自游戏。在编写国际象棋游戏程序时,您可以想象在某个深度级别上尝试所有可能的移动并将某些评估函数应用于棋盘。启发式会排除以明显糟糕的动作开始的完整分支。

在某些情况下,您不是在寻找最佳解决方案,而是寻找适合某些约束的任何解决方案。一个好的启发式方法将有助于在短时间内找到解决方案,但如果唯一的解决方案位于它选择不尝试的状态中,也可能无法找到任何解决方案。

于 2010-02-26T15:42:09.357 回答
34
  • 算法通常是确定性的,并被证明可以产生最佳结果
  • 启发式没有正确性证明,通常涉及随机元素,并且可能不会产生最佳结果。

许多没有找到最佳解决方案的有效算法已知的问题具有启发式方法,可以非常快速地产生接近最佳的结果。

有一些重叠:“遗传算法”是一个公认的术语,但严格来说,这些是启发式的,而不是算法。

于 2010-02-25T13:29:08.243 回答
22

简而言之,启发式是“有根据的猜测”。维基百科很好地解释了它。最后,采用“普遍接受”方法作为指定问题的最优解。

启发式是基于经验的技术的形容词,有助于解决问题、学习和发现。启发式方法用于快速得出希望接近最佳答案或“最佳解决方案”的解决方案。启发式是“经验法则”、有根据的猜测、直觉判断或简单的常识。启发式是解决问题的一般方法。Heuristics 作为名词是启发式方法的另一个名称。

更准确地说,启发式代表使用易于访问但应用松散的信息来控制人类和机器解决问题的策略。

而算法是一种包含用于解决问题的有限指令集的方法。该方法已在数学或科学上被证明可以解决该问题。有正式的方法和证明。

启发式算法是一种能够在许多实际场景中以一般启发式的方式对问题产生可接受的解决方案的算法,但没有正式的正确性证明。

于 2010-02-25T13:29:09.320 回答
9

算法是要执行的独立的逐步操作集4,通常解释为(计算机或人类)指令的有限序列,以确定问题的解决方案,例如:是否有从 A 到B,或者 A 和 B 之间的最小路径是什么。在后一种情况下,您也可以对“合理接近”的替代解决方案感到满意。

存在某些类别的算法,启发式算法就是其中之一。在这种情况下,根据算法的(经过验证的)属性,它属于以下三个类别之一(注 1):

  • 精确:该解决方案被证明是输入问题的最佳(或精确解决方案)
  • 近似值:证明解值的偏差永远不会比某些预定义的界限更远离最优值(例如,永远不会比最优值大 50%)
  • 启发式:算法尚未被证明是最优的,也不在最优解的预定义范围内

请注意,近似算法也是一种启发式算法,但具有更强的属性,即它输出的解决方案(值)有一个已证明的界限。

对于某些问题,没有人找到一种“有效”的算法来计算最优解(注 2)。其中一个问题是著名的旅行推销员问题。例如,Christophides 的旅行商问题算法曾经被称为启发式算法,因为没有证明它在最优解的 50% 以内。然而,由于它已被证明,Christophides 的算法更准确地称为近似算法。

由于计算机可以做什么的限制,并不总是能够有效地找到可能的最佳解决方案。如果一个问题有足够的结构,可能会有一种有效的方法来遍历解空间,即使解空间很大(即在最短路径问题中)。

启发式算法通常用于改进算法的运行时间,通过添加“专家信息”或“有根据的猜测”来指导搜索方向。在实践中,启发式也可以是优化算法的子程序,以确定首先查找的位置。

(注 1):此外,算法的特征在于它们是否包含随机或非确定性元素。始终以相同方式执行并产生相同答案的算法称为确定性算法。

(注 2):这被称为 P vs NP 问题,被归类为 NP 完全和 NP 困难的问题不太可能有一个“有效”的算法。笔记; 正如@Kriss 在评论中提到的那样,甚至还有“更糟糕”的问题类型,可能需要指数时间或空间来计算。

有几个答案可以回答部分问题。我认为它们不够完整且不够准确,因此决定不编辑@Kriss 接受的答案

于 2016-01-20T16:49:20.610 回答
6

其实我不认为他们之间有很多共同点。一些算法在其逻辑中使用启发式(通常是为了减少计算或获得更快的结果)。通常在所谓的贪心算法中使用启发式算法。

启发式是我们认为可以很好地使用的一些“知识”,以便在我们的算法中获得最佳选择(何时应该做出选择)。例如......国际象棋中的启发式可能是(如果可以的话,总是选择对手的皇后,因为你知道这是更强的数字)。启发式方法不能保证你会得到正确的答案,但是(如果假设是正确的)通常会在更短的时间内得到接近最佳答案的答案。

于 2010-02-25T13:24:19.263 回答
4

算法是一组明确定义的解决问题的指令,启发式方法涉及利用学习和发现的方法来达到解决方案。

因此,如果您知道如何解决问题,请使用算法。如果您需要开发解决方案,那么它就是启发式方法。

于 2010-02-25T13:29:18.677 回答
4

启发式算法是算法,因此从这个意义上说,没有算法,但是,启发式算法采用“猜测”方法来解决问题,产生“足够好”的答案,而不是找到“可能的最佳”解决方案。

一个很好的例子是你有一个非常困难的(阅读 NP 完全)问题你想要一个解决方案但没有时间去解决它,所以必须使用基于启发式算法的足够好的解决方案,例如使用遗传算法找到旅行商问题的解决方案。

于 2010-02-25T15:02:11.907 回答
4

算法是一些操作的序列,给定输入计算一些东西(一个函数)并输出一个结果。

算法可能会产生精确或近似的值。

它还可以计算一个随机值,该随机值具有接近精确值的高概率。

启发式算法使用对输入值的一些洞察力并计算不精确的值(但可能接近最佳值)。在某些特殊情况下,启发式可以找到精确的解决方案。

于 2010-02-25T16:51:34.890 回答
2

启发式通常是一种优化或策略,通常可以提供足够好的答案,但并不总是也很少是最佳答案。例如,如果你想用蛮力解决旅行商问题,一旦它的成本超过当前最佳解决方案的成本,就丢弃部分解决方案是一种启发式方法:有时它有帮助,有时它没有,而且它肯定没有' t 改进算法的理论(大哦符号)运行时间

于 2010-02-25T13:29:59.833 回答
2

我认为启发式更像是人工智能中基于学习的模型中使用的约束,因为未来的解决方案状态难以预测。

但是,在阅读上述答案后,我的疑问是“如何使用随机优化技术成功应用启发式算法?或者当与随机优化一起使用时,它们能否作为成熟的算法发挥作用?”

http://en.wikipedia.org/wiki/Stochastic_optimization

于 2011-01-26T18:03:35.140 回答
2

我读过的最好的解释之一来自伟大的书Code Complete,我现在引用它:

启发式是一种帮助您寻找答案的技术。它的结果是偶然的,因为启发式只告诉你如何看,而不是找到什么。它没有告诉您如何从 A 点直接到达 B 点;它甚至可能不知道 A 点和 B 点在哪里。实际上,启发式算法是小丑服中的一种算法。它更难以预测,更有趣,而且没有 30 天退款保证。

以下是开车去某人家的算法: 沿 167 号高速公路向南行驶至 Puy-allup。从 South Hill Mall 出口驶出,上山行驶 4.5 英里。在杂货店旁的红绿灯处右转,然后在第一个左转。在 714 North Cedar 转入左侧大型棕褐色房屋的车道。

这是到达某人家的启发式方法:找到我们寄给您的最后一封信。驱车前往回信地址所在的小镇。到了城里,问问别人我们家在哪里。每个人都认识我们——有人会很乐意为您提供帮助。如果您找不到任何人,请使用公用电话给我们打电话,我们会来接您。

算法和启发式算法之间的区别是微妙的,并且这两个术语有些重叠。就本书而言,两者之间的主要区别在于解决方案的间接级别。算法直接为您提供说明。启发式告诉您如何为自己发现指令,或者至少在哪里寻找它们。

于 2012-05-04T13:23:59.103 回答
0

他们找到了一个次优的解决方案,而对找到的解决方案的质量没有任何保证,很明显,启发式仅多项式的发展是有意义的。这些方法的应用适用于解决现实世界的问题或从计算的角度来看如此尴尬的大型问题,以至于对于它们来说,甚至没有一种算法能够在多项式时间内找到近似解。

于 2011-01-26T18:17:10.983 回答