【问题标题】:Java a* algorithm implementation issueJava a* 算法实现问题
【发布时间】:2015-03-25 20:21:21
【问题描述】:

我正在尝试使用自行实现的 PQ 和 Vector 来编写 A* 算法。它具有作为交叉点的顶点和作为道路的边。我能够正确编写 dijkstra 算法,但我需要提高性能。

目前我的算法中断了抛出空指针异常,如代码中所述。在尝试实现它的同时,我一直在研究过去 5 个多小时的算法。我并不完全理解比较路径的方法,就像我对 dijkstra 实现所做的那样。

这是我当前的代码:

    private Vertex dijkstra (int start, int end)
{


    Vertex current;
    while (!(pqOpen.IsEmpty()))
    {
        current = pqOpen.GetNextItem();


        else
        {               
            for (int i = 0; i < current.neighbors.GetNoOfItems(); i++)
            {                                   
                if (hold != null && hold.neighbors.GetItem(i).fromid != hold.city)
                {
                    int x = 1;                        



                if (hold2 == null || hold.getTentativeDistance() < hold2.getTentativeDistance())
                {
                    hold2.from = hold; //throws null pointer here
                    hold2.setTentativeDistance(hold.getTentativeDistance());
                    hold2.setF(hold2.getTentativeDistance() + heuristic(hold2, endLoc));  
                    System.out.println(hold2.from.city);
                }  
            }
        }   
    }
    return null;
}

  private double heuristic(Vertex goal, Vertex next)
  {        
      return Math.sqrt(Math.pow((goal.x - next.x), 2) + Math.pow((goal.y - next.y), 2));
  }

我有一种感觉,我完全误解了算法大约一半的伪代码,但到目前为止我还没有找到一个可以让我理解的表示 - 所以有人可以看看在我的代码中指出我在哪里以及我做错了什么?

这是我用来参考的网站链接:http://wiki.gamegardens.com/Path_Finding_Tutorial#Pseudo-code_A.2A

我也试过维基百科,但他们的方法让我更加困惑:http://en.wikipedia.org/wiki/A*_search_algorithm

目前它确实循环了几次并存储了一些节点,但是它们是不正确的。

编辑:

我已经恢复了我的代码并尝试了不同的方式。我现在正在使用这些伪代码示例来理解算法。 http://web.mit.edu/eranki/www/tutorials/search/http://www.redblobgames.com/pathfinding/a-star/introduction.html

关于第一个,我认为我的代码在伪代码的第 13 行之前是正确的。从那时起,我对他使用的“职位”一词感到困惑。

我注释掉的 if 语句来自我的 dijkstra 算法。但是我认为我之前提到的伪代码中的 if 语句应该类似于 IF 语句。

谁能帮我理解伪代码中与我的代码相关的第 13 行?

【问题讨论】:

  • 首先阅读dijkstra,a*与dijkstra的区别只是优先级队列的额外启发式权重。我会说 a* 是对 dijkstra 的优化。
  • 在 Java 中,方法名应该以小写字母开头。也许您想按照此处所述更改方法名称。 oracle.com/technetwork/java/codeconventions-135099.html
  • 您对算法的哪个部分开始失去理解正在发生的事情的信心?如果您正在寻找更详细的解释,您可以尝试一下。 web.mit.edu/eranki/www/tutorials/search
  • @Taekahn 我目前正在查看这个伪代码:web.mit.edu/eranki/www/tutorials/search,在第 13 行,我开始感到困惑。我不明白“与后继者具有相同位置的节点在 OPEN 列表中”的位置是什么意思? PQ位置?我将编辑第一篇文章,因为我已经恢复了我的代码并以不同的方式处理它
  • @Taekahn 我刚刚意识到您将我链接到我正在查看的同一页面!对此感到抱歉 - 在你发表评论之前,我昨晚已经打开了该链接 - 决定今天早上尝试实施它!

标签: java algorithm dijkstra a-star


【解决方案1】:

我没有阅读所有代码,但这部分显然很糟糕:)

          if (hold2 == null)
            {
                hold2.from = hold; //throws null pointer here
            }

看到了吗?如果 hold2 为 null,则您正在尝试将值分配给 hold2 的字段 from,在这种情况下为 null,因此它会引发异常。

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2022-08-19
    相关资源
    最近更新 更多