python-3.x - 在 python 中使用类对象创建 Erdos-Renyi 图
问题描述
我正在从一组节点构建一个 Erdos-Renyi 图,这些节点是不同类型的类对象。该类取自 [blob 示例] ( https://pythonprogramming.net/many-blob-objects-intermediate-python-tutorial/ )
我从一个空图开始,创建红色和 blob 对象的节点,但是要拥有 Erdos-Renyi 图,我希望这些节点以概率 p 连接。对此类图使用 Networkx 语法从头开始创建它。
我在这里找到了一些类似的帖子 [完整图](Networkx:为给定的一组节点创建完整图),但他们没有帮助我处理这个随机图。
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()
我怎样才能保留我的节点并使用它们有这样一个随机图?非常感谢,
解决方案
来自维基百科页面Erdős–Rényi 模型:
在 G(n, p) 模型中,通过随机连接节点来构建图。每条边都包含在图中,概率 p 独立于所有其他边。
要基于预定的节点集创建 ER 图,您只需执行以下操作:
- 创建一个空的无向
networkx.Graph
. - 将节点添加到图中。
- 迭代所有可能的边(即所有节点对)并以概率 将边添加到图中
p
。
这里有一些 python-ish 伪代码给你一个想法:
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 图。请注意,这种方法对于生成海量图形并不是特别有效。
推荐阅读
- php - 有人可以帮我解决以下错误吗?“数据库查询错误-您可能发现了一个错误”
- java - Log4j2 根据属性禁用附加程序
- node.js - 如何将标准 API 错误响应制定为 Loopback 4 中的对象?
- jenkins - Jenkins无法将带有fileExists的文件复制到多个目录
- oracle - Python 和 Oracle 中的 Base 64 解码
- angular - 在 ionic 4 中集成谷歌地图时出错
- java - 如何访问另一个应用程序的权限屏幕?
- r - How do I plot a predicted vs actual graph for my Logit Model
- reactjs - React PropTypes 检查错误的类型
- gitlab - How to update gitlab badges during CI without using personal access token