【问题标题】:Using A* algorithm for soving sliding puzzle and N Queens?使用 A* 算法解决滑动谜题和 N 个皇后?
【发布时间】:2014-09-27 10:44:39
【问题描述】:

我已经成功地在 NxM 上的网格上实现了 A* 路径查找。

我了解 A* 的所有基础知识,我想知道如何针对上述问题实现相同的算法。

谁能指导我启发式函数 h 和 G 分数在这些问题中与什么相关以及如何进行。

--例如在网格搜索中,我们将邻居添加到打开列表中,然后搜索最低 F 分数,并将其添加到关闭列表中。

要遵循相同的算法来解决 NQueens 和滑动谜题会做些什么?

谢谢你:)

【问题讨论】:

  • 你有没有弄清楚你的搜索空间是什么以及节点会是什么样子?
  • 嗯,不是吗? O.o 我需要吗?我猜在网格搜索中不需要?
  • 在通过网格进行寻路时,这一点非常明显,您可能在没有意识到这就是您所做的事情的情况下发现了这一点。但是对于 NQueens 和 Sliding Puzzle 来说,这显然与网格中的寻路不同——你所采取的“步骤”不会把你从一个单元格带到下一个单元格,而是把你从一个网格带到另一个网格。相关。
  • 好的,我需要知道什么才能使用 A* 解决这些难题?
  • 好吧,我想我会回答的

标签: algorithm artificial-intelligence a-star n-queens


【解决方案1】:

您需要正确定义转换函数、成本函数和启发式函数。如果您了解 A* 的基础知识,而不是向您解释每个示例,您可能会发现查看 N-Queens problemHipster libraryN-Puzzle problem 的实现很有用。如果您没有用 Java 实现代码,请不要担心,代码足够清晰,可以让您知道如何操作。

希望我的回答对你有帮助。

阿德里安

【讨论】:

  • 非常感谢我使用 heuristics=misplaced tile 在 N-Puzzle 上成功实现了 A*。但我仍然无法弄清楚用于 N-Queens 的启发式方法:(
  • 对于这个问题,我们在库中使用被攻击后的数量作为启发式。看看我们如何计算它in the NQueens class。就是attackedQueens()的方法。
  • 对不起,如果我在这里说什么脱离上下文的话,因为我不习惯 github。但是,如果我没记错的话,您发布的上一个链接包含爬山算法。它不是与 A* 不同,因此不会在 A* 中使用它的启发式方法产生问题吗? O.o
  • 在 N-Queens 的情况下,代价函数是被攻击的 Queens 的数量。您也可以将其用作启发式方法,因为计算起来并不复杂。由于启发式函数和成本函数相同,A* 将找到扩展尽可能少的状态数的最优解。此外,由于启发式与成本相同,因此对算法有效(因为它是可接受且一致的)。
  • 嗯,非常感谢。我现在就试试看:)
【解决方案2】:

A* 是一种适用于图的算法,因此当您使用 A* 解决问题时,该问题必须看起来像一个图。当然,您通常不会实际构建图,它通常是隐式的,但它仍然是图(它有节点,并且节点与邻居有边)。

因此,您必须确定该图中的节点是什么。对于网格上的寻路,节点对应于网格中的位置。

然后,您定义一种(或几种)从节点生成邻居的方法。考虑图,这是一个从节点到一组出边的函数。对于网格中的寻路,这就是您生成可能 4 个相邻位置(或 8 个或其他位置)的地方。基本上,您可以定义可以采取的“步骤”。

这些步骤是有代价的。那不是 G,它只是你增加 G 的值。通常它只是 1。再次以网格中的寻路为例,有时它被定义为 10 代表北/东/南/西一步,12 代表对角线步长(使用易于使用的小整数近似欧几里得距离) .

然后你会找到admissible heuristics(不会高估实际成本的),这在某种程度上就是 A* 的意义所在。没有它,这将是一个愚蠢的搜索,启发式使它有信息,并且它必须是可接受的以确保最优性。找到同样好的(即相当高的)可接受的启发式方法可能很棘手。如果你找到其中的几个,比如函数h0h1,那么你可以选择max(h0, h1),但当然,这只有在它们都不是明确的“赢家”的情况下才有帮助,因为它总是至少和另一个一样高(显然仍然可以接受)。如果明显的赢家,你显然可以只使用那个而忘记另一个。

基本上,这一切都是在 A* 算法中“填补空白”的一种方式,它本身不会根据你用它解决的问题而改变.. 除了一个细节:封闭列表只能是如果启发式是consistent,则使用。所以你仍然会做熟悉的事情,从打开列表中取出 F 分数最低的节点,将其放入最近的列表中,查看其邻居并将它们放入打开列表中,我在这里跳过了很多,但你知道操练。

【讨论】:

  • 好的,我想我已经掌握了窍门。非常感谢。 :)
猜你喜欢
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多