저는 Astar 알고리즘의 Justin Heyes-Jones 구현을 사용합니다. 내 휴리스틱 함수는 유클리드 거리입니다. 첨부 된 도면 (품질이 좋지 않다면)에서 특정 상황을 설명합니다. 즉, 노드 1에서 노드 2로 이동한다고 가정합니다. 최단 경로는 노드 a-b-c-d-e를 통과합니다. 그러나 유클리드 발견 적 방법을 사용한 단계별 Astar는 다음과 같은 노드를 통해 우리에게 방법을 제공 할 것입니다 : a - b '- c'- d '- e 그리고 나는 이것이 일어나는 이유를 이해합니다. 하지만 최단 경로를 돌려 주려면 어떻게해야합니까?!어떻게 A * 알고리즘을 최단 경로로 만들 수 있습니까? (그림을 동봉하십시오)
false shortest path finding by the astar
실제 도로지도를 가져 오기위한 코드 :
#include "search.h"
class ArcList;
class MapNode
{
public:
int x, y; // ���������� ����
MapNode();
MapNode(int X, int Y);
float Get_h(const MapNode & Goal_node);
bool GetNeighbours(AStarSearch<MapNode> *astarsearch, MapNode *parent_node);
bool IsSamePosition(const MapNode &rhs);
void PrintNodeInfo() const;
bool operator == (const MapNode & other) const;
void setArcList(ArcList * list);
private:
ArcList * list;
};
class Arc
{
public:
MapNode A1;
MapNode B1;
Arc(const MapNode & a, const MapNode & b);
};
class ArcList
{
public:
void setArcs(const std::vector<Arc> & arcs);
void addArc(const Arc & arc);
size_t size() const;
bool addNeighbours(AStarSearch<MapNode> * astarsearch, const MapNode & neighbour);
private :
std::vector<Arc> arcs;
};
std::vector <MapNode> FindPath(const MapNode & StartNode, const MapNode & GoalNode)
{
AStarSearch<MapNode> astarsearch;
astarsearch.SetStartAndGoalStates(StartNode, GoalNode);
unsigned int SearchState;
unsigned int SearchSteps = 0;
do
{
if (SearchSteps % 100 == 0)
std::cout << "making step " << SearchSteps << endl;
SearchState = astarsearch.SearchStep();
SearchSteps++;
}
while (SearchState == AStarSearch<MapNode>::SEARCH_STATE_SEARCHING);
std::vector<MapNode> S;
if (SearchState == AStarSearch<MapNode>::SEARCH_STATE_SUCCEEDED)
{
int steps = 0;
for (MapNode * node = astarsearch.GetSolutionStart(); node != 0; node = astarsearch.GetSolutionNext())
{
S.push_back(*node);
// node->PrintNodeInfo();
}
astarsearch.FreeSolutionNodes();
}
else if (SearchState == AStarSearch<MapNode>::SEARCH_STATE_FAILED)
{
throw " SEARCH_FAILED ";
}
return S;
}
기능 FindPath 나에게 결과 노드의 벡터를 제공합니다.
bool ArcList::addNeighbours(AStarSearch<MapNode> * astarsearch, const MapNode & target)
{
assert(astarsearch != 0);
bool found = false;
for (size_t i = 0; i < arcs.size(); i++)
{
Arc arc = arcs.at(i);
if (arc.A1 == target)
{
found = true;
astarsearch->AddSuccessor(arc.B1);
}
else if (arc.B1 == target)
{
found = true;
astarsearch->AddSuccessor(arc.A1);
}
}
return found;
}
및 get_h 방법 : -이 어떤 기계를 저장하기위한 것입니다 내가 정확한없는 거리 (여기 제곱근없이 복용이) 알고
float MapNode::Get_h(const MapNode & Goal_node)
{
float dx = x - Goal_node.x;
float dy = y - Goal_node.y;
return (dx * dx + dy * dy);
}
여기
는 addNeighbours 방법입니다 평가할 때 자원.
우리는 당신의 코드는 우리가 잘못 무슨 일이 일어나고 있는지 알 수 볼 수 있을까요? –
호 길이는 제곱 거리입니까? – Laky
Yap, 그러나 나는 그것을 정말로 사용하지 않는다. 입력 값이 호의 목록 인 모든 것을 봅니다. 내가 노드에 대한 정보를 얻는 이웃과 거기에서 오는 이웃. 호 길이를 계산할 필요가 없습니다. 제가 건네주는 모든 노드에 g (x) 함수가 있습니다. 내가 틀렸다면 제발 바로 잡으세요. – Starter