47 #define USE_FSA_MEMORY 0 78 Node() : parent(0), child(0), g(0.0f), h(0.0f), f(0.0f) {}
93 : m_State(SEARCH_STATE_NOT_INITIALISED), m_Steps(0), m_Start(NULL), m_Goal(NULL),
94 m_CurrentSolutionNode(NULL),
96 m_FixedSizeAllocator(MaxNodes),
98 m_AllocateNodeCount(0), m_CancelRequest(false)
107 m_CancelRequest =
false;
109 m_Start = AllocateNode();
110 m_Goal = AllocateNode();
112 assert((m_Start != NULL && m_Goal != NULL));
114 m_Start->m_UserState = Start;
115 m_Goal->m_UserState = Goal;
117 m_State = SEARCH_STATE_SEARCHING;
123 m_Start->h = m_Start->m_UserState.GoalDistanceEstimate(m_Goal->m_UserState);
124 m_Start->f = m_Start->g + m_Start->h;
129 m_OpenList.push_back(m_Start);
132 push_heap(m_OpenList.begin(), m_OpenList.end(),
HeapCompare_f());
142 assert((m_State > SEARCH_STATE_NOT_INITIALISED) && (m_State < SEARCH_STATE_INVALID));
145 if ((m_State == SEARCH_STATE_SUCCEEDED) || (m_State == SEARCH_STATE_FAILED)) {
152 if (m_OpenList.empty() || m_CancelRequest) {
154 m_State = SEARCH_STATE_FAILED;
162 Node *n = m_OpenList.front();
163 pop_heap(m_OpenList.begin(), m_OpenList.end(),
HeapCompare_f());
164 m_OpenList.pop_back();
174 if (
false == n->
m_UserState.IsSameState(m_Start->m_UserState)) {
178 Node *nodeChild = m_Goal;
182 nodeParent->
child = nodeChild;
184 nodeChild = nodeParent;
185 nodeParent = nodeParent->
parent;
187 }
while (nodeChild != m_Start);
193 m_State = SEARCH_STATE_SUCCEEDED;
202 m_Successors.clear();
209 typename vector<Node *>::iterator successor;
212 for (successor = m_Successors.begin(); successor != m_Successors.end(); ++successor) {
213 FreeNode((*successor));
216 m_Successors.clear();
221 m_State = SEARCH_STATE_OUT_OF_MEMORY;
226 for (
typename vector<Node *>::iterator successor = m_Successors.begin();
227 successor != m_Successors.end(); ++successor) {
229 float newg = n->
g + n->
m_UserState.GetCost((*successor)->m_UserState);
237 typename vector<Node *>::iterator openlist_result;
239 for (openlist_result = m_OpenList.begin(); openlist_result != m_OpenList.end();
241 if ((*openlist_result)->m_UserState.IsSameState((*successor)->m_UserState)) {
246 if (openlist_result != m_OpenList.end()) {
249 if ((*openlist_result)->g <= newg) {
250 FreeNode((*successor));
257 typename vector<Node *>::iterator closedlist_result;
259 for (closedlist_result = m_ClosedList.begin(); closedlist_result != m_ClosedList.end();
260 ++closedlist_result) {
261 if ((*closedlist_result)->m_UserState.IsSameState((*successor)->m_UserState)) {
266 if (closedlist_result != m_ClosedList.end()) {
269 if ((*closedlist_result)->g <= newg) {
271 FreeNode((*successor));
280 (*successor)->parent = n;
281 (*successor)->
g = newg;
282 (*successor)->h = (*successor)->m_UserState.GoalDistanceEstimate(m_Goal->m_UserState);
283 (*successor)->f = (*successor)->g + (*successor)->h;
287 if (closedlist_result != m_ClosedList.end()) {
289 FreeNode((*closedlist_result));
290 m_ClosedList.erase(closedlist_result);
300 if (openlist_result != m_OpenList.end()) {
301 FreeNode((*openlist_result));
302 m_OpenList.erase(openlist_result);
308 make_heap(m_OpenList.begin(), m_OpenList.end(),
HeapCompare_f());
312 m_OpenList.push_back((*successor));
315 push_heap(m_OpenList.begin(), m_OpenList.end(),
HeapCompare_f());
320 m_ClosedList.push_back(n);
331 Node *node = AllocateNode();
336 m_Successors.push_back(node);
351 if (m_Start->child) {
359 }
while (n != m_Goal);
376 m_CurrentSolutionNode = m_Start;
378 return &m_Start->m_UserState;
387 if (m_CurrentSolutionNode) {
388 if (m_CurrentSolutionNode->child) {
389 Node *child = m_CurrentSolutionNode->
child;
391 m_CurrentSolutionNode = m_CurrentSolutionNode->
child;
403 m_CurrentSolutionNode = m_Goal;
405 return &m_Goal->m_UserState;
414 if (m_CurrentSolutionNode) {
415 if (m_CurrentSolutionNode->parent) {
418 m_CurrentSolutionNode = m_CurrentSolutionNode->
parent;
433 return GetOpenListStart(f, g, h);
438 iterDbgOpen = m_OpenList.begin();
439 if (iterDbgOpen != m_OpenList.end()) {
440 f = (*iterDbgOpen)->f;
441 g = (*iterDbgOpen)->g;
442 h = (*iterDbgOpen)->h;
443 return &(*iterDbgOpen)->m_UserState;
452 return GetOpenListNext(f, g, h);
458 if (iterDbgOpen != m_OpenList.end()) {
459 f = (*iterDbgOpen)->f;
460 g = (*iterDbgOpen)->g;
461 h = (*iterDbgOpen)->h;
462 return &(*iterDbgOpen)->m_UserState;
471 return GetClosedListStart(f, g, h);
476 iterDbgClosed = m_ClosedList.begin();
477 if (iterDbgClosed != m_ClosedList.end()) {
478 f = (*iterDbgClosed)->f;
479 g = (*iterDbgClosed)->g;
480 h = (*iterDbgClosed)->h;
482 return &(*iterDbgClosed)->m_UserState;
491 return GetClosedListNext(f, g, h);
497 if (iterDbgClosed != m_ClosedList.end()) {
498 f = (*iterDbgClosed)->f;
499 g = (*iterDbgClosed)->g;
500 h = (*iterDbgClosed)->h;
502 return &(*iterDbgClosed)->m_UserState;
514 assert(m_AllocateNodeCount == 0);
524 typename vector<Node *>::iterator iterOpen = m_OpenList.begin();
526 while (iterOpen != m_OpenList.end()) {
527 Node *n = (*iterOpen);
536 typename vector<Node *>::iterator iterClosed;
538 for (iterClosed = m_ClosedList.begin(); iterClosed != m_ClosedList.end(); ++iterClosed) {
539 Node *n = (*iterClosed);
543 m_ClosedList.clear();
556 typename vector<Node *>::iterator iterOpen = m_OpenList.begin();
558 while (iterOpen != m_OpenList.end()) {
559 Node *n = (*iterOpen);
573 typename vector<Node *>::iterator iterClosed;
575 for (iterClosed = m_ClosedList.begin(); iterClosed != m_ClosedList.end(); ++iterClosed) {
576 Node *n = (*iterClosed);
584 m_ClosedList.clear();
594 Node *address = m_FixedSizeAllocator.alloc();
599 m_AllocateNodeCount++;
607 m_AllocateNodeCount--;
612 m_FixedSizeAllocator.free(node);
UserState * GetOpenListStart()
UserState * GetOpenListNext()
UserState * GetSolutionPrev()
bool operator()(const Node *x, const Node *y) const
vector< Node * > m_ClosedList
UserState * GetClosedListStart()
UserState * GetSolutionEnd()
UserState * GetOpenListNext(float &f, float &g, float &h)
UserState * GetClosedListNext(float &f, float &g, float &h)
UserState * GetOpenListStart(float &f, float &g, float &h)
vector< Node * > m_OpenList
vector< Node * > m_Successors
UserState * GetClosedListStart(float &f, float &g, float &h)
UserState * GetClosedListNext()
void SetStartAndGoalStates(UserState &Start, UserState &Goal)
void FreeNode(Node *node)
vector< Node * >::iterator iterDbgOpen
Node * m_CurrentSolutionNode
unsigned int SearchStep()
bool AddSuccessor(UserState &State)
UserState * GetSolutionStart()
UserState * GetSolutionNext()
vector< Node * >::iterator iterDbgClosed