每次测试的最短路径不同

时间:2014-03-27 17:32:27

标签: java shortest-path jung

我正在编写一个计算给定网络中平均延迟的程序。我使用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 的最短路径?

1 个答案:

答案 0 :(得分:0)

正如Tony_craft所说,我们缺乏关于如何构建图表的足够信息,无法得出明确的答案。

但是,每次有可能获得不同路径的原因有两个: (1)每次图表都不一样。 (2)边缘以不同的顺序迭代,你得到相同重量的不同边缘。 Set(传出边缘)上的迭代次数不保证一致。