Python 获取具有给定数量的节点和边的所有可能图形(使用图形工具)

Python 获取具有给定数量的节点和边的所有可能图形(使用图形工具),python,graph,graph-tool,Python,Graph,Graph Tool,我对图形很陌生,我的知识接近于0。 但是我需要建立一个模型,以便得到所有可能的图,这些图具有给定数量的边、给定数量的节点以及每个节点之间的最大度 例如,我想得到所有可能有8个节点的图,每个节点之间正好有3个连接(边) 我还想获得作为字典的所有可能性,如下所示: { 1 : [2,3,4], 2 : [5,3,1], 3 : [6,2,7] ... and so on 当然,边不能连接到自身 到目前为止,我尝试使用图形工具库() 我尝试的是: from graph_tool.all im

我对图形很陌生,我的知识接近于0。 但是我需要建立一个模型,以便得到所有可能的图,这些图具有给定数量的边、给定数量的节点以及每个节点之间的最大度

例如,我想得到所有可能有8个节点的图,每个节点之间正好有3个连接(边)

我还想获得作为字典的所有可能性,如下所示:

{ 1 : [2,3,4],
  2 : [5,3,1],
  3 : [6,2,7]
... and so on
当然,边不能连接到自身

到目前为止,我尝试使用图形工具库()

我尝试的是:

from graph_tool.all import *

def degree () :
    return 3,3
g = random_graph(8, degree)
a = g.get_edges([g.edge_index])
print(a)
它输出我:

[[ 0  7  0]
 [ 0  5  2]
 [ 0  2  1]
 [ 1  7 12]
 [ 1  5 14]
 [ 1  6 13]
 [ 2  3  9]
 [ 2  4 10]
 [ 2  1 11]
 [ 3  6 22]
 [ 3  0 23]
 [ 3  1 21]
 [ 4  3  3]
 [ 4  1  5]
 [ 4  0  4]
 [ 5  2 20]
 [ 5  0 19]
 [ 5  4 18]
 [ 6  7 15]
 [ 6  5 16]
 [ 6  4 17]
 [ 7  6  8]
 [ 7  3  7]
 [ 7  2  6]]
有人能解释一下我做错了什么吗?(例如,为什么第一个列表是0,7,0(这意味着什么…我对这类东西完全陌生))

如果我只定义了8个节点,为什么数量大于7


我如何获得所有的可能性(所有8个节点的图,每个节点之间正好有3个连接)?

我不确定您试图实现什么,但我编写了一个代码来解决类似的问题,并从graph tools library生成的随机不同的图生成数据结构

它可能会帮助你得到你需要的东西

如果你有任何问题,请告诉我

来自图形工具。全部导入*
导入json
def isDifferentList(列表1、列表2):
返回列表1!=清单2
def是不同的图形(图1、图2):
对于图1.keys()中的k:
如果是不同的列表(图1[k],图2[k]):
#如果存在所有连接列表,则返回true并停止所有迭代,
#这意味着该图存在,因此需要生成一个新的图
返回真值
#该图形不存在,我们可以继续使用当前图形
返回错误
def grapherExists(图形,全部):
对于所有生成的:
如果不是isDifferentGraph(图形,已生成):
返回真值
返回错误
def生成输出数据(gr):
gGraph={}
对于gr.get_边()中的顶点:
顶点0=int(顶点[0])+1
顶点1=int(顶点[1])+1
如果int(顶点0)不在gGraph中:
gGraph[vertex0]=[]
如果顶点1不在gGraph中:
gGraph[vertex1]=[]
gGraph[vertex0]。追加(vertex1)
gGraph[vertex1]。追加(vertex0)
返回图
def getRandomGraph():
返回生成输出数据(随机图(顶点,lambda:DEGREE,directed=False))
定义的深度和顶点(顶点,单位为度):
全局顶点,度
度=单位度
顶点=顶点
def GenerateGraph(以顶点为单位,以度为单位,以n图为单位):
#首先将输入存储在全局变量中
定义的顶点和顶点(以顶点为单位,以度为单位)
#生成生成的唯一图的空列表
所有_图=[]
对于范围内的i(0,n_图):
#生成一个新的随机图,并将其作为所需的输出数据结构
g=getRandomGraph()
#检查此图是否已存在,并生成一个新图(只要已生成)
而graphExists(g,all_图):
g=getRandomGraph()
#将新图形写入文本文件
将open(“graphs.txt”,“a+”)作为f:
f、 写入(json.dumps(g))
f、 写入(“\n”)
#将新图形追加到all graph列表中-此列表将作为GrapherExists函数的输入
所有_图。追加(g)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
生成图(8,3,1500)
按照此处的主要功能及其注释了解整个流程

输出:

{"1": [2, 7, 5], "2": [1, 7, 5], "7": [1, 2, 6], "5": [1, 3, 2], "4": [6, 3, 8], "6": [4, 7, 8], "3": [4, 5, 8], "8": [6, 3, 4]}
{"1": [8, 7, 2], "8": [1, 2, 6], "7": [1, 4, 5], "2": [1, 6, 8], "6": [2, 3, 8], "4": [7, 3, 5], "3": [4, 5, 6], "5": [4, 3, 7]}
{"1": [8, 7, 5], "8": [1, 3, 2], "7": [1, 5, 6], "5": [1, 4, 7], "2": [3, 4, 8], "3": [2, 6, 8], "4": [6, 2, 5], "6": [4, 3, 7]}
其中,每个字典的键是一个命名顶点,值是表示连接顶点的列表

这不是一个真正的优化代码,因为它的复杂性随着图形的生成而增加。它将检查为每次迭代生成的每个图的复杂性

现在给你们第一个问题:在给定n条边和给定阶数的情况下,我们可以输出多少个图,首先,如果你们想所有边都严格连通,这可能不是解决方案。第二,在我看来,这是一个非常复杂的数学问题

这是我到目前为止所发现的,但是为了在代码中实现这一点,我让其他专家来回答这个问题(因为我不知道对不起)


哦,这并不是我所有问题的答案,但它确实帮助了我!非常感谢