如何解决Python - Networkx 为每条边创建一个具有自定义键概率的随机图
我只是想知道是否有一种方法可以实现大小为 N 的随机图,其中每对节点之间的键的概率由概率矩阵中的特定单元格给出,假设 P 大小为 NxN,其中 P_{ij} 表示节点 n_{i} 和 n_{j} 之间的键的概率。
也许该函数应该类似于函数 networkx.generators.random_graphs.gnp_random_graph,但有可能添加概率矩阵 P,而不是表示 P 之间建立键的概率的浮点 p强>任何节点对。
解决方法
很容易为这种情况推出自己的图形生成器。
#!/usr/bin/env python
import numpy as np
import networkx as nx
N = 10 # number of nodes
P = np.random.rand(10,10) # your "matrix of probabilities"
adjacency = np.random.rand(*P.shape) <= P # adjacency[ii,jj] is True with probability P[ii,jj]
graph = nx.from_numpy_matrix(adjacency,nx.DiGraph) # assuming the graph is supposed to be directed,presumably if P[ii,jj] != P[jj,ii]
,
我认为您只需要根据您的要求设置节点和边并将其传递给图形构造器
例如 -
import networkx as nx
import itertools
import random
def setup_nodes_edges(n,p_matrix):
nodes = list(range(n))
edges = set()
for combination in itertools.combinations(nodes,2):
x,y = combination
if p_matrix[x][y] <= random.random():
edges.add(combination)
return nodes,edges
nodes,edges = setup_nodes_edges(3,p_matrix) # I assume you have a p_matrix
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
,
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
N = 8
m = np.random.random(N*N).reshape(N,N)
for i in range(N): m[i,i] = 0
nodes = range(N)
edges = {}
for i in range(N):
for j in range(N):
if np.random.random() < m[i,j]:
edges[(i,j)] = round(m[i,j],2)
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)
pos = nx.spring_layout(G)
nx.draw(G,pos)
nx.draw_networkx_edge_labels(G,pos,edge_labels=edges)
plt.show()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。