【问题标题】:Parenting in A* Pathfinding algorithm?A* 寻路算法中的育儿?
【发布时间】:2020-09-13 21:45:30
【问题描述】:

所以我试图将 A* 寻路算法实现为 C++ 程序。大部分我都想通了,算法最终找到了结束的方式,但没有在过程中创建其他随机不必要的路径,如下所示:

S 是起始节点,E 是结束节点,p 是路径,X 是要避开的墙。 当我从端节点追溯路径时,通过它的父母,它还包括 作为所有其他节点的父节点,它们不会导致结束,但在技术上更接近,例如 节点 (2, 3)。我的问题是在什么条件下一个节点应该成为另一个节点的父节点?如何确保仅追溯最佳路径?这是递归程序的sn-p 功能:

void Node::RecursiveScan(NodeMap &map) {

    this->ScanAdjacents(map.NodeMapContainer);

    for (auto &adjacentNode : this->AdjacentNodes) {
        cout << "start" << endl;
        cout << this->GetDistanceCost() << " " << this->distanceToEnd << " " << this->GetNodeCoords().first << " , " << this->GetNodeCoords().second << endl;
        if (adjacentNode->GetNodeType() != 1 && adjacentNode->nodeScanned == false) {
            adjacentNode->CalcDistances(map);
            adjacentNode->nodeScanned = true;
            map.ScannedNodes.emplace(adjacentNode);
        }
    }
    for (auto &scannedNode : map.ScannedNodes) { // ScannedNodes is an ordered multiset of shared ptrs (open set)
        if (scannedNode->GetNodeType() == 2 && *map.found == false) {
            *map.found = true;
            map.EndNode->ParentNode.reset(this);
            map.VisitedNodes.emplace(map.EndNode);
            return;
        }
        else if (scannedNode->GetNodeType() == 0 && *map.found == false && scannedNode->nodeVisited == false) {
            scannedNode->ParentNode.reset(this); // Parenting here
            scannedNode->nodeVisited = true;
            map.VisitedNodes.emplace(scannedNode); // VisitedNodes is an ordered multiset of shared ptrs (close set)
            scannedNode->RecursiveScan(map);
        }
}
}

该算法在更简单的直接路径中也可以正常工作:

【问题讨论】:

    标签: c++ artificial-intelligence c++17 path-finding a-star


    【解决方案1】:

    您维持路径成本的运行总和。当您遇到路径成本低于其已包含的节点时,即更新parent。当整个计算完成后,parent 链应该基本上可以让你从目标节点走回起始节点。

    当我过去完成路由算法时,我使用优先级队列来提供“下一个节点”提要,而不是使用任何类型的递归(并将启发式算法应用于优先级分数,以哄骗首选节点先弹出)。

    【讨论】:

    • 路径成本是指 G 成本、F 成本还是 H 成本?
    • 在 f(n) = g(n) + h(n) 的基础上,这将是未应用启发式的“g”成本。 en.wikipedia.org/wiki/A%2A_search_algorithm
    • 另外,优先级队列中的顺序是基于什么?如果两个节点的值相等,你会用什么作为决胜局?
    • 优先队列顺序将是 F 成本。如果您使用 G 成本,它将等同于 Dijkstra。对于优先级队列,我认为两个节点是否相等并不重要,但如果相等,则使用序列号甚至节点地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多