我正在编写一个计算给定网络中平均延迟的程序。我使用JUNG库。在输入时,我的程序读取信息顶点 x 要发送到顶点 y 的秒数。我的图是未加权的,我假设数据包是通过最短路径发送的。
我使用JUNG方法获得最短路径:
public class NetworkGraph {
protected final Graph graph;
protected Vertex[] vertices;
protected Random random;
protected double sumOfFlowStrengthMatrix;
protected final int[][] flowStrengthMatrix;
NetworkGraph(Input input, Graph graph) {
random = new Random();
this.graph = graph;
loadVertices(input);
loadEdges(input);
loadSumOfFlowStrengthMatrix(input);
flowStrengthMatrix = input.getFlowStrengthMatrix();
}
private void loadVertices(Input input) {
vertices = new Vertex[input.getNumberOfVertices()];
for (int i = 0; i < input.getNumberOfVertices(); i++) {
vertices[i] = new Vertex(i + 1);
graph.addVertex(vertices[i]);
}
}
private void loadEdges(Input input) {
for (int i = 0; i < input.getNumberOfVertices(); i++) {
for (int j = 0; j < input.getNumberOfVertices(); j++) {
if (input.getProbabilityOfDivulsionArray()[i][j] != 0) {
if (graph.findEdge(vertices[i], vertices[j]) == null) {
graph.addEdge(new Edge(input.getCapacityArray()[i][j], input.getProbabilityOfDivulsionArray()[i][j]), vertices[i], vertices[j]);
}
}
}
}
}
private void loadSumOfFlowStrengthMatrix(Input input) {
double sum = 0;
for (int i = 0; i < input.getNumberOfVertices(); i++) {
for (int j = 0; j < input.getNumberOfVertices(); j++) {
sum += input.getFlowStrengthMatrix()[i][j];
}
}
this.sumOfFlowStrengthMatrix = sum;
}
public double countAveragePacketDelayInNetwork() throws EdgeException {
double out = 0;
ArrayList<Edge> edges = new ArrayList<>(graph.getEdges());
recountFlows();
for (Edge e : edges) {
out += e.getAveragePacketDelay();
}
return round((out / sumOfFlowStrengthMatrix), 4);
}
protected void recountFlows() {
for (int i = 0; i < vertices.length; i++) {
for (int j = 0; j < vertices.length; j++) {
DijkstraShortestPath<Vertex, Edge> algorithm = new DijkstraShortestPath<>(graph);
List<Edge> edges = algorithm.getPath(vertices[i], vertices[j]);
for (Edge edge : edges) {
edge.addToFlowStrength(flowStrengthMatrix[i][j]);
}
}
}
}
}
我使用相同的示例图表多次运行程序。不幸的是,我得到了不同的结果 - 每次我有不同的平均延迟 - 这真的很烦人。
可能是由Dijkstra算法引起的 - 我注意到Dijkstra算法为同一输入返回不同的结果。我知道它可以是从 x 到 y 的许多最短路径,但是为什么当每次创建图形的输入和方式完全相同时,Dijkstra算法会返回不同的路径?
有没有办法让这个算法返回给定的 x 和 y 的最短路径?
答案 0 :(得分:0)
正如Tony_craft所说,我们缺乏关于如何构建图表的足够信息,无法得出明确的答案。
但是,每次有可能获得不同路径的原因有两个: (1)每次图表都不一样。 (2)边缘以不同的顺序迭代,你得到相同重量的不同边缘。 Set(传出边缘)上的迭代次数不保证一致。