如何在图形工具中有效地计算图形的平均路径长度?

时间:2016-09-09 08:35:40

标签: python-3.x graph graph-tool

我正在处理10000个顶点的网络,我正在使用this来分析它们。我想为这些图中的每一个计算的事情之一是平均路径长度,其被定义为图中所有节点对上的最短距离的平均值。所以我尝试了这个:

ave_path_length = 0
tot = 0

for v1 in G.vertices():
    print(v1)
    for v2 in G.vertices():
        if v1 != v2 :
            tot += 1
            ave_path_length += gt.shortest_distance(G, v1, v2)

ave_path_length /= tot

然而,这是永恒的。有没有更好的方法来完成任务?提前谢谢。

3 个答案:

答案 0 :(得分:1)

你能做到吗,

all_sp = gt.shortest_distance(G)
vertex_avgs = graph_tool.stats.vertex_average(G, all_sp)
avg_path = numpy.mean(vertex_avgs[0])

我还没试过这个,但这应该有效。

答案 1 :(得分:0)

您可以使用distance(v1,v2) == distance(v2,v1)这一事实将时间减少2。因此,只计算一半的值(并且除以一半,但这是自动处理的)

vert = G.vertices()  # not sure it is a list. If not just convert to a list first
for i,v1 in enumerate(vert):
    for j in range(i+1,len(vert)):
        tot += 1
        ave_path_length += gt.shortest_distance(G, v1, vert[j])

ave_path_length /= tot

除此之外,您可以避免计算tot

tot = (len(vert)-1)*(len(vert)-2)//2

答案 2 :(得分:0)

我找到了一种非常有效的方法来实现这一目标。人们可以这样做:

for (int y = 0; y <= h-1; y++) {
    System.out.println("Y = "+y);
    for (int x = 0; x <= x1-1; x++) {
        System.out.println("("+x+","+y+") : "+b21.getRGB(x, y));
        if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) {
            res = true;
        }
        if (res) {
            for (int p = 0; p <= x1-1; p++) {
               b31.setRGB(p,y1,new Color(b21.getRGB(p, y)).getRGB());

            }
            y1++;
            res = false;
            break;
        }
    }
}
b31=new BufferedImage(x1,y1,BufferedImage.TYPE_INT_RGB);
int ty=y1;
y1=0;
for (int y = 0; y <= h-1; y++) {
    for (int x = 0; x <= x1-1; x++) {
        if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) {
            res = true;
        }
        if (res) {
            for (int p = 0; p <= x1-1; p++) {
               b31.setRGB(p,y1,new Color(b21.getRGB(p, y)).getRGB());
            }
            y1++;
            res = false;
            break;
        }
    }
}

对于大小为10000的稀疏网络,这只需要几秒钟。但是,我仍然很好奇是否存在更好的方法。