Skip to content

Commit b345463

Browse files
author
sergiosota
committed
Fix allocated node counter and open/close node linked lists
1 parent 59ecc76 commit b345463

1 file changed

Lines changed: 49 additions & 14 deletions

File tree

‎cpp/stlastar.h‎

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ template <class UserState> class AStarSearch
277277
m_Successors.clear(); // empty vector of successor nodes to n
278278

279279
// free up everything else we allocated
280+
FreeNode( (n) );
280281
FreeAllNodes();
281282

282283
m_State = SEARCH_STATE_OUT_OF_MEMORY;
@@ -352,42 +353,75 @@ template <class UserState> class AStarSearch
352353
(*successor)->h = (*successor)->m_UserState.GoalDistanceEstimate( m_Goal->m_UserState );
353354
(*successor)->f = (*successor)->g + (*successor)->h;
354355

355-
// Remove successor from closed if it was on it
356+
// Successor in closed list
357+
// 1 - Update old version of this node in closed list
358+
// 2 - Move it from closed to open list
359+
// 3 - Sort heap again in open list
356360

357361
if( closedlist_result != m_ClosedList.end() )
358362
{
359-
// remove it from Closed
360-
FreeNode( (*closedlist_result) );
363+
// Update closed node with successor node AStar data
364+
//*(*closedlist_result) = *(*successor);
365+
(*closedlist_result)->parent = (*successor)->parent;
366+
(*closedlist_result)->g = (*successor)->g;
367+
(*closedlist_result)->h = (*successor)->h;
368+
(*closedlist_result)->f = (*successor)->f;
369+
370+
// Free successor node
371+
FreeNode( (*successor) );
372+
373+
// Push closed node into open list
374+
m_OpenList.push_back( (*closedlist_result) );
375+
376+
// Remove closed node from closed list
361377
m_ClosedList.erase( closedlist_result );
362378

379+
// Sort back element into heap
380+
push_heap( m_OpenList.begin(), m_OpenList.end(), HeapCompare_f() );
381+
363382
// Fix thanks to ...
364383
// Greg Douglas <gregdouglasmail@gmail.com>
365384
// who noticed that this code path was incorrect
366385
// Here we have found a new state which is already CLOSED
367386
// anus
368-
387+
369388
}
370389

371-
// Update old version of this node
372-
if( openlist_result != m_OpenList.end() )
373-
{
390+
// Successor in open list
391+
// 1 - Update old version of this node in open list
392+
// 2 - sort heap again in open list
374393

375-
FreeNode( (*openlist_result) );
376-
m_OpenList.erase( openlist_result );
394+
else if( openlist_result != m_OpenList.end() )
395+
{
396+
// Update open node with successor node AStar data
397+
//*(*openlist_result) = *(*successor);
398+
(*openlist_result)->parent = (*successor)->parent;
399+
(*openlist_result)->g = (*successor)->g;
400+
(*openlist_result)->h = (*successor)->h;
401+
(*openlist_result)->f = (*successor)->f;
402+
403+
// Free successor node
404+
FreeNode( (*successor) );
377405

378406
// re-make the heap
379407
// make_heap rather than sort_heap is an essential bug fix
380408
// thanks to Mike Ryynanen for pointing this out and then explaining
381409
// it in detail. sort_heap called on an invalid heap does not work
382410
make_heap( m_OpenList.begin(), m_OpenList.end(), HeapCompare_f() );
383-
384411
}
385412

386-
// heap now unsorted
387-
m_OpenList.push_back( (*successor) );
413+
// New successor
414+
// 1 - Move it from successors to open list
415+
// 2 - sort heap again in open list
416+
417+
else
418+
{
419+
// Push successor node into open list
420+
m_OpenList.push_back( (*successor) );
388421

389-
// sort back element into heap
390-
push_heap( m_OpenList.begin(), m_OpenList.end(), HeapCompare_f() );
422+
// Sort back element into heap
423+
push_heap( m_OpenList.begin(), m_OpenList.end(), HeapCompare_f() );
424+
}
391425

392426
}
393427

@@ -714,6 +748,7 @@ template <class UserState> class AStarSearch
714748
{
715749

716750
#if !USE_FSA_MEMORY
751+
m_AllocateNodeCount ++;
717752
Node *p = new Node;
718753
return p;
719754
#else

0 commit comments

Comments
 (0)