在A *搜索中提取路径

时间:2014-03-06 20:44:00

标签: algorithm a-star

我正在尝试使用以下代码实现A *搜索:

void Map::findPath(Robot robot, Model target, vector<Node> nodeList) {
Node targetNode = target.getCurrentNode();
Node startNode = robot.getCurrentNode();

vector<Node> openList;
vector<Node> closedList;
openList.push_back(startNode);
while (!openList.empty()) {
    Node curNode = nodeWithLowestFScore(openList);
    if (curNode.equal(targetNode)) {
        /*cout << "WTF" << endl;
         Node *p = curNode.getParent();
         int i = 0;
         while (!p->equal(startNode)) {
         cout << p->getX() << " " << p->getY() << endl;
         p = p->getParent();
         cout << i++ << endl;
         }*/

        break;
    }

    closedList.push_back(curNode);
    removeFromVector(openList, curNode);
    vector<Node> adjNodes;
    curNode.getWalkableAdjacentNodes(nodeList, adjNodes);
    for (int i = 0; i < adjNodes.size(); i++) {
        if (inVector(closedList, adjNodes[i])) {
            continue;
        }
        if (!inVector(closedList, adjNodes[i])) {
            adjNodes[i].setParent(&curNode);
            cout << "Child: " <<adjNodes[i].getX() << " " << adjNodes[i].getY() << endl;
            cout << "Parent: " << adjNodes[i].getParent()->getX()
                    << " " << adjNodes[i].getParent()->getY() << endl;
            adjNodes[i].setG(curNode.getG() + 1);
            adjNodes[i].setH(adjNodes[i].getDistance(targetNode, 'm'));
            adjNodes[i].setF();
            openList.push_back(adjNodes[i]);
        }
        if (inVector(closedList, adjNodes[i])) {
            if (curNode.getG() + 1 < adjNodes[i].getG()) {
                adjNodes[i].setParent(&curNode);
                adjNodes[i].setG(curNode.getG() + 1);
                adjNodes[i].setF();
            }
        }
    }

}

}

这是此代码的控制台输出(StartP = [x:-7,y:6],EndP = [x:0,y:-2]:

  
      
  1. 儿童:-1 -2
  2.   
  3. 父母:0 -2
  4.   
  5. 儿童:1 -2
  6.   
  7. 父母:0 -2
  8.   
  9. 儿童:-2 -2
  10.   
  11. 父母:-1 -2
  12.   
  13. 儿童:-1 -3
  14.   
  15. 父母:-1 -2
  16.   
  17. 儿童:-3 -2
  18.   
  19. 父母:-2 -2
  20.   
  21. 儿童:-3 -1
  22.   
  23. 父母:-3 -2
  24.   
  25. 儿童:-3 0
  26.   
  27. 父母:-3 -1
  28.   
  29. 儿童:-3 1
  30.   
  31. 父母:-3 0
  32.   
  33. 儿童:-4 0
  34.   
  35. 父母:-3 0
  36.   
  37. 儿童:-5 0
  38.   
  39. 家长:-4 0
  40.   
  41. 儿童:-5 1
  42.   
  43. 家长:-5 0
  44.   
  45. 儿童:-5 -1
  46.   
  47. 家长:-5 0
  48.   
  49. 儿童:-5 2
  50.   
  51. 家长:-5 1
  52.   
  53. 儿童:-5 3
  54.   
  55. 家长:-5 2
  56.   
  57. 儿童:-5 4
  58.   
  59. 家长:-5 3
  60.   
  61. 儿童:-5 5
  62.   
  63. 家长:-5 4
  64.   
  65. 儿童:-6 4
  66.   
  67. 家长:-5 4
  68.   
  69. 儿童:-4 4
  70.   
  71. 家长:-5 4
  72.   
  73. 孩子:-7 4
  74.   
  75. 家长:-6 4
  76.   
  77. 孩子:-8 4
  78.   
  79. 家长:-7 4
  80.   
  81. 儿童:-5 6
  82.   
  83. 家长:-5 5
  84.   
  85. 儿童:-5 7
  86.   
  87. 家长:-5 6
  88.   
  89. 儿童:-4 6
  90.   
  91. 家长:-5 6
  92.   
  93. 儿童:-3 2
  94.   
  95. 家长:-3 1
  96.   
  97. 儿童:-3 3
  98.   
  99. 家长:-3 2
  100.   
  101. 儿童:-2 2
  102.   
  103. 家长:-3 2
  104.   
  105. 儿童:-3 4
  106.   
  107. 家长:-3 3
  108.   
  109. 儿童:-4 4
  110.   
  111. 家长:-3 4
  112.   
  113. 儿童:-2 4
  114.   
  115. 家长:-3 4
  116.   
  117. 儿童:-1 4
  118.   
  119. 家长:-2 4
  120.   
  121. 儿童:-1 2
  122.   
  123. 家长:-2 2
  124.   
  125. 儿童:-3 6
  126.   
  127. 家长:-4 6
  128.   
  129. 儿童:-5 8
  130.   
  131. 家长:-5 7
  132.   
  133. 孩子:-9 4
  134.   
  135. 家长:-8 4
  136.   
  137. 儿童:-5 -2
  138.   
  139. 父母:-5 -1
  140.   
  141. 儿童:-1 -4
  142.   
  143. 父母:-1 -3
  144.   
  145. 孩子:2 -2
  146.   
  147. 父母:1 -2
  148.   
  149. 孩子:3 -2
  150.   
  151. 父母:2 -2
  152.   
  153. 儿童:2 -3
  154.   
  155. 父母:2 -2
  156.   
  157. 儿童:-2 -4
  158.   
  159. 家长:-1 -4
  160.   
  161. 儿童:-3 -4
  162.   
  163. 父母:-2 -4
  164.   
  165. 儿童:-3 -5
  166.   
  167. 父母:-3 -4
  168.   
  169. 儿童:-5 -3
  170.   
  171. 父母:-5 -2
  172.   
  173. 孩子:-9 5
  174.   
  175. 家长:-9 4
  176.   
  177. 孩子:-9 6
  178.   
  179. 家长:-9 5
  180.   
  181. 孩子:-8 6
  182.   
  183. 家长:-9 6
  184.   
  185. 孩子:-7 6
  186.   
  187. 家长:-8 6
  188.   

它有点乱,但我跟着它。它达到了起点。 (-7,6) - &gt; (-8,6) - &gt; (-9,6)......( - 1,-2) - >(0,-2)。

但是,如果我取消注释以“WTF”开头的行并想要追溯它,它只会进入一个无限循环,打印(-7,6),这是我的EndP。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的问题是:adjNodes[i].setParent(&curNode);我只需重新分配一个新节点,将curNode的内容复制到它并将其设置为父节点。算法很好。