Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rubik'的启发式函数;人工智能A*算法中的s立方体 所以我尝试用C++算法来求解魔方。我已经尝试了迭代深化搜索(IDS)并得到了正确的结果,但现在我被困在一个*算法上。 我做了一些研究,发现立方体的角和边的3D曼哈顿距离是开发a*启发式的方法之一,但我不知道它将如何编码。 你们能帮助或指导我如何开发定义上允许的函数吗_C++_Artificial Intelligence_A Star_Heuristics_Rubiks Cube - Fatal编程技术网

Rubik'的启发式函数;人工智能A*算法中的s立方体 所以我尝试用C++算法来求解魔方。我已经尝试了迭代深化搜索(IDS)并得到了正确的结果,但现在我被困在一个*算法上。 我做了一些研究,发现立方体的角和边的3D曼哈顿距离是开发a*启发式的方法之一,但我不知道它将如何编码。 你们能帮助或指导我如何开发定义上允许的函数吗

Rubik'的启发式函数;人工智能A*算法中的s立方体 所以我尝试用C++算法来求解魔方。我已经尝试了迭代深化搜索(IDS)并得到了正确的结果,但现在我被困在一个*算法上。 我做了一些研究,发现立方体的角和边的3D曼哈顿距离是开发a*启发式的方法之一,但我不知道它将如何编码。 你们能帮助或指导我如何开发定义上允许的函数吗,c++,artificial-intelligence,a-star,heuristics,rubiks-cube,C++,Artificial Intelligence,A Star,Heuristics,Rubiks Cube,我正在寻找任何和所有的建议,可以帮助我走出这个洞。谢谢。IDA*是解决魔方问题的最佳算法之一,因为状态空间很大,如果进行适当的移动修剪,不会有太多重复。为了得到一个有效的解算器,你需要移动修剪和良好的启发式。通常每个面有三个移动-向前/向后90度和180度。有6个面,有18个动作 简单移动修剪:如果你通过保留一个历史移动来对你的移动进行一些简单的修剪,你可以将魔方的分支因子从18缩小到15左右。因为任何一次移动都可以将一个面移动到任何配置中,所以您不应该连续移动同一个面两次。第一次移动后,将有5

我正在寻找任何和所有的建议,可以帮助我走出这个洞。谢谢。

IDA*是解决魔方问题的最佳算法之一,因为状态空间很大,如果进行适当的移动修剪,不会有太多重复。为了得到一个有效的解算器,你需要移动修剪和良好的启发式。通常每个面有三个移动-向前/向后90度和180度。有6个面,有18个动作

  • 简单移动修剪:如果你通过保留一个历史移动来对你的移动进行一些简单的修剪,你可以将魔方的分支因子从18缩小到15左右。因为任何一次移动都可以将一个面移动到任何配置中,所以您不应该连续移动同一个面两次。第一次移动后,将有5个面,每个面移动3次=每个步骤移动15次

  • 高级移动修剪:让其中三个面为“第一”面,其中三个面为“第二”面,其中第二个面与第一个面相对。这里的规则是,移动第一个面后,可以移动任何其他面-因此将有15个移动。但是,移动第二个面后,不能再次移动同一个面或相反的第一个面。在这种情况下,分支因子是12。总的分支因子大约是13

  • 启发式:(PDB)对于魔方来说是很好的启发式。例如,您要做的是忽略边,然后彻底解决所有角点,将结果存储在哈希表中。(使用一个完美的散列函数,然后将有一个独特的紧凑映射,这是非常高效的内存。)有8800万个组合和少于16个值,您可以将其存储在44MB的内存中。当您需要一个状态的启发式时,您只需使用hash函数在表中查找拐角配置,其中包含解决该配置所需的移动总数。对于这个问题,这是一个可接受的(且一致的)启发。除此之外,您可能还需要进行边缘处理,但12边缘PDB需要500GB的内存来存储,可能无法放入内存中。因此,您可以创建边的子集。您还可以使用立方体对称和许多其他技巧来获得更好的启发式值。但是,通过一个好的并行IDA*实现和一些大型PDB,您可以优化地解决random Rubik的立方体实例

  • 有很多关于这个主题的研究论文——我建议使用谷歌学者在线查找

    如果您想从更简单的东西开始,下面是如何实现“更简单”的启发式:

  • 对于立方体中的每个角/边,计算其自身到达目标位置/方向所需的移动次数。把所有的方块加起来

  • 由于立方体面的每一圈移动4个角和4条边,因此从第一步开始取数字并将其除以8。这是一个可接受的启发式问题


  • 如果忽略方向,则每个立方体最多需要两次移动才能到达其目标位置,这意味着您的最终启发式将少于2次。考虑方向只会稍微提高这一点。因此,这种方法在实践中不会特别有效。

    谢谢您的回复。我很感激,但我是人工智能的初学者,所以我只是想在开发启发式函数时寻求初学者的帮助。@DanishAli减少分支因子比开发类似曼哈顿距离的弱启发式版本更有用。@DanishAli添加了一个关于类似曼哈顿启发式的完整性描述。