启发式和算法之间有啥区别?
Posted
技术标签:
【中文标题】启发式和算法之间有啥区别?【英文标题】:What is the difference between a heuristic and an algorithm?启发式和算法之间有什么区别? 【发布时间】:2011-01-21 00:15:55 【问题描述】:启发式和算法有什么区别?
【问题讨论】:
见en.wikipedia.org/wiki/Heuristic_algorithm 如果您将启发式算法视为一种树形结构,我想您可以将其称为特殊目的算法。 启发式算法是一种(可证明)不起作用的算法。 【参考方案1】:其实我不认为他们之间有很多共同点。一些算法在其逻辑中使用启发式(通常是为了减少计算或获得更快的结果)。通常在所谓的贪心算法中使用启发式算法。
启发式是我们认为可以很好地使用的一些“知识”,以便在我们的算法中获得最佳选择(何时应该做出选择)。例如......国际象棋中的启发式可能是(如果可以的话,总是选择对手的皇后,因为你知道这是更强的数字)。启发式并不能保证你会得到正确的答案,但是(如果假设是正确的)通常会在更短的时间内得到接近最佳的答案。
【讨论】:
【参考方案2】: 算法通常具有确定性,并被证明可以产生最佳结果 启发式没有正确性证明,通常涉及随机元素,并且可能不会产生最佳结果。对于许多没有找到最佳解决方案的有效算法已知的问题,采用启发式方法可以非常快速地产生接近最佳的结果。
有一些重叠:“遗传算法”是一个公认的术语,但严格来说,这些是启发式的,而不是算法。
【讨论】:
我不会说算法被证明可以产生最佳结果:这取决于算法针对哪个问题。 产生最佳结果并不是算法的基本质量,它是精确性,即精确的结果,而启发式为您提供近似结果。【参考方案3】:简而言之,启发式是“有根据的猜测”。***很好地解释了它。最后采用“普遍接受”的方法作为指定问题的最优解。
启发式是一个形容词 基于经验的技术有助于 在解决问题、学习和 发现。使用启发式方法 迅速找到一个解决方案 希望接近最好的 答案或“最佳解决方案”。 启发式是“经验法则”, 有根据的猜测,直觉的判断 或者只是常识。启发式是 解决问题的一般方法。 Heuristics 作为名词是另一个名字 用于启发式方法。
更准确地说,启发式 代表易于使用的策略 可访问,虽然应用松散, 控制问题解决的信息 在人类和机器中。
虽然算法是一种包含用于解决问题的有限指令集的方法。该方法已在数学或科学上被证明可以解决该问题。有形式化的方法和证明。
启发式算法是一种能够产生 一个问题的可接受的解决方案 很多实际场景,在 一般启发式的时尚,但是 没有正式证明的 它的正确性。
【讨论】:
【参考方案4】:算法是一组明确定义的解决问题的指令,启发式方法涉及利用学习和发现的方法来获得解决方案。
因此,如果您知道如何解决问题,请使用算法。如果您需要开发解决方案,那就是启发式方法。
【讨论】:
【参考方案5】:启发式通常是一种优化或策略,通常可以提供足够好的答案,但并不总是也很少是最佳答案。例如,如果你想用蛮力解决旅行商问题,一旦它的成本超过当前最佳解决方案的成本,就放弃部分解决方案是一种启发式方法:有时它有帮助,有时它没有,而且它肯定没有t 提高算法的理论(大哦符号)运行时间
【讨论】:
【参考方案6】:启发式是算法,因此从这个意义上说没有算法,但是,启发式采用“猜测”方法来解决问题,产生“足够好”的答案,而不是找到“可能的最佳”解决方案。
一个很好的例子是你有一个非常困难(阅读 NP 完全)的问题,你想要一个解决方案,但没有时间解决它,所以必须使用基于启发式算法的足够好的解决方案,例如使用遗传算法找到旅行商问题的解决方案。
【讨论】:
【参考方案7】:算法是一些操作的序列,给定一个输入计算一些东西(一个函数)并输出一个结果。
算法可能产生精确或近似值。
它还可以计算一个随机值,该随机值具有接近精确值的高概率。
启发式算法使用对输入值的一些洞察力并计算不精确的值(但可能接近最优值)。 在某些特殊情况下,启发式可以找到精确的解决方案。
【讨论】:
【参考方案8】:算法是对问题的自动解决方案的描述。该算法的作用是精确定义的。该解决方案可能是也可能不是最好的解决方案,但您从一开始就知道您将获得什么样的结果。您使用某种编程语言来实现算法以获取(部分)程序。
现在,有些问题很难解决,您可能无法在可接受的时间内得到可接受的解决方案。在这种情况下,您通常可以通过应用一些任意选择(有根据的猜测)更快地得到一个不太糟糕的解决方案:这是一个启发式。
启发式仍然是一种算法,但它不会探索问题的所有可能状态,或者会从探索最可能的状态开始。
典型的例子来自游戏。在编写国际象棋游戏程序时,您可以想象在某个深度级别尝试所有可能的移动并将某些评估函数应用于棋盘。启发式算法会排除以明显错误动作开始的完整分支。
在某些情况下,您不是在寻找最佳解决方案,而是在寻找适合某种约束的任何解决方案。一个好的启发式方法将有助于在短时间内找到解决方案,但如果唯一的解决方案处于它选择不尝试的状态,也可能无法找到任何解决方案。
【讨论】:
启发式算法的另一个常见用途是病毒检测,您可能无法确定是否存在病毒,但您可以查找病毒的特定关键属性。 嘿,这是真的,用于破解程序 @kriss,所以.. 启发式是一种算法。 @Pacerier:是的。它是一种有助于在特定问题的解决方案空间中导航的算法。您还可以将其视为修改算法以使其实用的策略(元算法)。它仍然是一种算法,所有方法都是,而 Heuristic 绝对是一种方法。【参考方案9】:我认为启发式算法更多是用于人工智能中基于学习的模型的约束,因为未来的解决方案状态难以预测。
但是在阅读上述答案后我的疑问是 “启发式如何使用随机优化技术成功应用?或者当与随机优化一起使用时,它们是否可以作为成熟的算法?”
http://en.wikipedia.org/wiki/Stochastic_optimization
【讨论】:
哎呀!拼写错误应该是“人工智能”【参考方案10】:他们找到了一个次优的解决方案,而对找到的解决方案的质量没有任何保证,很明显,启发式仅多项式的发展是有意义的。这些方法的应用适用于解决现实世界的问题或从计算角度来看非常尴尬的大型问题,以至于它们甚至没有能够在多项式时间内找到近似解的算法。
【讨论】:
【参考方案11】:我读过的最好的解释之一来自伟大的书Code Complete,我现在引用它:
启发式是一种帮助您寻找答案的技术。它的 结果是偶然的,因为启发式只告诉你如何 去寻找,而不是去寻找什么。它没有告诉你如何直接获取 从A点到B点;它甚至可能不知道 A 点和 B点是。实际上,启发式算法是小丑服中的一种算法。 它更难预测,更有趣,而且没有 30 天, 退款保证。
这是开车去某人家的算法:走 167 号高速公路 向南到 Puy-allup。在 South Hill Mall 出口下,行驶 4.5 英里 上山。在杂货店旁边的红绿灯处右转,然后 第一个路口左拐。转到大棕褐色房子的车道上 左侧,位于 714 North Cedar。
这是到达某人家的启发式方法:找到最后一个 我们寄给你的信。驱车前往回信地址所在的小镇。什么时候 你到镇上去问问别人我们家在哪里谁都知道 我们——有人会很乐意帮助你的。如果您找不到任何人,请致电我们 用公用电话,我们会来接你的。
算法和启发式之间的区别是微妙的,并且 两个术语有些重叠。就本书而言,主要 两者之间的区别在于间接程度 解决方案。算法直接为您提供说明。一种 启发式告诉你如何为自己发现指令,或者 至少在哪里可以找到它们。
【讨论】:
说算法和启发式算法之间存在差异,就像说鸟和鸡之间存在差异一样。启发式是一种算法。【参考方案12】:算法是要执行的独立的逐步操作集4,通常解释为(计算机或人类)指令的有限序列,以确定解决方案一个问题,例如:是否有从 A 到 B 的路径,或者 A 和 B 之间的最小路径是什么。在后一种情况下,您也可以对“合理接近”的替代解决方案感到满意。
有某些类别的算法,启发式算法就是其中之一。在这种情况下,根据算法的(经过验证的)属性,它属于以下三类之一(注 1):
Exact:该解决方案被证明是输入问题的最佳(或精确解决方案) Approximation:解决方案值的偏差被证明永远不会比某些预定义的界限更远离最优值(例如,永远不会比最优值大 50%) Heuristic:该算法尚未被证明是最优的,也不在最优解的预定义范围内请注意,近似算法也是一种启发式算法,但具有更强的属性,即它输出的解(值)有一个已证明的绑定。
对于某些问题,从来没有人找到一种“有效”的算法来计算最优解(注 2)。其中一个问题是著名的旅行推销员问题。例如,Christophides 针对旅行商问题的算法曾经被称为启发式,因为它没有被证明在最优解的 50% 以内。然而,由于已经证明,Christophides 的算法更准确地称为近似算法。
由于计算机可以做什么的限制,并不总是能够有效地找到可能的最佳解决方案。如果问题中有足够的结构,则可能有一种有效的方法来遍历解空间,即使解空间很大(即在最短路径问题中)。
启发式算法通常用于改进算法的运行时间,方法是添加“专家信息”或“有根据的猜测”来指导搜索方向。在实践中,启发式算法也可以是优化算法的子程序,以确定在哪里首先。
(注 1):此外,算法的特征在于它们是否包含随机或非确定性元素。始终以相同方式执行并产生相同答案的算法称为确定性算法。
(注 2):这称为 P 与 NP 问题,归类为 NP 完全和 NP 困难的问题不太可能有“有效”算法。笔记;正如 @Kriss 在 cmets 中提到的,甚至还有“更糟糕”的问题类型,可能需要指数级的时间或空间来计算。
有几个答案可以回答部分问题。我认为它们不够完整且不够准确,因此决定不编辑@Kriss 接受的答案
【讨论】:
我相信你对算法这个词的定义太严格了。 sequence 这个词的使用是否意味着不平行? Parallell 算法现在很好,甚至很常见。使用神经网络解决问题怎么样?还是约束传播工具?算法?元算法? 读者感觉NP问题越严重。这是不真实的。有真正的难题需要真正糟糕的算法,比如指数算法或更糟。 NP 很特别,因为如果我们有解决方案,检查它很容易且快速,而如果我们还没有解决方案,则很难找到它。很容易检查我们是否有正确的指示走出迷宫,但要找到出口要困难得多。因此,如果我们可以同时(非确定性地)尝试所有可能的解决方案,那么 NP 既容易又困难,解决它会非常简单......但我们不能。 感谢您的反馈!我稍微更新了措辞,并以不同的方式处理它。在我看来,约束传播是一种接近某些事物的技术,但还不是一种描述如何逐步得出约束传播中描述的解决方案的算法。您对 expspace 和“更糟糕”的类别当然是正确的,我也对此添加了注释。顺便说一句:请完整地写出 NP-Complete 和/或 NP-Hard,因为 NP 的子集还包含“有效”可解决的问题,它们不是(推测是)同一类。 当然你是对的我应该写NP-Complete。我的错。 它比我的一位同事命名的要好得多:NP-ness(听起来很糟糕,有点恶心......)以上是关于启发式和算法之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章