I am having issues, trying to get my A Star algorithm' working, the main problem is with my process of the algorithm, I am using something known as the TL engine which has some of its own datatypes and functions but for the most part, I am 90% certain my problem is with my C++ code and not with TL-engine function, specifically with my understanding / implementation of the algorithm. [Figures and Information][1] my grid is a 10x10 grid, called SNodeCubeArray[10][10] my program reads a txtfile in and sets a base value which determines which bools it will set. When I generate new rules on the Algorithm I go, I visit the neighbours NESW, and to travel to each node I have a cost assigned to different node types. Here is an example: - Normal Nodes always have a cost of :1 - Woods Cost = 2 - Water Cost = 3 - Obstacle / wall = 0 (but is impassable) Figure 3 explains what happening in more detail. When I run my AStar algorithm, it performs a very strange path of opennodes, often jumping around and also causing dereferencing iterator problems. some functions / variables explanation gDEST_X & gDEST_Y = dsetination node stored gSTART_X & gSTART_Y = start node stored ANodeCubeModels = Model Array This is the struct I have declared it is the datatype I'll be using with Unique_ptr's deque. // Code by ryan newell uclan student G20618255 -> for self reference struct node { public: // The Structs actual location in the array eg [3,3] int mLoc_X; // Current X- Position in the Node stored int mLoc_y; // Current Y- Position in the node stored int mHeuristic_Manhattan; // Is the stored nodes manhattan distance // These floats are so I can store the coordinates of the linked cubes it should be in. //Temporary storage for the string reading. char mNodeValue; // Declares what kind node it is. bool mIsObstacle = false; bool mIsWater = false; bool mIsWoods = false; bool mIsStartNode = false; bool mIsDestNode = false; //Cost storage heurestic int mNodeCost; // The cost to travel between the nodes int mAccumulatedCost; // The accumulated cost of the node + its parent int mvalue_f; // Is its total score which will equals NodeCost+Heuristic //pARENT node* m_parent; }; This Is my functions section of the code being used, that we need to know about, any functions I haven't likely are TL-engine functions, and tested to work. // sorts the node array by order of total_score bool CompareNodeScores(unique_ptr<node>& lhs, unique_ptr<node>& rhs) { return lhs->mvalue_f < rhs->mvalue_f; } bool check_greater_fcost(deque <unique_ptr< node >> &closeList, unique_ptr <node> &NewState_n, deque <unique_ptr<node>> &openList) { if (openList.empty() == false) { for (auto it = openList.begin(); it != openList.end(); it++) { if ((*it)->mLoc_X == NewState_n.get()->mLoc_X && (*it)->mLoc_y == NewState_n.get()->mLoc_y && NewState_n->mvalue_f >= (*it)->mvalue_f) { return true; } return false; } } if (closeList.empty() == false) for (auto it = closeList.begin(); it != closeList.end(); it++) { if ((*it)->mLoc_X == NewState_n.get()->mLoc_X && (*it)->mLoc_y == NewState_n.get()->mLoc_y && NewState_n->mvalue_f >= (*it)->mvalue_f) { return true; } return false; } } bool astar_checklists(deque <unique_ptr< node >> &closeList, unique_ptr <node> &RuleCurrent, deque <unique_ptr<node>> &openList, unique_ptr <node> &CurrentNode) { // set p to the beginning of the loop for (auto it = openList.begin(); it != openList.end(); it++) { if ((*it)->mLoc_X == RuleCurrent.get()->mLoc_X && (*it)->mLoc_y == RuleCurrent.get()->mLoc_y) { (*it)->mAccumulatedCost = RuleCurrent->mAccumulatedCost; (*it)->mHeuristic_Manhattan = RuleCurrent->mHeuristic_Manhattan; (*it)->mNodeCost = RuleCurrent->mAccumulatedCost; (*it)->mvalue_f = RuleCurrent->mHeuristic_Manhattan + RuleCurrent->mNodeCost; (*it)->m_parent = CurrentNode->m_parent; return true; } } // set p to the beginning of the loop for (auto it = closeList.begin(); it != closeList.end(); it++) { if ((*it)->mLoc_X == RuleCurrent.get()->mLoc_X && (*it)->mLoc_y == RuleCurrent.get()->mLoc_y){ (*it)->mAccumulatedCost = RuleCurrent->mAccumulatedCost; (*it)->mHeuristic_Manhattan = RuleCurrent->mHeuristic_Manhattan; (*it)->mNodeCost = RuleCurrent->mAccumulatedCost; (*it)->mvalue_f = RuleCurrent->mHeuristic_Manhattan + RuleCurrent->mNodeCost; (*it)->m_parent = CurrentNode->m_parent; openList.push_back(move(*it)); closeList.erase(it); sort(openList.begin(), openList.end(), CompareNodeScores); return true; } else { return true; } } return false; } This section is where the main body of the algorithm itself lies, I am not really sure what I am doing wrong, but when I run the program, it does not take the correct route it should take. void AStarFindPathNew(I3DEngine* myEngine, IModel* ANodeCubeModels[10][10], node SNodeArray[10][10], int storemLoc_X, int storemLoc_y, int storedestmLoc_x, int storedestmLoc_y) { int xstore = 0; int ystore = 0; int xplus = 0; int yplus = 0; bool goal_state_found = false; //bool current_is_on_openlist = false; //bool current_is_on_closelist = false; previous unused values //bool current_is_on_bothlists = false; ofstream outfile; unique_ptr <node> NewState_n(new node); unique_ptr <node> CurrentNode(new node); unique_ptr <node> initialState(new node); deque <unique_ptr < node > > openList; deque <unique_ptr < node > > closeList; // Declaring Intial state initialState->mLoc_X = gSTART_X; initialState->mLoc_y = gSTART_Y; initialState->m_parent = 0; initialState->mAccumulatedCost = 0; initialState->mHeuristic_Manhattan = CalculateManhattan(ANodeCubeModels, SNodeArray, initialState->mLoc_X, initialState->mLoc_y, storedestmLoc_x, storedestmLoc_y); initialState->mvalue_f = initialState->mHeuristic_Manhattan + initialState->mNodeCost; DisplayOpenlist(openList, outfile); openList.push_front(move(initialState)); xstore = gSTART_X; ystore = gSTART_Y; while (!goal_state_found || !openList.empty()) { // Values Value_G = Manhattan Distance = mHeuristic_Manhattan // Value: Value_MC = Movement Cost Heuristic = mNodeCost // Value: Value_F = H + MC = m_valuef CurrentNode = (move(openList.front())); cout << "popped open to New current Node = " << CurrentNode->mLoc_X << ":" << CurrentNode->mLoc_y << endl; openList.pop_front(); //cout << CurrentNode->mLoc_X << "," << CurrentNode->mLoc_y << " Target: " << gDDEST_X << "," << gDDEST_Y << endl; if (CurrentNode->mLoc_X == storedestmLoc_x && CurrentNode->mLoc_y == storedestmLoc_y) { cout << "Found Path" << endl; _getch(); fRetracesteps(myEngine, ANodeCubeModels, SNodeArray, CurrentNode); return; } DisplayOpenlist(openList, outfile); for (int i = 0; i < 4; i++) { if (i == 0) { xplus = 0; yplus = +1; } if (i == 1) { xplus = +1; yplus = 0; } if (i == 2) { xplus = 0; yplus = -1; } if (i == 3) { xplus = -1; yplus = 0; } cout << "Generating Rule X:" << xstore + xplus << "Y:" << ystore + yplus << endl; //d) i Generate N NewState_n.reset(new node); NewState_n->mLoc_X = CurrentNode->mLoc_X + xplus; NewState_n->mLoc_y = CurrentNode->mLoc_y + yplus; NewState_n->mAccumulatedCost = CurrentNode->mAccumulatedCost + SNodeArray[NewState_n->mLoc_X][NewState_n->mLoc_y].mHeuristic_Manhattan; NewState_n->mHeuristic_Manhattan = CalculateManhattan(ANodeCubeModels, SNodeArray, NewState_n->mLoc_X, NewState_n->mLoc_y, storedestmLoc_x, storedestmLoc_y); NewState_n->mvalue_f = NewState_n->mHeuristic_Manhattan + NewState_n->mAccumulatedCost; NewState_n->m_parent = CurrentNode.get(); cout << NewState_n->m_parent; cout << "Checking curent rule for within boundaries" << endl; if (!checkcurrentruleinbounds(NewState_n)) { continue; } NewState_n->mIsObstacle = SNodeArray[CurrentNode->mLoc_X + xplus][CurrentNode->mLoc_y + yplus].mIsObstacle; cout << "Checking whether the rule is on the lists or has a greater cost" << endl; if (astar_checklists(closeList, NewState_n, openList,CurrentNode) && !check_greater_fcost(closeList, NewState_n, openList)) { continue; } if (NewState_n->mIsObstacle != true) { //cout << "Setting newstate_n" << NewState_n.get()->mLoc_X << NewState_n->mLoc_y << NewState_n->m_parent; ANodeCubeModels[NewState_n->mLoc_X][NewState_n->mLoc_y]->SetSkin("opennode.png"); openList.push_back(move(NewState_n)); sort(openList.begin(), openList.end(), CompareNodeScores); cout << CurrentNode->mLoc_X << ":" << CurrentNode->mLoc_y; } DisplayOpenlistWithScore(openList, outfile); } cout << "Finished first set of rules" << endl; cout << "Close List:" << CurrentNode->mLoc_X <<":"<< CurrentNode->mLoc_y << endl; ANodeCubeModels[CurrentNode->mLoc_X][CurrentNode->mLoc_y]->SetSkin("closednode.png"); closeList.push_back(move(CurrentNode)); _getch(); myEngine->DrawScene(); DelayProc(0.75); } } [1]: https://i.sstatic.net/3oFqT.png [2]: https://i.sstatic.net/ZFQJK.png