微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

A* 寻路或类似:每次搜索仅返回部分路径而不是完整路径

如何解决A* 寻路或类似:每次搜索仅返回部分路径而不是完整路径

我使用 A* 作为我的寻路算法。玩家每回合最多只能移动 4 步。

我希望能够获得路径的 4 个最佳移动,而不是完整路径(每轮都计算 A* 搜索)。

有没有办法只用 4 个最佳移动(最低成本和最短路线)来创建一条路径,而不是每次都找到完整的路径?

我确实看了看,也许你可以在 A* 搜索之前检查机器人位置的 X 和 Y,如果 A* 搜索产生一个节点 > 那么它可以去的瓷砖数量就可以了。但是给出了一个奇怪的路径,因为它在瓷砖数量 > 时停止并且不会继续检查其他瓷砖以查看它是否最好,并且在机器人达到目标时也不会停止。

if(current.position.equals(goal)替换if(current.position.getX() > bot.getX() + 6|| current.position.getY() > bot.getY() + 6)

提供完整目标路径的当前代码

    private Comparator<Node> nodeSorter = new Comparator<Node>() {

        @Override
        public int compare(Node n0,Node n1) {
            if(n1.fCost < n0.fCost) return 1;
            if(n1.fCost > n0.fCost) return -1;
            return 0;
        }
        
    };

    public List<Node> findpath(Player bot,Position goal){
        openList = new ArrayList<Node>();
        closedList = new ArrayList<Node>();
        List<Node> neighbors = new ArrayList<Node>();
        Node current = new Node(bot,bot.getFace(),NONE,null,bot.distance(goal));
        openList.add(current);
        while(openList.size() > 0) {
            Collections.sort(openList,nodeSorter);
            current = openList.get(0);
           
            if(current.position.equals(goal)) {
                List<Node> path = new ArrayList<Node>();
                while(current.parent != null) {
                    path.add(current);
                    current = current.parent;
                }
                openList.clear();
                closedList.clear();
                return path;
            }
            openList.remove(current);
            closedList.add(current);
            
            int x = current.position.getX();
            int y = current.position.getY();
            switch (current.face) {
                case norTH:
                    neighbors.add(new Node(new Position(x,y),norTH,current,0));
                    neighbors.add(new Node(new Position(x,y+1),FORWARD,0));
                    neighbors.add(new Node(new Position(x-1,WEST,LEFT,0));
                    neighbors.add(new Node(new Position(x+1,EAST,RIGHT,0));
                    break;
                case EAST:
                    neighbors.add(new Node(new Position(x,y-1),SOUTH,0));
                    break;
                case SOUTH:
                    neighbors.add(new Node(new Position(x,0));
                    break;
                case WEST:
                    neighbors.add(new Node(new Position(x,0));
                    break;
            }
            for(Node neighborNode : neighbors) {
                if(neighborNode.position.getX() < 0 || neighborNode.position.getY() < 0 ||
                        neighborNode.position.getX() > MAP_WIDTH || neighborNode.position.getY() > MAP_HEIGHT )continue;
                double costTo = current.position.distance(neighborNode.position);
                double gCost = current.gCost + costTo;
                double hCost = getheuristicdistance(neighborNode.position,goal);
                Node node = new Node(neighborNode.position,neighborNode.face,neighborNode.move,gCost,hCost);
                if(positionInList(closedList,neighborNode.position) && gCost >= node.gCost) continue;
                if(!positionInList(openList,neighborNode.position) || gCost < node.gCost)openList.add(node);
            }
        }
        closedList.clear();
        return null;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。