AI益智计划

时间:2016-02-26 18:56:27

标签: c++ search artificial-intelligence depth-first-search state-space

我有一个初始状态的谜题

R R R G R 
R G G R R
R G G R G
R G G R R
R R R B R 

R = RedG = GreenB = Moveable Blank

的位置

和目标状态

R R R R R
R G G G R
R G B G R
R G G G R 
R R R R R

我知道为了移动空白,我必须应用DFS, BFS, A* etc

之类的搜索算法

我知道我必须创建课程:

节点

class Node {
    char board[5][5];
    Node *parent;
};

class Tree {
     Node *root;
 };

Frontier,如Hash Table,用于检测O(1)复杂度中的访问状态。

所以我很困惑,我将如何开始实施这个难题的解决方案。谁能指导我?我可以在空白处应用的操作员是向上,向下,向左,向右。

1 个答案:

答案 0 :(得分:3)

最简单的想法是使用初始状态初始化根节点。然后填充下一层;根据空白空间移动规则编写生成子节点的过程。你在这应该小心;当空白区域位于板的边界时,某些移动将无效。在这种情况下,可以绘制A *算法的草图:将初始状态的距离定义为g(n)。在给定当前状态的情况下,这可以是与初始状态相比放置的不同字母的数量。定义一个启发式h(n),它给出了目标状态的当前距离,这可能是与目标状态相比放置的字母数量。然后在树中的当前位置,尝试选择下一个状态,最小化f(n)= g(n)+ h(n)。我现在无法对此进行深入分析,但我相信这种方法可能比蛮力DFS或BFS方法更有效。