使用Dijkstra(java)获得平均距离的错误结果

时间:2010-07-09 16:11:31

标签: java casting graph double dijkstra

图是未加权的,HashSets neighbors []数组的一个元素是一个节点 邻居[1]是节点1(他们从0开始),其唯一的邻居节点说2 3 4 5.(所以邻居[5]将包含1)。而且我有以下方法,我做了很多帮助,因为我没有理论上的理论。它返回的数字应该是图中2个节点之间的平均距离。

想象一下,我有以下图表(node:in_links | out_links; neighbors []在节点0不包含0循环,并且没有像我说的那样重复。)

0: 0 0 0 | 0 0 0 1 1 1 2 3 5 6 7 7 8 8 9 9 11 
1: 0 0 0 | 2 2 3 4 4 5 6 8 
2: 0 1 1 | 3 
3: 0 1 2 | 4 9 
4: 1 1 3 | 5 12 
5: 0 1 4 | 6 7 10 
6: 0 1 5 | 10 11 12 
7: 0 0 5 | 
8: 0 0 1 | 10 
9: 0 0 3 | 12 
10: 5 6 8 | 11 
11: 0 6 10 | 
12: 4 6 9 | 

对于这个琐碎的图表,返回的距离是5.781686749230769E8?!?! 代码:

    public double getAvgDistance() {
    double total = 0;
    int[] dist = new int[n];
    ArrayList<Integer> Q = new ArrayList<Integer>();
    int tmp, index = 0, w = 0;

    for (int u=0; u<n; u++) {
        System.out.print("Avg Dist at "+u+"\r");
        // Initialise Q and dist for this iteration
        for (int v=u+1; v<n; v++) {
            Q.add(v);

            if (neighbours[u].contains(v)) {
                dist[v] = 1;
            } else {
                dist[v] = Integer.MAX_VALUE;
            }
        }

        while (!Q.isEmpty()) {

            tmp = dist[0];
            for (int e=1; e<Q.size(); e++) {
                if (dist[e] < tmp) {
                    w = Q.get(e);
                    tmp = dist[w]; // smallest dist is for this element w so far
                    index = e;
                }
            }
            Q.remove(index);

            for (int z : neighbours[w]) {
                if ( Q.contains(z)
                        && (dist[w]+1 < dist[z]) ) {

                    dist[z] = dist[w]+1;
                }
            }

        } // while end

        for (int v = u+1; v < n; v++ ) {
            total += dist[v];
        }

    } // for 0-n end

    return total /= (double)(n*(n-1)/2);
}

我没有太多投射或打印实数的经验,所以我希望它与那些有关!欢迎所有评论

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题,节点7,11和12没有输出链接,因此没有到其他节点的有效路径。

在这些情况下,您的算法是否通过插入成本为Integer.MAX_VALUE的链接强制路径?如果是这样,那就可以解释为什么你的平均成本非常高。

我也想知道评估前向和反向路径是否更好。在有向图中,路径AB的成本不一定与路径BA的成本相同。使用当前算法,计算在节点12结束的每个路径的开销,但不评估从节点12开始的路径。

答案 1 :(得分:0)

我不确定我是否完全理解你的问题,但听起来你可能会遇到麻烦,你所打印的价值并不完全符合你的预期。我怀疑当你打印double的值时可能会出现问题。每当你将double直接转换为String时,我知道你会得到意想不到的结果。

这篇文章建议使用BigDecimal而不是double来保持精度: Retain precision with double in Java

所以也许尝试做类似下面的事情,看看你是否有更好的结果。

BigDecimal.valueOf(<your double value here>).toPlainString();

答案 2 :(得分:0)

我只是猜测,但我发现距离偶尔被设置为Integer.MAX_VALUE。如果这些数字实际上是进入结果,然后被一个或两个因子10分割,这就可以很好地解释为什么平均值比预期的大得多,大得多,并与MAX_VALUE大致相同。

当用于确定替代方案中的最短路径时,可以在图表中使用这个大值,但是一旦你到达确定实际距离的点,那么这个数字就必须去了!

要么在MAX_VALUE的球场中有一个路径长度,那就说没有路径。因此,该路径长度不会影响您的平均值。或者您的路径长度是一个小的整数,其大小与图中的距离相同,那么它是有效的,您可以将其包含在计算中。

从中得到的教训:仅仅因为计算机程序中出现的数字并不意味着它值得信赖或正确!