对于学校作业,我必须为高峰时间游戏制作解算器..如果您不熟悉高峰时间..请点击此链接:http://www.puzzles.com/products/rushhour.htm
对于这个求解器,我必须使用A *搜索算法,我在互联网上看了一下,我想我完全理解算法是如何工作的......只是我真的不知道如何实现它解决者..也不应该如何为汽车建立网格..有人可以给我一些提示/帮助吗? 不是一个完整的解决方案..
答案 0 :(得分:4)
为了代表汽车的网格,我只使用一个矩形的单元格数组,其中每个单元格都标有一个整数 - 0表示“空”,每辆车都有一个特定的数字,所以不同的汽车在网格将表现为具有相同编号的连续单元格。
此时,您应该能够编写一个函数来返回给定网格中所有可能的“移动”,其中“移动”是从一个网格状态转换到另一个网格状态 - 您可能不会我需要编码一个更好的移动表示。
要实现A *,你需要一个天真的启发式方法来确定一个移动看起来有多好,所以你知道哪些移动首先尝试。我最初建议,任何将目标车移近目标或使空间更靠近目标车前部的举动可能是更好的候选举动。就像Will A在评论中所说,除非你正在解决一个1000x1000的尖峰时刻板,否则这可能不是什么大问题。
这是我能想到的所有棘手的部分。
答案 1 :(得分:1)
正如mquander或Will已经指出的那样,A *算法可能对您的问题有点过分。
我现在给你一些提示,你可以使用其他算法来解决问题。 我不想解释这些算法是如何工作的,因为你可以在互联网上找到很多好的描述。但是,如果您有疑问,请不要犹豫,问我。
您可以使用一些属于“不知情搜索”的算法。你有广度优先搜索,深度优先搜索,统一成本搜索,深度限制搜索或迭代深化搜索。如果使用广度优先搜索或统一成本搜索,则可能必须处理可用的内存空间问题,因为这些算法具有指数空间复杂度(并且您必须将整个搜索空间保留在内存中)。因此,使用深度优先搜索(空间复杂度O(b * m))对内存更友好,因为如果不包含解决方案,则首先访问的树的左侧部分可以省略。深度限制搜索和迭代加深搜索几乎相同,而在迭代加深搜索中,您可以迭代地增加树的搜索级别。
如果比较时间复杂度(b =树的分支因子,m =树的最大深度,l =深度水平限制,d =解决方案的深度):
广度优先:b ^(d + 1)
统一成本:b ^?深度拳头:乙^ M
深度限制:b ^ l if(l> d)
迭代加深:b ^ d
因此,您可以看到迭代加深或广度优先搜索的效果非常好。深度限制搜索的问题是,如果您的解决方案位于比搜索级别更深的位置,那么您将找不到解决方案。
然后你有所谓的“知情搜索”,例如最佳搜索,贪婪搜索,a *,爬山或模拟退火。简而言之,对于最佳优先搜索,您使用每个节点的评估函数作为“合意性”的估计。贪婪搜索的目标是扩展节点,使您更接近目标。爬山和模拟退火是非常相似。斯图尔特拉塞尔解释了攀登如下(我非常喜欢......):登山算法就像在浓雾中攀登珠穆朗玛峰一样“健忘”。它只是一个循环,不断向增值方向移动。因此,您只需“走”到可以提高评估功能的方向。
我会使用其中一种统一的搜索算法,因为它们非常容易实现(您只需编程树并正确遍历它)。如果您有良好的评估功能,知情搜索通常会更好... 希望能帮到你...