Graph 度量空间中完全图的生成

Graph 度量空间中完全图的生成,graph,networkx,Graph,Networkx,请帮助以最简单的方式生成一个完整的随机加权无向图,给定大小N,使权重形成一个度量空间(服从三角形不等式)。我知道有networkx库,但不知道如何实现这一点。虽然@SvenMarnach是正确的,但我想我要提到的是,在networkx中从距离矩阵初始化图形非常容易: import numpy as np import networkx as nx V = 100 # number of nodes D = 2 # dimensionality positions = np.random.ra

请帮助以最简单的方式生成一个完整的随机加权无向图,给定大小N,使权重形成一个度量空间(服从三角形不等式)。我知道有networkx库,但不知道如何实现这一点。

虽然@SvenMarnach是正确的,但我想我要提到的是,在networkx中从距离矩阵初始化图形非常容易:

import numpy as np
import networkx as nx

V = 100 # number of nodes
D = 2 # dimensionality

positions = np.random.rand(V, D)
differences = positions[:, None, :] - positions[None, :, :]
distances = np.sqrt(np.sum(differences**2, axis=-1)) # euclidean

# create a weighted, directed graph in networkx
graph = nx.from_numpy_matrix(distances, create_using=nx.DiGraph())

没有任何关于边权重随机分布的进一步说明,这个问题很简单——只需为每条边选择2到3之间的随机权重。结果图将很容易满足三角形不等式。@Paul肯定会的。不等式为d(x,y)+d(y,z)>=d(x,z)。左手边总是在4到6之间,而右手边总是在2到3之间。@SvenMarnach我向你鞠躬。(对于那些想知道的人,我质疑斯文的见解,没有任何理由支持它。)你可以将图随机嵌入任意度量空间。本例使用欧几里德平面。同样,我们需要回答的问题是,对权重的随机分布是否有任何要求。@Paul我最终设法理解/想象了如何将随机坐标转换为距离矩阵,但这对我来说仍然很困难。你能推荐一些好的阅读材料吗?大概是这一行给你带来麻烦的
differences=positions[:,None,:]-positions[None,:,:]
?我所做的是所谓的“广播”,是numpy阵列非常方便的功能。本质上,它相当于在
None
所指示的维度中平铺数组(从未实际创建平铺数组)。请查看或谷歌上的教程。@VladimirLenin您也可以使用。如果使用Paul的广播方法,我建议使用
np.newaxis
而不是
None
。它只是
None
的别名,但对于代码的读者(包括你自己在六个月后)来说,它的意图更加清晰。