Dijkstra无可比节点Java
这是我在这里问的第一个问题,如果我做错了什么,请评论: 我有一个讨厌的项目要完成。我必须为从节点开始到节点结束实现Dijkstra算法。图由连接节点的边的长度加权。一个问题是,图、边和节点类没有实现Compariable,节点类不包含节点的Weighth或pervious Node之类的内容。我不允许在Node、Graph或Edge类中更改任何内容 因此,我试图通过在RoutingAlgoritm中使用一个私有类来实现Dijkstra,该类包含距离、前一个节点等 不管怎样,现在我遇到了一个问题,我的目标节点没有上一个节点,我不知道为什么。我希望你能帮助我Dijkstra无可比节点Java,java,debugging,dijkstra,comparable,Java,Debugging,Dijkstra,Comparable,这是我在这里问的第一个问题,如果我做错了什么,请评论: 我有一个讨厌的项目要完成。我必须为从节点开始到节点结束实现Dijkstra算法。图由连接节点的边的长度加权。一个问题是,图、边和节点类没有实现Compariable,节点类不包含节点的Weighth或pervious Node之类的内容。我不允许在Node、Graph或Edge类中更改任何内容 因此,我试图通过在RoutingAlgoritm中使用一个私有类来实现Dijkstra,该类包含距离、前一个节点等 不管怎样,现在我遇到了一个问题,
private List<Node> dijkstra( Graph g, NodeForDijkstra start, NodeForDijkstra target, TravelType tt) throws NoSuchRouteException{
PriorityQueue<NodeForDijkstra> q = new PriorityQueue<NodeForDijkstra>();
start.distance = 0.;
start.prev = null;
ArrayList<Node> explored = new ArrayList<Node>();
q.add( start );
if( q.isEmpty() ){
throw new NoSuchRouteException();
}
while( !q.isEmpty() ){
NodeForDijkstra n = q.poll();
Node v = n.getNode;
if( v.getId() == target.getNode.getId() ){
return path(target);
}
explored.add( v );
for( Edge e : v ){
if( e.allowsTravelType(tt, Direction.FORWARD) ){
Node puf = e.getEnd();
NodeForDijkstra newNode = new NodeForDijkstra(puf);
double newdist = n.distance + e.getLength();
if( !explored.contains(puf) ){
newNode.prev = n;
System.out.println( newNode.getNode.getId()+ " | " + newNode.prev.getNode.getId() );
if( !q.contains( newNode ) ){
newNode.distance = newdist;
q.add(newNode);
}else if( newNode.distance > newdist ){
System.out.println( "foo" );
q.remove(n);
newNode.distance = newdist;
q.add(newNode);
}
}
}
}
}
return path(target);
}
private List<Node> path( NodeForDijkstra target ){
List<Node> path = new ArrayList<Node>();
for( NodeForDijkstra n = target; n!= null; n = n.prev ){
path.add( n.getNode );
System.out.println(n.getNode.getId());
System.out.println( "bar" );
}
Collections.reverse(path);
return path;
}
private class NodeForDijkstra implements Comparable<NodeForDijkstra>{
public double distance = Double.POSITIVE_INFINITY;
public Node getNode;
public NodeForDijkstra prev = null;
public NodeForDijkstra( Node n ) {
this.getNode = n;
}
@Override
public int compareTo(NodeForDijkstra o) {
return Double.compare(distance, o.distance);
}
}
您的目标节点没有获得上一个节点是什么意思?如果有一个声明没有达到你的预期,那么你可以指出该声明是什么,你希望它能做什么,以及它在做什么,这会有所帮助。如果没有它,我们很难确切地理解您的问题是什么。我所说的ist是指我的目标的前一个节点保持为空