@@ -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