启发式算法和算法的区别是什么?

启发式算法和算法的区别是什么?

132004 次浏览

事实上,我不认为他们之间有很多共同点。有些算法在其逻辑中使用启发式(通常是为了进行更少的计算或得到更快的结果)。通常启发式算法用于所谓的贪婪算法。

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

  • 一个算法是典型的确定性和证明产生一个最佳的结果
  • 启发式没有正确性的证据,通常涉及随机因素,可能不会产生最佳结果。

许多问题没有有效的算法来找到最优的解决方案是已知的启发式方法,产生接近最优的结果非常快。

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

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

启发式是形容词 基于经验的技术 在解决问题,学习和 发现。一个启发式的方法被使用 to rapidly come to a solution that is hoped to be close to the best possible answer, or 'optimal solution'. 启发法是“经验法则” 有根据的猜测,直觉的判断 或者仅仅是常识。启发式的是 解决问题的一般方法。 启发式作为名词是另一个名称 启发式方法。

In more precise terms, heuristics 代表容易使用的策略 容易理解,虽然不太适用, 控制问题解决的信息 在人类和机器中。

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

启发式算法 是一种能够生成 解决问题的可接受的方法 许多实际情况,在 一般启发式的方式,但是 for which there is no formal proof of 它的正确性。

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

因此,如果你知道如何解决一个问题,那么使用一个算法。如果你需要开发一个解决方案,那么它的启发式。

启发式通常是一种优化或策略,通常提供了一个足够好的答案,但并不总是,也很少是最好的答案。例如,如果你要用蛮力解决旅行推销员问题,一旦部分解决方案的成本超过了当前最佳解决方案的成本,就放弃它是一种启发式方法: 有时它有帮助,有时它没有,而且它肯定不会提高算法的理论运行时间(big-oh 符号)

Heuristics are algorithms, so in that sense there is none, however, heuristics take a 'guess' approach to problem solving, yielding a 'good enough' answer, rather than finding a 'best possible' solution.

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

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

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

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

A heuristic algorithm uses some insight on input values and computes not exact value (but may be close to optimal). 在某些特殊情况下,启发式可以找到精确的解决方案。

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

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

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

Typical examples are from games. When writing a chess game program you could imagine trying every possible move at some depth level and applying some evaluation function to the board. A heuristic would exclude full branches that begin with obviously bad moves.

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

我认为启发式更多的是一种约束用于基于学习的模型在人工智能,因为未来的解决状态是难以预测的。

但是在阅读以上答案后,我的疑问是 "How would Heuristic can be successfully applied using Stochastic Optimization Techniques? or can they function as full fledged algorithms when used with Stochastic Optimization?"

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

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

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

启发式是一种帮助你寻找答案的技巧 结果受机会的影响,因为启发式只告诉你如何 看,而不是找什么。它不告诉你如何直接得到 从 A 点到 B 点,它甚至不知道 A 点和 实际上,启发式算法就是穿着小丑服的算法。 更难预测,更有趣而且不需要30天, 退款保证。

Here is an algorithm for driving to someone’s house: Take Highway 167 从南山购物中心出口开4.5英里 上山。在杂货店的路灯处右转,然后 在第一个路口左转。拐进马路上那间棕褐色的大房子的车道 左边,北雪松街714号。

这里有一个去别人家的启发: 找到最后一个 我们寄给你的信。开车到镇上的回信地址。什么时候 你到了镇上,问别人我们的房子在哪里,大家都知道 us—someone will be glad to help you. If you can’t find anyone, call us 我们会去接你。

算法和启发式算法之间的区别很微妙 两个术语有些重叠。为了本书的目的, 两者之间的区别在于来自 一个算法直接给你指令 启发式告诉你如何发现自己的指示,或 至少去哪里找他们。

算法是一个自包含的逐步执行的操作集,通常被解释为一个有限的(计算机或人类)指令序列,以确定一个问题的解决方案,例如: 是否存在从 A 到 B 的路径,或者 A 到 B 之间的最小路径是什么。在后一种情况下,您也可以满足于“相当接近”的替代解决方案。

算法有一定的种类,启发式算法就是其中之一。根据这种情况下算法的(已证明的)属性,它可以分为以下三类(注1) :

  • Exact: the solution is proven to be an optimal (or 一模一样 solution) to the input problem
  • 近似 : 证明了解值的偏差从来没有比某个预定义的界更远地偏离最优值(例如,从来没有比最优值大50% 以上)
  • 启发式 : 该算法还没有被证明是最优的,也没有在预定义的最优解的范围内

注意,近似演算法也是启发式的,但是它输出的解决方案(值)有一个被证明的约束,这是一个更强的属性。

对于某些问题,还没有人找到一种“有效”的算法来计算最优解(注2)。其中一个问题是著名的旅行推销员问题。克里斯托弗斯的算法为旅行推销员问题,例如,过去被称为一个 启发式的,因为它没有被证明,它是在50% 的最佳解决方案。然而,由于它已经被证明,克里斯托弗希德的算法被更准确地称为近似演算法。

Due to restrictions on what computers can do, it is not always possible to 有效率 find the 最好的 solution possible. If there is enough structure in a problem, there may be an efficient way to traverse the solution space, even though the solution space is huge (i.e. in the shortest path problem).

启发式算法通常应用于改善算法的运行时间,通过添加“专家信息”或“有根据的猜测”来指导搜索方向。在实践中,启发式算法也可能是最优算法的子程序,用于确定在哪里查看 first

(note 1): Additionally, algorithms are characterised by whether they include random or non-deterministic elements. An algorithm that always executes the same way and produces the same answer, is called deterministic.

(注2) : 这就是所谓的 P vs NP 问题,分类为 NP 完全和 NP 难的问题不太可能有一个“有效的”算法。注意: 正如@Kriss 在评论中提到的,还有更糟糕的类型的问题,可能需要 EXPTIME 或空间来计算。

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