运行 一个程序直到 networkx.check_planarity() returns True

Running a program until networkx.check_planarity() returns True

我有以下生成图表的函数。

import numpy as np
import networkx as nx
import random
def random_graph(vertices, connectivity):
    #Creates random symmetric graph
    arr = np.random.randint(0,10,(vertices,vertices))
    sym = (arr+arr.T)
    
    #removing self loops with fixing diagonal
    np.fill_diagonal(sym,0)
    
    #connectivity of graph -> 0 for highest connections, 9 for least connections
    mat = (sym>connectivity).astype(int)
    
    #convert to dictionary
    G = {k:[i for i,j in enumerate(v) if j==1] for k,v in enumerate(mat)}
    return G

我将该函数与随机生成的连接一起使用,不幸的是生成的图形并不总是平面的,所以我想 运行 该函数直到我得到一个平面图。使用 networkx 中的函数 check_planarity 检查图形的平面性。函数 check_planarity returns 一个布尔值,如果为真,则图形是平面的,如果为假,则图形不是平面的,我需要生成一个新图形,直到它是平面的。这是我试过的:

while True:
    random_connectivity = random.randint(4, 9)
    G = random_graph(5, random_connectivity)
    g = nx.Graph(G)
    planar = nx.check_planarity(g)
    if planar:
        break
    else: 
        pass

正如您从上面的循环中看到的那样,首先我生成 random_connectivity,然后我使用该连通性创建图形,然后使用 networkx 检查平面性。然后我尝试检查它是否是平面的,如果不是,我再次 运行 程序。不幸的是,它不起作用,因为它通常 returns 是一个非平面图。我还尝试解包 planar 并检查解包列表的第一个元素,但它不起作用:

planar_check = [x[0] for x in planar]

尝试上面的代码行时,我得到以下回溯:

Traceback (most recent call last):
  File "c:\Users\besan\OneDrive\Desktop\LAM da correggere\test.py", line 64, in <module>  
    planar_check = [x[0] for x in planar]
  File "c:\Users\besan\OneDrive\Desktop\LAM da correggere\test.py", line 64, in <listcomp>
    planar_check = [x[0] for x in planar]
TypeError: 'bool' object is not subscriptable

通过直接检查 planar 的第一个元素而不是解包来解决:

planar = nx.check_planarity(g)[0]