【发布时间】: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