无法在java中实现A Star

2023-11-25

我一整天都在尝试让这个算法启动并运行,但我一辈子都做不到。我在网上阅读了很多教程,以及 AS3、javascript 和 C++ 的源代码;但我无法将我所看到的内容适应我自己的代码。

我创建了一个 AStar 类,它有一个名为 Node 的嵌套类。该地图是一个名为 MAP 的二维数组。

我遇到的最大问题是在路径查找函数中提取 F 值。

我已经实现了 F = G + H,我的问题是实际的 AStar 算法。有人可以帮忙吗,这就是我到目前为止所取得的进展:

import java.util.ArrayList;

public class AStar
{
    int MAP[][];

    Node startNode, endNode;

    public AStar(int MAP[][], int startXNode, int startYNode,
                              int endXNode, int endYNode)
    {
        this.MAP = MAP;
        startNode = new Node(startXNode, startYNode);
        endNode = new Node(endXNode, endYNode);
    }

    public void pathfinder()
    {
        ArrayList openList = new ArrayList();
        ArrayList closedList = new ArrayList();



    }

    public int F(Node startNode, Node endNode)
    {
        return (H(startNode, endNode) + G(startNode));
    }

    //H or Heuristic part of A* algorithm
    public int H(Node startNode, Node endNode)
    {
        int WEIGHT = 10;
        int distance = (Math.abs(startNode.getX() - endNode.getX()) + Math.abs(startNode.getY() - endNode.getY()));

        return (distance * WEIGHT);
    }

    public int G(Node startNode)
    {
        if(MAP[startNode.getX() - 1][startNode.getY()] != 1)
        {
            return 10;
        }

        if(MAP[startNode.getX() + 1][startNode.getY()] != 1)
        {
            return 10;
        }

        if(MAP[startNode.getX()][startNode.getY() -1] != 1)
        {
            return 10;
        }

        if(MAP[startNode.getX()][startNode.getY() + 1] != 1)
        {
            return 0;
        }

        return 0;
    }

    public class Node
    {
        private int NodeX;
        private int NodeY;

        private int gScore;
        private int hScore;
        private int fScore;

        public Node(int NodeX, int NodeY)
        {
            this.NodeX = NodeX;
            this.NodeY = NodeY;
        }

        public int getX()
        {
            return NodeX;
        }

        public int getY()
        {
            return NodeY;
        }

        public int getG()
        {
            return gScore;
        }

        public void setG(int gScore)
        {
            this.gScore = gScore;
        }

        public int getH()
        {
            return hScore;
        }

        public void setH(int hScore)
        {
            this.hScore = hScore;
        }

        public int getF()
        {
            return fScore;
        }

        public void setF(int fScore)
        {
            this.fScore = fScore;
        }
    }
}

这是我使用探路者功能所能达到的最远距离:

   public void pathfinder()
    {
        LinkedList<Node> openList = new LinkedList();
        LinkedList<Node> closedList = new LinkedList();

        Node currentNode;

        openList.add(startNode);

        while(openList.size() > 0)
        {
            currentNode = (Node) openList.get(0);
            closedList.add(currentNode);


            for(int i = 0; i < openList.size(); i++)
            {
                int cost = F(currentNode, endNode);

            }
        }

    }

我最近将这段 A* 代码放在一起来解决一个问题欧拉计划问题。您必须填写矩阵的详细信息Node对象。使用它需要您自担风险,但我可以说它解决了问题:)

public class Node {
    List<Node> neighbors = new ArrayList<Node>();
    Node parent;
    int f;
    int g;
    int h;
    int x;
    int y;
    int cost;
}

public List<Node> aStar(Node start, Node goal) {
    Set<Node> open = new HashSet<Node>();
    Set<Node> closed = new HashSet<Node>();

    start.g = 0;
    start.h = estimateDistance(start, goal);
    start.f = start.h;

    open.add(start);

    while (true) {
        Node current = null;

        if (open.size() == 0) {
            throw new RuntimeException("no route");
        }

        for (Node node : open) {
            if (current == null || node.f < current.f) {
                current = node;
            }
        }

        if (current == goal) {
            break;
        }

        open.remove(current);
        closed.add(current);

        for (Node neighbor : current.neighbors) {
            if (neighbor == null) {
                continue;
            }

            int nextG = current.g + neighbor.cost;

            if (nextG < neighbor.g) {
                open.remove(neighbor);
                closed.remove(neighbor);
            }

            if (!open.contains(neighbor) && !closed.contains(neighbor)) {
                neighbor.g = nextG;
                neighbor.h = estimateDistance(neighbor, goal);
                neighbor.f = neighbor.g + neighbor.h;
                neighbor.parent = current;
                open.add(neighbor);
            }
        }
    }

    List<Node> nodes = new ArrayList<Node>();
    Node current = goal;
    while (current.parent != null) {
        nodes.add(current);
        current = current.parent;
    }
    nodes.add(start);

    return nodes;
}

public int estimateDistance(Node node1, Node node2) {
    return Math.abs(node1.x - node2.x) + Math.abs(node1.y - node2.y);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在java中实现A Star 的相关文章

随机推荐

  • Java 类型级别注释和私有成员可见性

    我正在尝试外部化 spring 的 baseurl Controller变成静态String控制器类的成员 如果我这样做 我必须声明该成员为公开成员 否则它将不可见 RequestMapping注解 我不明白为什么 注释不是类的一部分吗 有
  • 在 SQLite 中选择随机行

    在 MySQL 中 您可以使用以下语句选择 X 随机行 SELECT FROM table ORDER BY RAND LIMIT X 然而 这在 SQLite 中不起作用 有同等的吗 对于一个很多更好的性能 use SELECT FROM
  • 字符前未转义反斜杠的正确正则表达式是什么?

    假设我想代表 q 或任何其他特定的 反斜杠转义字符 也就是说 我想匹配 q但不是 q 因为后者是反斜杠转义的反斜杠后跟q Yet q会匹配 因为它是一个反斜杠转义的反斜杠 后面跟着一个反斜杠转义的q 嗯 它会匹配 q最后 不是 在一开始 我
  • Pandas:ValueError:无法将浮点 NaN 转换为整数

    I get ValueError 无法将浮点 NaN 转换为整数对于以下内容 df pandas read csv zoom11 csv df x df x astype int x 是 csv 文件中的一列 我看不到任何浮点数 NaN在文
  • 推送到 Github 时遇到问题,无法生成 sh:没有这样的文件或目录

    我在推送到 Github 时遇到了困难 我有一个克隆的存储库 并且我对其进行了更改 我想将其推送回 github 在存储库中时 我执行以下操作 git add 当我没有得到回应时 这似乎有效 然后当我这样做时 git commit m te
  • http.get 和 ISO-8859-1 编码响应

    我即将编写一个 RSS 提要获取器 但遇到了一些字符集问题 与编码相比 加载和解析提要非常容易 我正在加载提要http get我将每个数据事件的块放在一起 后来我用 npm lib 解析整个字符串feedparser它适用于给定的字符串 可
  • Gradle:如何在控制台实时显示测试结果?

    我想查看测试结果 system out err 来自正在测试的组件的日志消息 当他们奔跑时在我运行的同一个控制台中 gradle test 并且不要等到测试完成才查看测试报告 仅在测试完成时生成 因此我无法在测试运行时 tail f 任何内
  • 配置 Maven 以使用带有基本身份验证的 CXF wsdl2java

    我有一个应用程序需要与 SharePoint 的 Web 服务之一集成 该Web服务无法自由访问 需要身份验证 因此 当执行生成源阶段时 我的应用程序中的标准 wsdl2java Maven 插件会给出 HTTP 401 错误 有没有办法设
  • Microsoft Graph 401 未经访问令牌授权

    无法从 Microsoft Graph API 获取数据 private String getUserNamesFromGraph throws Exception String bearerToken Bearer getAccessTo
  • Rails 3.1 资产管道 - 为什么我的图像没有预编译用于生产?

    运行时 rake assets precompile all RAILS ENV production RAILS GROUPS assets 一切都预编译但不是我的 app assets images 我什至尝试将其添加到我的enviro
  • pip install-找不到满足要求的版本

    我正在尝试安装一个名为got使用点 但它一直显示 无法找到满足要求的版本 的错误 我在网上搜索了解决方案 有一些解释说尝试 pip freeze gt requirements txt 但它对我来说仍然是一个黑匣子 这里有什么问题以及我应该
  • Google BQ - 如何更新插入表中的现有数据?

    我正在使用 Python 客户端库在 BigQuery 表中加载数据 我需要更新这些表中的一些已更改的行 但我不知道如何正确更新它们 我想要一些类似的UPSERT功能 仅当行不存在时插入行 否则 更新现有行 在表中使用带有校验和的特殊字段
  • 如何从Python中的父文件夹导入函数?

    我需要在我的 python 项目上执行函数的导入 我知道有很多类似的问题 但是 不幸的是 我找不到适合我的解决方案 因为答案要么太具体 要么太笼统 要么它们只是丑陋的黑客 比如操作与绝对路径 我的文件夹结构如下所示 PythonClient
  • 到底是什么导致 Session_Start 被调用?

    在我正在构建的一个小演示应用程序中 我在 Global Session Start 事件中放置了用于初始化数据库的代码 但是 我注意到 当我在开发服务器上的调试器中运行应用程序时 此事件不会触发 尚未在其他地方进行测试 问题一 是什么赋予了
  • 用于存储矩阵的Java大数据结构

    我需要存储一个包含邮政编码以及每个邮政编码之间的距离 以公里为单位 的二维矩阵 我的客户有一个应用程序可以计算距离 然后将其存储在 Excel 文件中 目前有952个名额 所以矩阵将有 952x952 906304 个条目 我尝试将其映射到
  • CORS $.ajax 会话 cookie (access-control-allow-credentials & withCredentials=true)

    我意识到这个问题已经被问了十几次或更多次 给出的每个答复都表明我做得正确 但也许我遗漏了一些东西 AJAX 提供 CORS 请求 就像这样 ajax url someotherdomain com type post data key va
  • 组合谓词

    有什么方法可以组合谓词吗 可以说我有这样的东西 class MatchBeginning public binary function
  • EF4.3.1 中的 MaxLength 属性

    The type System ComponentModel DataAnnotations MaxLengthAttribute exists in both path packages EntityFramework 4 3 1 lib
  • 如何解决路径中的非法字符异常?

    我使用 XML 解析显示来自 URL 的图像 有些图像显示得很好 但有时我会遇到如下异常 索引 113 处的路径中存在非法字符 http www theblacksheeponline com party img thumbspps 123
  • 无法在java中实现A Star

    我一整天都在尝试让这个算法启动并运行 但我一辈子都做不到 我在网上阅读了很多教程 以及 AS3 javascript 和 C 的源代码 但我无法将我所看到的内容适应我自己的代码 我创建了一个 AStar 类 它有一个名为 Node 的嵌套类