码迷,mamicode.com
首页 > 编程语言 > 详细

使用优先队列完成了一个Astar搜索算法的c++实现,有时间可以完整的完成一遍

时间:2020-11-27 11:07:17      阅读:8      评论:0      收藏:0      [点我收藏+]

标签:oid   end   include   astar   public   using   cond   ast   优先   

#include<queue>
#include<vector>
#include<unordered_map>
using namespace std;
struct Node {
    int x;
    int y;
    double cost;
    int parent;

    Node(int ix, int iy, int icost, int iparent)
        : x(ix), y(iy), cost(icost), parent(iparent) {
        }
    
    bool operator < (const Node& b) {
        return cost < b.cost;
    }
};



class AstarPlanner {
    public:
        void generateObstacleMap();
        vector<tuple<int, int, double>> getMotions();
        void verifyGrid(int x, int y);
        vector<pair<int, int>> aStarPlan(int sx, int sy, int tx, int ty) {
            auto start_node = Node(0, 0, 0, -1);
            auto target_node = Node(10, 10, 0, -1);

            priority_queue<tuple<double, int>> priority_cost_queue;
            unordered_map<int, Node> open_list;
            unordered_map<int, Node> closed_list;

            priority_cost_queue.push({0.0, 0});

            while (!priority_cost_queue.empty()) {
                 
                auto c_index = get<1>(priority_cost_queue.top());
                auto c_cost = get<0>(priority_cost_queue.top());
                auto cur_node = open_list[c_index];
                if (cur_node.x == target_node.x && cur_node.y == target_node.y) {
                    target_node.parent = cur_node.parent;
                    target_node.cost = cur_node.cost;
                    break;
                }


                priority_cost_queue.pop();
                open_list.erase(c_index);
                closed_list.insert(pair<int, Node>(c_index, cur_node));

                // expansion cur_node
                auto motions = getMotions();
                for (auto motion : motions_) {
                    auto node = Node(cur_node.x + get<0>(motion), cur_node.y + 
                                    get<1>(motion), cur_node.cost + get<2>(motion), c_index);
                    int node_index = getNodeIndex(node);

                    auto ptr_close = closed_list.find(node_index);
                    if (ptr_close != closed_list.end()) {
                        continue;
                    }

                    auto ptr_open = open_list.find(node_index);
                    if (ptr_open != open_list.end()) {
                        ptr_open->second.cost = node.cost;
                        priority_cost_queue.push({node.cost, node_index});
                    }
                    else if (ptr_open->second.cost > node.cost) {
                        open_list[node_index] = node;
                        priority_cost_queue.push({node.cost, node_index});
                    }
                    
                }
            }

            vector<pair<int, int>> path;
            path.emplace_back(target_node.x, target_node.y);
            auto parent_id = target_node.parent;
            while (1) {
                path.emplace_back(closed_list[parent_id].x, closed_list[parent_id].y);
                if (closed_list[parent_id].x == start_node.x && closed_list[parent_id].y == start_node.y) {
                    break;
                }
                parent_id = closed_list[parent_id].parent;
            } 

            reverse(path.begin(), path.end());
            return path;
        }

        int getNodeIndex(Node node);
    private:
        vector<vector<bool>> obstacle_map_;
        int x_wideth_;
        int y_wideth_;
        vector<tuple<int, int, double>> motions_;

};

  

使用优先队列完成了一个Astar搜索算法的c++实现,有时间可以完整的完成一遍

标签:oid   end   include   astar   public   using   cond   ast   优先   

原文地址:https://www.cnblogs.com/rulin/p/14028157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!