Java a*算法实现问题

Java a*算法实现问题,java,algorithm,dijkstra,a-star,Java,Algorithm,Dijkstra,A Star,我试图用一个自我实现的PQ和向量来编写A*算法。它有垂直交叉点和边缘道路。我能够正确地编写dijkstra算法,但是我需要提高性能 目前,我的算法中断,抛出一个空指针异常,如代码中所述。在过去的5个多小时里,我一直在研究这个算法,同时试图实现它。我没有像对dijkstra实现那样完全理解比较路径的方法 这是我目前的代码: private Vertex dijkstra (int start, int end) { Vertex current; while (!(pq

我试图用一个自我实现的PQ和向量来编写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));
  }
private Vertex dijkstra(int start,int end)
{
顶点电流;
而(!(pqOpen.IsEmpty())
{
当前=pqOpen.GetNextItem();
其他的
{               
for(int i=0;i
我有一种感觉,我完全误解了算法一半的伪代码,但到目前为止,我还没有找到一种可以让我绞尽脑汁的表示法——所以有人可能看看我的代码,指出我哪里做错了,哪里做错了

以下是我用作参考的网站的链接:

我也尝试了维基百科,但他们的方法让我更加困惑:*u搜索算法

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

编辑: 我已经还原了我的代码并尝试了另一种方法。我现在使用这些伪代码示例来理解算法。并且

在第一个问题上,我认为我的代码是正确的,直到伪代码的第13行。从那一点上,我对他使用的“位置”这个术语感到困惑

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


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

我没有阅读所有代码,但这部分显然不好:)


看到了吗?如果hold2为null,那么您试图将值赋给hold2的
字段,在这种情况下,它是null,因此它会抛出一个异常。

首先读取dijkstra,a*与dijkstra的差值只是优先级队列的额外启发式权重。我想说a*是对dijks的优化tra.在Java中,方法名称应该以小写字母开头。也许您想按此处所述更改方法名称。您对算法的哪一部分开始失去了理解发生了什么的信心?如果您正在寻找更详细的解释,您可以尝试一下。@Taekahn我目前正在看t他的伪代码:在第13行,我开始感到困惑。我不明白“与继任者位置相同的节点在开放列表中”是什么意思,位置是什么意思?PQ位置?我将编辑第一篇帖子,因为我已经恢复了代码并以不同的方式处理它way@Taekahn我刚意识到你把我和我看到的是同一个页面!很抱歉-在你发表评论之前,我昨晚已经打开了该链接-决定今天早上尝试并实现它!
          if (hold2 == null)
            {
                hold2.from = hold; //throws null pointer here
            }