使用python中的类对象创建Erdos-Renyi图

时间:2019-01-19 19:30:04

标签: python-3.x networkx

我正在从一组节点构建一个Erdos-Renyi图,这些节点是不同类型的类对象。该类来自[blob示例](https://pythonprogramming.net/many-blob-objects-intermediate-python-tutorial/

我从一个空图开始,创建红色和斑点对象的节点,但是要有一个鄂尔多斯-仁义图,我希望这些节点以概率p连接。对此类图使用Networkx语法可从头开始创建它。

我在[完整图表](Networkx: Creating a complete graph for a given set of nodes)上找到了一些类似的帖子,但这些随机图表对我没有帮助。

import pygame
import random
import networkx
from matplotlib import pyplot as plt

STARTING_BLUE_BLOBS = 10
STARTING_RED_BLOBS = 3

WIDTH = 800
HEIGHT = 600
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
RED = (255, 0, 0
class Blob:
    def __init__(self, color):
        self.x = random.randrange(0, WIDTH)
        self.y = random.randrange(0, HEIGHT)
        self.size = random.randrange(4,8)
        self.color = color
def main():
       blue_blobs = dict(enumerate([Blob(BLUE) for i in 
range(STARTING_BLUE_BLOBS)]))
    red_blobs = dict(enumerate([Blob(RED) for i in range(STARTING_RED_BLOBS)]))
    Gb = nx.Graph()

    for i in range(10):
        Gb.add_node(blue_blobs[i])
    for i in range(3):
        Gb.add_node(red_blobs[i])
    Gb = nx.erdos_renyi_graph(13,0.5) 
    nx.draw(Gb, with_labels=True)
    plt.draw()
    plt.show()
if __name__ == '__main__':
    main()

我如何保留我的节点并使用它们创建一个随机图? 非常感谢你,

1 个答案:

答案 0 :(得分:1)

从Wikipedia页面Erdős–Rényi model

  

在G(n,p)模型中,通过随机连接节点来构造图。图形中的每个边均以概率p独立于其他边。

要基于预定的节点集创建ER图,只需执行以下操作:

  1. 创建一个空的无向networkx.Graph
  2. 将节点添加到图中。
  3. 遍历所有可能的边(即所有节点对),并以概率p将边添加到图中。

下面是一些类似python的伪代码,可以为您提供一个想法:

import random
import networkx as nx
from itertools import combinations

# probability for an edge to exist
p = 0.5

# ASSUMPTION: This array contains all desired nodes
nodes = [...]

g = nx.Graph()
g.add_nodes_from(nodes)

for u, v in combinations(g, 2):
    if random.random() < p:
        g.add_edge(u, v)

这应该使用一组预定的节点为您提供完全有效的ER图。请注意,这种方法在生成大量图形方面并不是特别有效。