我正在为统一成本搜索制作程序,但在我的代码中,当我将节点置于优先级队列中时,节点会覆盖...我不知道问题是什么。
例如,如果节点A已存在于值为10的队列中,并且如果我再次将节点A置为值20,则前一节点A值也会更改。
任何人都可以帮忙吗?
while(!queue.isEmpty())
{
Node temp=queue.remove();
System.out.println(temp.city_name+" "+temp.getPath_cost());
path.add(temp);
if(temp==destination)
{
break;
}
System.out.println(temp.link.length);
for(int i=0; i<temp.link.length; i++){
a=temp.link[i].cost;
b=temp.link[i].getParent().getPath_cost();
temp.link[i].getNode().setPath_cost(a+b);
System.out.print(temp.link[i].getNode().city_name+": ");
System.out.println(temp.link[i].getNode().getPath_cost());
queue.add(temp.link[i].getNode());
}
}
答案 0 :(得分:0)
看起来您的节点直接保存路径成本,因此只有一个节点的引用。图表(节点)中的顶点不需要知道搜索的路径成本;相反,搜索通常为评估时评估的每个节点实现一个包装器,该包装器存储搜索特定信息,如路径成本。基本上,您在节点中查询它的邻居(impl中的link
属性),并为每个邻居创建一个新的包装器实例。
所有这一切,如果您只是寻找最短的路径,那么您可以安全地将路径成本设置为它的现有路径成本和当前评估的路径成本的最小值。您可以从设置每个节点正无穷大的路径成本开始。