From 34128e3ac21c11424c188e16d276ada56a03fe45 Mon Sep 17 00:00:00 2001 From: PrinzEugen7 Date: Sun, 4 Oct 2015 21:33:06 +0900 Subject: [PATCH] Delete astar.cpp --- SearchRoute/Astar/Cpp/astar.cpp | 279 -------------------------------- 1 file changed, 279 deletions(-) delete mode 100644 SearchRoute/Astar/Cpp/astar.cpp diff --git a/SearchRoute/Astar/Cpp/astar.cpp b/SearchRoute/Astar/Cpp/astar.cpp deleted file mode 100644 index 007af3a..0000000 --- a/SearchRoute/Astar/Cpp/astar.cpp +++ /dev/null @@ -1,279 +0,0 @@ -#include -#include -#include -#include -#include -#include -using namespace std; - -const int n = 60; // horizontal size of the map -const int m = 60; // vertical size size of the map -static int map[n][m]; -static int closed_nodes_map[n][m]; // map of closed (tried-out) nodes -static int open_nodes_map[n][m]; // map of open (not-yet-tried) nodes -static int dir_map[n][m]; // map of directions -const int dir = 8; // number of possible directions to go at any position -static int dx[dir] = { 1, 1, 0, -1, -1, -1, 0, 1 }; -static int dy[dir] = { 0, 1, 1, 1, 0, -1, -1, -1 }; - -class node -{ - // current position - int xPos; - int yPos; - // total distance already travelled to reach the node - int level; - // priority=level+remaining distance estimate - int priority; // smaller: higher priority - -public: - node(int xp, int yp, int d, int p) - { - xPos = xp; yPos = yp; level = d; priority = p; - } - - int getxPos() const { return xPos; } - int getyPos() const { return yPos; } - int getLevel() const { return level; } - int getPriority() const { return priority; } - - void updatePriority(const int & xDest, const int & yDest) - { - priority = level + estimate(xDest, yDest) * 10; //A* - } - - // give better priority to going strait instead of diagonally - void nextLevel(const int & i) // i: direction - { - level += (dir == 8 ? (i % 2 == 0 ? 10 : 14) : 10); - } - - // Estimation function for the remaining distance to the goal. - const int & estimate(const int & xDest, const int & yDest) const - { - static int xd, yd, d; - xd = xDest - xPos; - yd = yDest - yPos; - - // Euclidian Distance - d = static_cast(sqrt(xd*xd + yd*yd)); - return(d); - } -}; - -// Determine priority (in the priority queue) -bool operator<(const node & a, const node & b) -{ - return a.getPriority() > b.getPriority(); -} - -// A-star algorithm. -// The route returned is a string of direction digits. -string pathFind(const int & xStart, const int & yStart, - const int & xFinish, const int & yFinish) -{ - static priority_queue pq[2]; // list of open (not-yet-tried) nodes - static int pqi; // pq index - static node* n0; - static node* m0; - static int i, j, x, y, xdx, ydy; - static char c; - pqi = 0; - - // reset the node maps - for (y = 0; yupdatePriority(xFinish, yFinish); - pq[pqi].push(*n0); - open_nodes_map[x][y] = n0->getPriority(); // mark it on the open nodes map - - // A* search - while (!pq[pqi].empty()) - { - // get the current node w/ the highest priority - // from the list of open nodes - n0 = new node(pq[pqi].top().getxPos(), pq[pqi].top().getyPos(), - pq[pqi].top().getLevel(), pq[pqi].top().getPriority()); - - x = n0->getxPos(); y = n0->getyPos(); - - pq[pqi].pop(); // remove the node from the open list - open_nodes_map[x][y] = 0; - // mark it on the closed nodes map - closed_nodes_map[x][y] = 1; - - // quit searching when the goal state is reached - //if((*n0).estimate(xFinish, yFinish) == 0) - if (x == xFinish && y == yFinish) - { - // generate the path from finish to start - // by following the directions - string path = ""; - while (!(x == xStart && y == yStart)) - { - j = dir_map[x][y]; - c = '0' + (j + dir / 2) % dir; - path = c + path; - x += dx[j]; - y += dy[j]; - } - - // garbage collection - delete n0; - // empty the leftover nodes - while (!pq[pqi].empty()) pq[pqi].pop(); - return path; - } - - // generate moves (child nodes) in all possible directions - for (i = 0; in - 1 || ydy<0 || ydy>m - 1 || map[xdx][ydy] == 1 - || closed_nodes_map[xdx][ydy] == 1)) - { - // generate a child node - m0 = new node(xdx, ydy, n0->getLevel(), - n0->getPriority()); - m0->nextLevel(i); - m0->updatePriority(xFinish, yFinish); - - // if it is not in the open list then add into that - if (open_nodes_map[xdx][ydy] == 0) - { - open_nodes_map[xdx][ydy] = m0->getPriority(); - pq[pqi].push(*m0); - // mark its parent node direction - dir_map[xdx][ydy] = (i + dir / 2) % dir; - } - else if (open_nodes_map[xdx][ydy]>m0->getPriority()) - { - // update the priority info - open_nodes_map[xdx][ydy] = m0->getPriority(); - // update the parent direction info - dir_map[xdx][ydy] = (i + dir / 2) % dir; - - // replace the node - // by emptying one pq to the other one - // except the node to be replaced will be ignored - // and the new node will be pushed in instead - while (!(pq[pqi].top().getxPos() == xdx && - pq[pqi].top().getyPos() == ydy)) - { - pq[1 - pqi].push(pq[pqi].top()); - pq[pqi].pop(); - } - pq[pqi].pop(); // remove the wanted node - - // empty the larger size pq to the smaller one - if (pq[pqi].size()>pq[1 - pqi].size()) pqi = 1 - pqi; - while (!pq[pqi].empty()) - { - pq[1 - pqi].push(pq[pqi].top()); - pq[pqi].pop(); - } - pqi = 1 - pqi; - pq[pqi].push(*m0); // add the better node instead - } - else delete m0; // garbage collection - } - } - delete n0; // garbage collection - } - return ""; // no route found -} - -int main() -{ - srand(time(NULL)); - - // create empty map - for (int y = 0; y0) - { - int j; char c; - int x = xA; - int y = yA; - map[x][y] = 2; - for (int i = 0; i