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


Answers:


99

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

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

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

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

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


3
启发式测试的另一个常见用途是病毒检测,在这种情况下您可能不确定是否存在病毒,但是可以查找病毒的特定关键属性。
丹娜·霍尔特

没错,没错,并且可以破解程序
streetparade 2010年

1
@kriss,所以..启发式算法是一种算法。
Pacerier '16

1
@Pacerier:是的。它是一种算法,可帮助您导航特定问题的解决方案空间。您也可以将其视为修改算法以使其实用的策略(元算法)。它仍然是一种算法,所有方法都是如此,启发式绝对是一种方法。
克里斯,

33
  • 算法通常是确定性的,并证明可以产生最佳结果
  • 启发式方法没有正确性的证明,通常涉及随机元素,并且可能不会产生最佳结果。

对于尚无有效算法来找到最佳解决方案的已知问题,许多启发式方法可很快产生接近最优的结果。

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


2
我不会说已经证明一种算法可以产生最佳结果:它取决于哪个问题的算法。
nbro

产生最佳结果并不是算法的本质,而是精确性,即精确的结果,而启发式为您提供近似的结果。
玛丽娜·邓斯特

22

试探性地概括地说是“有根据的猜测”。维基百科很好地解释了这一点。最后,采用“一般接受”方法作为指定问题的最佳解决方案。

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

用更精确的术语来说,启发式方法代表的策略是使用易于访问但宽松的信息来控制人类和机器中的问题解决。

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

启发式算法是一种能够以通用启发式的方式在许多实际情况下为问题提供可接受的解决方案的算法,但尚无形式上证明其正确性的算法。


8

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

有某些类别的算法,其中启发式算法是其中的一种。根据这种情况下算法的(已验证)属性,它可以归为以下三个类别之一(注1):

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

请注意,近似算法也是一种启发式算法,但是具有更强的属性,证明了它输出的解(值)有一定的约束。

对于某些问题,还没有人找到一种能够计算出最佳解的“有效”算法(注2)。这些问题之一是众所周知的旅行商问题。例如,克里斯托弗德斯(Christophides)针对旅行商问题的算法曾被称为启发式算法,因为尚未证明它在最佳解的50%之内。但是,由于已被证明,因此Christophides的算法被更准确地称为近似算法。

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

通过添加“专家信息”或“受过教育的猜测”来指导搜索方向,启发式方法通常用于改善算法的运行时间。在实践中,试探法也可能是最优算法的子例程,以确定首先要看的地方。

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

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

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


我相信您对“算法”一词的定义过于严格。单词序列的使用是否暗示非平行?并行算法很好,甚至在今天也很常见。使用神经网络解决问题呢?还是约束传播工具?算法?元算法
克里斯,2016年

读者感到NP问题更加严重。那是不对的。存在真正困难的问题,需要指数算法或更差的算法来解决。NP之所以特别,是因为如果我们有一个解决方案,它可以轻松,快速地进行检查,而如果我们还没有解决方案,则很难找到它。很容易检查我们是否有正确的说明走出迷宫,找到出口要困难得多。因此,如果我们能够同时(非确定性地)尝试所有可能的解决方案,那么NP既简单又困难,但解决起来非常简单……但是我们不能。
kriss

感谢您的反馈!我已经稍微更新了措词,并采用了不同的方法。在我看来,约束传播是一种解决问题的技术,但还不是一种描述如何逐步实现约束传播中描述的解决方案的算法。您当然对expspace和“ worse”的类是正确的,我也对此添加了注释。顺便说一句:请完整地写出NP-Complete和/或NP-Hard,因为NP的子集还包含“有效”可解决的问题,这些问题不是(推测是)同一类的。
Joost

当然可以,我应该写NP-Complete。我的错。
kriss

它比我的一位同事所称的更好:NP-ness(听起来很糟糕,有点毛...)
Joost

6

实际上,我认为它们之间没有太多共同点。某些算法在其逻辑中使用试探法(通常减少计算或获得更快的结果)。通常在所谓的贪婪算法中使用启发式算法。

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


4

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

一个很好的例子是您遇到一个非常棘手的问题(需要阅读NP完全问题),但又没有时间解决问题,因此必须使用基于启发式算法的足够好的解决方案,例如使用遗传算法找到旅行商问题的解决方案。


4

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

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

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

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


3

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

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


2

启发式通常是一种优化或策略,通常可以提供足够好的答案,但并非总是且很少会提供最佳答案。例如,如果您要用蛮力解决旅行推销员问题,则在成本超出当前最佳解决方案成本的情况下放弃部分解决方案是一种试探法:有时会有所帮助,而有时则无济于事,而且肯定不会。 t改善了算法的理论(大欧姆表示法)运行时间


2

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

但是,在阅读了以上答案之后,我的疑问是:“如何使用随机优化技术成功地应用启发式技术?或者当与随机优化一起使用时,启发式技术可以用作成熟的算法吗?”

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


哎呀!拼写错误应该是“人工智能”
A_tanA 2011年

2

我读过的最好的解释之一来自于一本很棒的书Code Complete,我现在引用它:

启发式技术是一种可以帮助您寻找答案的技术。其结果受偶然性影响,因为启发式方法只会告诉您外观,而不是查找内容。它并没有告诉您如何直接从A点到达B点;它甚至可能不知道A点和B点在哪里。实际上,启发式是小丑服中的一种算法。它的可预测性更差,更有趣,并且没有30天的退款保证。

这是开车到某人房屋的算法:沿167号高速公路向南行驶至Puy-allup。从南山购物中心(South Hill Mall)出口驶出,然后向山上行驶4.5英里。在杂货店的信号灯处右转,然后在第一个路口左转。转入左侧的大型棕褐色房屋的车道,在北锡达714号。

这是一种去某人家的试探法:找到我们寄给您的最后一封信。开车返回地址的小镇。当您到达城镇时,请问某人我们的房子在哪里。每个人都认识我们-有人会很乐意为您提供帮助。如果您找不到任何人,请通过公用电话给我们打电话,我们会帮助您。

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


声明算法和启发式算法之间存在差异,就像声明鸟与鸡之间存在差异一样。启发式算法是一种算法。
Joost

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.