关于算法:启发式的具体例子

concrete examples of heuristics

启发式的具体例子有哪些(例如α-β修剪,例如:tic-tac-toe以及它在那里的应用)。我已经看到一个关于什么是启发式的回答问题,但是我仍然不知道它在哪里使用估计。你能给我一个启发式方法的具体例子吗?


Warnsdorff规则是一种启发式规则,但A*搜索算法不是,顾名思义,它是一种不依赖问题的搜索算法。启发式是。例如:您可以使用A*(如果实现正确)来解决15个难题,并找到走出迷宫的最短方法,但使用的启发式方法会有所不同。有了这15个拼图,你的启发式算法可能会有多少个图块不合适:解决这个拼图所需的移动次数总是大于或等于启发式算法。

为了走出迷宫,你可以利用曼哈顿的距离到达你知道的迷宫外的一个点作为你的启发式。曼哈顿距离在类似游戏的问题中被广泛使用,因为它是达到目标所需的水平和垂直的"步数"。

1
Manhattan distance = abs(x2-x1) + abs(y2-y1)

很容易看出,在最好的情况下(没有墙),这将是准确的距离目标,在其他情况下,你将需要更多。这一点很重要:您的启发式必须是乐观的(可接受的启发式),以便您的搜索算法是最佳的。它也必须是一致的。但是,在一些应用程序中(例如具有非常大的地图的游戏),您使用不可接受的启发式方法,因为次优解就足够了。

启发式只是对实际成本的一种近似(如果允许,总是低于实际成本)。近似值越高,搜索算法需要探索的状态就越少。但是更好的近似通常意味着更多的计算时间,所以你必须找到一个折衷的解决方案。


最具示范性的是启发式算法在知情搜索算法中的应用,如A-Star。对于现实的问题,您通常有很大的搜索空间,这使得检查它的每个部分是不可行的。为了避免这种情况,即首先尝试搜索空间中最有前途的部分,您使用启发式方法。一个启发式的方法会给你一个关于后续搜索步骤有多好的估计。你将选择最有前途的下一步,即最好的第一步。例如,如果要搜索两个城市之间的路径(即顶点,由一组道路连接,即边缘,形成图表),您可能希望选择到目标的直线距离作为启发式,以确定首先访问哪个城市(并查看它是否是目标城市)。

启发式应该具有与搜索空间度量相似的属性,它们通常应该是乐观的,但这是另一回事。提供一个启发式的问题,结果是有效的,这是副作用免费,是另一个问题…

对于一个不同的启发式方法的应用,用来寻找穿过给定迷宫的路径,也可以看看这个答案。


一个具体的例子:我一直在为游戏jt的块做解算器,它大致相当于同一个游戏。该算法对所有可能的命中进行广度优先搜索,存储值,并执行到下一层。问题是可能的命中数很快就会失控(每场比赛估计有10e30个位置),所以我需要在每一回合中删掉位置列表,只取其中的"最佳"位置。

现在,"最佳"位置的定义是相当模糊的:它们是期望得到最好的最终分数的位置,但没有什么是确定的。启发式方法来了。我试过其中一些:

  • 按目前获得的分数对职位进行排序
  • 通过X深度搜索获得的最佳分数提高分数
  • 根据使用瓷砖数量、颜色和邻近度的复杂公式提高分数
  • 通过调整参数并查看它们的执行情况来改进最后的启发式方法
  • 等。。。

最后一个启发式算法可能会导致蚂蚁行军优化:有六个参数可以从0调整到1,优化器可以找到这些参数的最佳组合。目前,我只是手动改进了其中一些。

第二个启发式方法很有趣:它可以通过全深度的第一次搜索得到最优的分数,但是这样的目标当然是不可能的,因为它会花费太多的时间。一般来说,增加x会带来更好的启发式效果,但会大大增加计算时间。

这里是一些启发式的例子。任何事情都可以是启发式的,只要它能帮助你的算法更好地执行,这就是为什么它们如此难以理解:它们不是确定性的。启发式的另一个观点是:它们应该导致真实事物的快速而肮脏的结果,所以在它们的执行时间和准确性之间存在着一种权衡。


你的问题让我很感兴趣,因为我在学习过程中也听说过启发式方法,但从来没有看到它的应用程序,我在谷歌上搜索了一下,发现了这个问题:http://www.predictia.es/blog/aco-search

该代码模拟了一种"蚁群优化"算法,通过一个网站进行搜索。"蚂蚁"是指通过网站进行搜索的工作人员,有些人会随机搜索,有些人会按照之前确定的"最佳路径"进行搜索。


最初的问题要求给出具体的启发式示例。

其中一些具体的例子已经给出。另一个是15个拼图中错位瓷砖的数量或其改进,曼哈顿距离,基于错位瓷砖。

前面的一个答案也声称启发式算法总是依赖于问题,而算法是独立于问题的。当然,也有依赖于问题的算法(例如,对于每个问题,你只需给出一个立即解决这个问题的算法,例如,已知河内任何塔问题的最佳策略)也有独立于问题的启发式方法!

因此,也有不同类型的问题独立启发式。因此,在某种程度上,每一个这样的启发式都可以被视为一个具体的启发式例子,而不是针对一个特定的问题,比如15个难题。(从计划中获得的与问题无关的启发式示例是FF启发式或添加启发式。)

这些独立于问题的启发式方法基于一般描述语言,然后执行问题松弛。也就是说,问题放松只基于问题描述的语法(当然,还有它的底层语义),而不知道它代表什么。如果您对此感兴趣,您应该熟悉"规划",更具体地说,应该熟悉"规划作为启发式搜索"。我还想提到,这些启发式方法虽然独立于问题,但当然依赖于问题描述语言。(例如,我前面提到的启发式方法是针对"规划问题"的,甚至对于规划来说,也有不同种类的启发式方法的不同子问题类。)


几个具体的例子:为了解决骑士之旅的问题,我们可以使用Warnsdorff规则——一种启发式的方法。或者对于解决15个难题,一个可能的启发式算法是A*搜索算法。