A-star算法java实现说明
我最近学习了一个星型算法的Java实现,其中输入数据是20*20网格的形式 根据A星算法伪码,选择开放列表中最终开销最低的节点作为当前要前往的节点A-star算法java实现说明,java,algorithm,a-star,Java,Algorithm,A Star,我最近学习了一个星型算法的Java实现,其中输入数据是20*20网格的形式 根据A星算法伪码,选择开放列表中最终开销最低的节点作为当前要前往的节点 在实际实现爪哇算法之前,我已经用其他语言实现了许多不同的实现,如Ruby、Python和C++。p> 在其他语言中实现的一个共同点是,它坚持在遍历路径时将最终成本最低的节点作为新的当前节点 我使用了一个优先级队列来实现该算法的开放列表,在下面添加了比较器,它为最终成本较低的节点提供了更高的优先级 PriorityQueue<GridPiece&
在实际实现爪哇算法之前,我已经用其他语言实现了许多不同的实现,如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%
ofa*
是一个普通的问题。唯一的区别是,它没有猜测节点的0
成本,而是使用启发式函数进行更好的猜测。一个常见的启发式是乌鸦飞,一个很好的启发式是地标(例如贪婪的最远选择)。非常感谢!我一定会调查的。