Dijkstra 的最短路径算法不返回具有最小权重的最短路径
Dijkstra's Shortest Path algorithm not returning shortest path with smallest weight
我正在使用一个名为 JGraphT 的图形库,在我的程序中我有几个顶点通过一条边连接在一起,权重为旅行成本。
在一个我只用整数加权的例子中,它起作用了!但是当我将其更改为使用我的 class FlightData
作为权重时,它不起作用。
这是我的代码,权重只是一个整数:
List<DefaultWeightedEdge> path = DijkstraShortestPath.findPathBetween(graph, start, end);
for(int i = 0; i < path.size(); i++) {
DefaultWeightedEdge edge = path.get(i);
System.out.println((i+1) + " " + graph.getEdgeSource(edge) + " -> " + graph.getEdgeTarget(edge));
}
这是我的重量代码作为我的飞行数据 class:
List<FlightData> path = DijkstraShortestPath.findPathBetween(graph, start, end);
for(int i = 0; i < path.size(); i++) {
FlightData f = path.get(i);
System.out.println((i+1) + " " + graph.getEdgeSource(f) + " -> " + graph.getEdgeTarget(f));
}
我的 FlightData class 只是一个带有访问器方法的 class:
import org.jgrapht.graph.DefaultWeightedEdge;
public class FlightData extends DefaultWeightedEdge
{
private String flightNumber, depTime, arrTime;
private double price;
public FlightData(String flightNumber, String depTime,
String arrTime, double price) {
this.flightNumber = flightNumber;
this.depTime = depTime;
this.arrTime = arrTime;
this.price = price;
}
public String getFlightNumber() {
return flightNumber;
}
public String getDepartureTime() {
return depTime;
}
public String getArrivalTime() {
return arrTime;
}
public double getFlightPrice() {
return price;
}
}
任何人都可以指出正确的方向,为什么一个揭示了权重最低的最短路径,而另一个揭示了最短路径但不一定是权重最低的? (如果两个顶点之间有一条直接路径,它将 return 那!)
您需要覆盖 FlightData
中的 DefaultWeightedEdge.getWeight()
,例如至 return price
:
@Override
protected double getWeight() {
return price;
}
否则,您将使用默认边权重,即 1.0
。
我正在使用一个名为 JGraphT 的图形库,在我的程序中我有几个顶点通过一条边连接在一起,权重为旅行成本。
在一个我只用整数加权的例子中,它起作用了!但是当我将其更改为使用我的 class FlightData
作为权重时,它不起作用。
这是我的代码,权重只是一个整数:
List<DefaultWeightedEdge> path = DijkstraShortestPath.findPathBetween(graph, start, end);
for(int i = 0; i < path.size(); i++) {
DefaultWeightedEdge edge = path.get(i);
System.out.println((i+1) + " " + graph.getEdgeSource(edge) + " -> " + graph.getEdgeTarget(edge));
}
这是我的重量代码作为我的飞行数据 class:
List<FlightData> path = DijkstraShortestPath.findPathBetween(graph, start, end);
for(int i = 0; i < path.size(); i++) {
FlightData f = path.get(i);
System.out.println((i+1) + " " + graph.getEdgeSource(f) + " -> " + graph.getEdgeTarget(f));
}
我的 FlightData class 只是一个带有访问器方法的 class:
import org.jgrapht.graph.DefaultWeightedEdge;
public class FlightData extends DefaultWeightedEdge
{
private String flightNumber, depTime, arrTime;
private double price;
public FlightData(String flightNumber, String depTime,
String arrTime, double price) {
this.flightNumber = flightNumber;
this.depTime = depTime;
this.arrTime = arrTime;
this.price = price;
}
public String getFlightNumber() {
return flightNumber;
}
public String getDepartureTime() {
return depTime;
}
public String getArrivalTime() {
return arrTime;
}
public double getFlightPrice() {
return price;
}
}
任何人都可以指出正确的方向,为什么一个揭示了权重最低的最短路径,而另一个揭示了最短路径但不一定是权重最低的? (如果两个顶点之间有一条直接路径,它将 return 那!)
您需要覆盖 FlightData
中的 DefaultWeightedEdge.getWeight()
,例如至 return price
:
@Override
protected double getWeight() {
return price;
}
否则,您将使用默认边权重,即 1.0
。