我正在实现Wilson算法,该算法使用沿图的随机游动。因此,在每一步中,我目前都在当前顶点的邻居列表上运行random.random.choice。但是,这显然很慢。如果我要重复从同一列表中进行随机选择,则可以使用numpy的np.random.choice较大的大小,但是由于邻居的长度对于所有顶点都不相同,因此我不确定如何执行此操作。 / p>
def wilsons(G):
nodes = list(G.keys())
v1 = random.choice(nodes)
v2 = random.choice(nodes)
V = [v1]
v = v1
while v != v2:
v = random.choice(G[v])
if v in V:
V = V[0:V.index(v)]
V.append(v)
out = {}
out[V[0]] = [V[1]] if len(V) > 1 else []
out[V[-1]] = [V[-2]] if len(V) > 1 else []
for i in range(1,len(V)-1):
out[V[i]] = [V[i-1], V[i+1]]
U = set(V)
nnodes = len(nodes)
outlen = len(V)
while outlen < nnodes:
v = random.choice(list(set(nodes)-U))
V = [v]
while v not in U:
v = random.choice(G[v])
if v in V:
V = V[0:V.index(v)]
V.append(v)
U.update(set(V))
outlen += len(V)-1
out[V[0]] = [V[1]]
out[V[-1]].append(V[-2])
for i in range(1,len(V)-1):
out[V[i]] = [V[i-1], V[i+1]]
return out