Python Networkx为每条边创建一个带有自定义键概率的随机图

2024-09-27 07:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想知道是否有一种方法可以实现大小为N的随机图,其中每对节点之间的结合概率由概率矩阵中的特定单元给出,比如大小为NxN的p,其中p{ij}表示节点N{I}和N{j}之间的结合概率

也许函数应该类似于函数networkx.generators.random_graphs.gnp_random_graph,但有可能添加概率矩阵p,而不是表示任何节点对之间键创建概率的浮点p


Tags: 方法函数networkx节点矩阵random概率graph
3条回答

我认为您只需要根据需要设置节点和边,并将其传递给图形构造函数

例如—

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()

result

在这种情况下,很容易推出自己的图形生成器

#!/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]

相关问题 更多 >

    热门问题