kri*_*iss 94
算法是对问题的自动解决方案的描述.精确定义了算法的作用.解决方案可能是也可能不是最好的解决方案,但您从一开始就知道会得到什么样的结果.您可以使用某种编程语言来实现算法,以获取程序的一部分.
现在,一些问题很难解决,您可能无法在可接受的时间内获得可接受的解决方案.在这种情况下,通过应用一些任意选择(有根据的猜测),你通常可以更快地得到一个不太糟糕的解决方案:这是一种启发式方法.
启发式算法仍然是一种算法,但不会探索问题的所有可能状态,或者将通过探索最可能的算法开始.
典型的例子来自游戏.在编写国际象棋游戏程序时,您可以想象在某个深度级别尝试每个可能的移动并对棋盘应用一些评估功能.启发式会排除以明显不良移动开始的完整分支.
在某些情况下,您不是在寻找最佳解决方案,而是针对任何适合某些约束的解决方案.一个好的启发式方法有助于在短时间内找到解决方案,但如果唯一的解决方案处于它选择不尝试的状态,也可能无法找到任何解决方案.
Mic*_*rdt 32
没有找到最佳解决方案的有效算法的许多问题具有启发式方法,其非常快速地产生接近最优的结果.
有一些重叠:"遗传算法"是一个被接受的术语,但严格来说,那些是启发式算法,而不是算法.
Buh*_*ndi 22
启发式,简而言之就是"受过教育的猜测".维基百科很好地解释了它.最后,采用"一般接受"方法作为指定问题的最佳解决方案.
启发式是基于经验的技术的形容词,有助于解决问题,学习和发现.启发式方法用于快速找到希望接近最佳答案或"最佳解决方案"的解决方案.启发式是"经验法则",有根据的猜测,直观的判断或简单的常识.启发式是解决问题的一般方法.作为名词的启发式是启发式方法的另一个名称.
更准确地说,启发式代表了使用易于访问但易于应用的信息来控制人类和机器中的问题解决的策略.
虽然算法是包含用于解决问题的有限指令集的方法.该方法已经过数学或科学证明,可以解决这个问题.有正式的方法和证据.
启发式算法是一种能够以一般启发式方式在许多实际场景中产生问题的可接受解决方案的算法,但是没有正式证据证明其正确性.
其实我不认为他们之间有很多共同之处.某些算法在其逻辑中使用启发式算法(通常用于减少计算或获得更快的结果).通常在所谓的贪心算法中使用启发式算法.
启发式算法是我们假设使用的一些"知识",以便在我们的算法中获得最佳选择(当应该选择时).例如......国际象棋中的启发式可能是(如果可以的话,总是拿对手的女王,因为你知道这是更强的数字).启发式并不能保证会引导您找到正确的答案,但(如果假设是正确的话)通常会在更短的时间内得到接近最佳的答案.
的算法是一个自包含的一步一步的操作集来执行4,典型地解释为(计算机或人)的指令的有限序列,以确定一个解决问题的办法,例如:是否有从A到一个路径B,或者A和B之间的最小路径是什么.在后一种情况下,您也可以满足于"合理接近"的替代解决方案.
存在某些类别的算法,其中启发式算法是一种.在这种情况下,根据算法的(经过验证的)属性,它属于这三个类别之一(注释1):
请注意,近似算法也是一种启发式算法,但具有更强的属性,它已经证明与其输出的解(值)有关.
对于某些问题,没有人发现过计算最优解的"有效"算法(注2).其中一个问题是众所周知的旅行商问题.例如,Christophides的旅行商问题算法曾经被称为启发式算法,因为它没有被证明它在最优解的50%之内.然而,由于已经证明,Christophides的算法更准确地称为近似算法.
由于对计算机可以执行的操作的限制,并不总是能够有效地找到最佳解决方案.如果问题中存在足够的结构,则可能存在遍历解空间的有效方式,即使解空间很大(即,在最短路径问题中).
启发式算法通常用于改善算法的运行时间,通过添加"专家信息"或"有根据的猜测"来指导搜索方向.在实践中,启发式也可以是最优算法的子例程,以确定首先查看的位置.
(注释1):此外,算法的特征在于它们是否包括随机或非确定性元素.始终以相同方式执行并产生相同答案的算法称为确定性.
(注2):这被称为P vs NP问题,分类为NP-complete和NP-hard的问题不太可能具有"有效"算法.注意; 正如@Kriss在评论中提到的那样,甚至存在"更糟糕"的问题类型,这些问题可能需要指数时间或空间来计算.
有几个答案可以回答部分问题.我认为它们不够完整,不够准确,并决定不编辑@Kriss所接受的答案
启发式算法是算法,因此从这个意义上来说,没有算法,但是,启发式算法采用“猜测”方法来解决问题,产生“足够好”的答案,而不是找到“最佳可能”的解决方案。
一个很好的例子是,您有一个非常困难(读为 NP 完全)的问题,您想要一个解决方案,但没有时间找到它,因此必须使用基于启发式算法的足够好的解决方案,例如使用遗传算法寻找旅行商问题的解决方案。