Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
A-star算法java实现说明_Java_Algorithm_A Star - Fatal编程技术网

A-star算法java实现说明

A-star算法java实现说明,java,algorithm,a-star,Java,Algorithm,A Star,我最近学习了一个星型算法的Java实现,其中输入数据是20*20网格的形式 根据A星算法伪码,选择开放列表中最终开销最低的节点作为当前要前往的节点 在实际实现爪哇算法之前,我已经用其他语言实现了许多不同的实现,如Ruby、Python和C++。p> 在其他语言中实现的一个共同点是,它坚持在遍历路径时将最终成本最低的节点作为新的当前节点 我使用了一个优先级队列来实现该算法的开放列表,在下面添加了比较器,它为最终成本较低的节点提供了更高的优先级 PriorityQueue<GridPiece&

我最近学习了一个星型算法的Java实现,其中输入数据是20*20网格的形式

根据A星算法伪码,选择开放列表中最终开销最低的节点作为当前要前往的节点

在实际实现爪哇算法之前,我已经用其他语言实现了许多不同的实现,如Ruby、Python和C++。p> 在其他语言中实现的一个共同点是,它坚持在遍历路径时将最终成本最低的节点作为新的当前节点

我使用了一个优先级队列来实现该算法的开放列表,在下面添加了比较器,它为最终成本较低的节点提供了更高的优先级

PriorityQueue<GridPiece> unvisitedNodes = new PriorityQueue<>(10,
            (gridPie1, gridPie2) -> ((GridPiece) gridPie1).getFinalCost() > 
((GridPiece) gridPie2).getFinalCost()? -1
                    : ((GridPiece) gridPie1).getFinalCost() < ((GridPiece) 
gridPie2).getFinalCost() ? 1 : 0);
PriorityQueue unvisitedNodes=新的PriorityQueue(10,
(gridPie1,gridPie2)->(gridPie1.getFinalCost()>
((GridPiece)gridPie2.getFinalCost()?-1
:((GridPiece)gridPie1.getFinalCost()<((GridPiece)
getFinalCost()?1:0);
但是当我运行算法时,我得到了可能的最长路径。 两幅图像的图例都是,路径为橙色,源为粉红色,目标为紫色

当我研究基于网格的输入的该算法的Java实现时,如果使用优先级队列,它们总是为最终成本较高的节点提供更高的优先级。我尝试了这个方法,把比较器改成这个

PriorityQueue<GridPiece> unvisitedNodes = new PriorityQueue<>(10,
            (gridPie1, gridPie2) -> ((GridPiece) gridPie1).getFinalCost() < 
((GridPiece) gridPie2).getFinalCost()? -1
                    : ((GridPiece) gridPie1).getFinalCost() > ((GridPiece) 
gridPie2).getFinalCost() ? 1 : 0);
PriorityQueue unvisitedNodes=新的PriorityQueue(10,
(gridPie1,gridPie2)->(gridPie1.getFinalCost())
((GridPiece)gridPie2.getFinalCost()?-1
:((GridPiece)gridPie1.getFinalCost()>((GridPiece)
getFinalCost()?1:0);
然后我找到了一条更好的路

我的简单请求是一个简短的解释,解释了当实现完全遵循伪代码时,为什么算法的行为不符合预期,以及为什么需要切换节点的优先级(更高的最终成本首先转移到节点),以便算法在java实现中工作


可以找到项目的完整代码。

优先级队列的头是给定顺序的最小元素。当第一个元素的成本大于第二个元素的成本时,比较器返回-1。换句话说,你把最高成本放在第一位。这就是为什么你的队列头有一个成本最大的网格饼

在第二个实现中,当第一个元素的成本小于第二个元素的成本时,比较器返回-1,这是您想要的

如果您只是按成本(大概是整数?)排序,那么您可以执行以下操作:

new PriorityQueue<GridPiece>(Comparator.comparingInt(GridPiece::getFinalCost));
newpriorityqueue(Comparator.comparingInt(GridPiece::getFinalCost));

很少有理由指定初始容量。对于像您这样的小型电网,只需使用默认容量即可简化。

99%
of
a*
是一个普通的问题。唯一的区别是,它没有猜测节点的
0
成本,而是使用启发式函数进行更好的猜测。一个常见的启发式是乌鸦飞,一个很好的启发式是地标(例如贪婪的最远选择)。非常感谢!我一定会调查的。