提问人:Bickfrog 提问时间:11/18/2023 最后编辑:Bickfrog 更新时间:11/18/2023 访问量:48
使用 A* 搜索算法解决忒修斯和牛头怪的谜题
Using the A* search algorithm to solve Theseus and the Minotaur puzzles
问:
我最近看了这个视频,它使用 BFS 搜索算法解决了忒修斯和牛头怪的难题。如果你不熟悉它,这是一个谜题,忒修斯和牛头怪被放在一个瓷砖迷宫里,忒修斯必须在不被牛头怪抓住的情况下逃脱。每忒修斯移动一个格,牛头怪就会移动两次。然而,牛头怪的行为是这样的,它只能直接向忒修斯移动,而且它总是会尝试水平移动,然后再尝试垂直移动。因此,可以利用这一点来逃离迷宫。如果您有兴趣尝试玩它,可以在此处找到该游戏的一个很好的实现。
我现在尝试在 Kotlin 中实现我自己的求解器,但使用 A* 算法而不是 BFS。但是,我在这样做时遇到了麻烦,我不确定为什么我的代码不起作用。与传统的 A* 算法不同,其中有一个存储代理位置的节点对象,我有一个存储忒修斯和牛头怪位置的状态对象。然后,我使用一系列辅助函数来确定忒修斯和牛头怪的下一个可能位置,这样忒修斯就不会撞到墙上、迷宫里或牛头怪(函数 getNextStates)。从那里开始,我使用一个非常传统的 A* 算法实现,该算法仅考虑 Theseus 的位置(函数 aStar),并使用辅助函数根据 Theseus 的位置从目标计算启发式。
答:
2赞
btilly
11/18/2023
#1
这是我看到的错误。
- 忒修斯迫不及待地在你的求解器中。他站在原地是有效的。也就是说,您需要移动.
0 to 0
- 牛头怪可以在求解器中的目标处抓住忒修斯。但是在游戏中,如果忒修斯达到目标,即使牛头怪可以追上,他也会获胜。所以在,不要失去牛头怪在目标处抓住忒修斯的状态。
getNextStates
- 你缺少墙壁。游戏中有牛头怪和忒修斯无法穿过的墙壁。你需要一个代表,让你注意到你不仅需要合法的开始和结束位置,你还需要没有穿过一堵墙。
- 你需要是国家的分数,而不是忒修斯所在位置的分数。游戏中的获胜路径是 。(L = 左,R = 右,U = 向上,D = 向下,W = 等待)忒修斯在困住牛头怪后需要被允许回溯他的路径。这不是一个重复的立场,因为牛头怪被困住了很重要。
gScore
lddrdduuluuuuurrrrr
评论
0赞
Bickfrog
11/18/2023
你关于回溯的评论救了我!!我用忒修斯的位置作为钥匙,这不允许他回去,因为这没有考虑牛头怪的位置。我通过使用“current”作为 gScore 键而不是 current.theseusPos 来修复它。谢谢:)
评论