图是未加权的,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);
}
我没有太多投射或打印实数的经验,所以我希望它与那些有关!欢迎所有评论
答案 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的球场中有一个路径长度,那就说没有路径。因此,该路径长度不会影响您的平均值。或者您的路径长度是一个小的整数,其大小与图中的距离相同,那么它是有效的,您可以将其包含在计算中。
从中得到的教训:仅仅因为计算机程序中出现的数字并不意味着它值得信赖或正确!