启发式算法和确定性算法有什么区别?
启发式算法和确定性算法有什么区别?
算法是一种描述自动解决问题的方法。算法所做的事情被明确定义了。解决方案可能是最好的,也可能不是最好的,但你从一开始就知道会得到什么样的结果。你使用一些编程语言来实现算法,以得到(部分)程序。
有些问题很难,你可能无法在合理的时间内得到可接受的解决方案。在这种情况下,通过应用一些任意选择(有根据的猜测)通常可以更快地得到一个不错的解决方案:这就是启发式。
启发式仍然是一种算法,但它不会探索问题的所有可能状态,或者会从最有可能的状态开始探索。
典型的例子来自于游戏。当编写国际象棋游戏程序时,你可以想象在某个深度级别上尝试每一种可能的移动并对棋盘应用一些评估函数。启发式将排除以显然错误的移动开头的完整分支。
在某些情况下,你不是在寻找最佳解决方案,而是在寻找符合某些限制条件的任何解决方案。好的启发式能够帮助你在短时间内找到一个解决方案,但也可能在没有尝试的状态中找不到任何解决方案。
许多问题没有已知的有效算法来找到最优解,但有启发式方法可以快速产生接近最优结果。
一些术语存在重叠: "遗传算法" 是一个被接受的术语,但严格来说,它们是启发式算法,而不是算法。
启发式(Heuristic)简而言之就是“经验猜测”。维基百科对此做了很好的解释。最终,一种“普遍认可”的方法被视为特定问题的最佳解决方案。
启发式(Heuristic)是一个形容词,用于描述基于经验的技术,帮助问题解决、学习和发现。启发式方法用于快速得出一种被认为接近最佳可能答案或“最优解”的解决方案。启发式是一种“经验法则”,教育性的猜测,直觉判断或者单纯的常识。启发式是解决问题的通用方式。名词启发式是启发式方法的另一个名称。
更精确地说,启发式代表使用易于获取但适用范围较宽的信息来控制人类和机器的问题解决的策略。
而算法是包含有限指令集的方法,用于解决问题。该方法在数学或科学上已被证明适用于该问题。有正式的方法和证明。
启发式算法是一种能够在许多实际场景下产生可接受解决方案的算法,就像一般的启发式方法一样,但并没有形式化证明其正确性。
算法是一个自包含的操作步骤集,按顺序执行4,通常被解释为(计算机或人类)指令的有限序列,用于确定问题的解决方案,例如:是否有从A到B的路径,或者A和B之间的最短路径是多少。在后一种情况下,您可能也满意于“相对接近”的替代解决方案。
有某些种类的算法,其中启发式算法就是其中之一。根据此算法的(已证明的)属性,它可以分为以下三个类别之一(注1):
请注意,近似算法也是一种启发式算法,但具有更强的属性,即它的解决方案(值)存在已经证明的界限。
对于一些问题,没有人能够找到一个“高效”的算法来计算最优解(注2)。其中一个这样的问题就是著名的旅行商问题。例如,Christophides算法用于旅行商问题,曾经被称为一种启发式算法,因为它没有被证明它可以在最优解的50%以内。然而,自从它被证明后,Christophides算法更准确地被称为近似算法。有几个答案回答了部分问题。我认为它们不够完整和准确,决定不编辑由@Kriss提供的已接受的答案。
算法是一组明确定义的指令,用于解决问题。而启发式方法则利用学习和探索的方法来达到解决问题的目的。
因此,如果您知道如何解决问题,则使用算法。如果您需要开发解决方案,则需要使用启发式方法。
启发式算法是一种算法,因此本质上没有最佳解决方案,但是启发式算法采用“猜测”方法来解决问题,产生“足够好”的答案,而不是找到“最佳可能”的解决方案。
一个很好的例子是,当你想要解决一个非常困难(即NP完全)的问题,但没有时间去解决它时,就必须使用基于启发式算法的足够好的解决方案,例如使用遗传算法来解决旅行商问题。
算法是一系列操作的顺序,给定一个输入计算出某个东西(函数),并输出结果。
算法可能产生精确或近似值。
它也可以计算一个随机值,该值很有可能接近于精确值。
启发式算法利用对输入值的一些见解,并计算出不精确的值(但可能接近最优解)。在某些特殊情况下,启发式方法可以找到精确解。
启发式通常是一种优化或策略,通常提供足够好的答案,但不总是最佳答案。例如,如果您要使用暴力方法解决旅行商问题,则在成本超过当前最佳解决方案的情况下丢弃部分解决方案是一种启发式:有时它有帮助,有时它没有,而且肯定不能改善算法的理论(大O符号)运行时间。