Python、networkx

Python、networkx,python,graph,networkx,Python,Graph,Networkx,我需要帮助,因为我不擅长编程 对于一个具有n个节点和E个边的给定图,如何绘制平面图(如果一个图可以在平面中绘制,这样就没有边交叉),则称其为平面图。然后翻转边,得到另一个平面图(循环,直到我们得到所有可能的结果) 先谢谢你,谢谢你的帮助 派克 >#使用pygraphviz可视化 A=pgv.AGraph() 文件“”,第6行 A=pgv.AGraph() ^ SyntaxError:无效语法 >>>A.从(G.边())添加边 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 NameErr

我需要帮助,因为我不擅长编程

对于一个具有n个节点和E个边的给定图,如何绘制平面图(如果一个图可以在平面中绘制,这样就没有边交叉),则称其为平面图。然后翻转边,得到另一个平面图(循环,直到我们得到所有可能的结果)

先谢谢你,谢谢你的帮助

派克


>#使用pygraphviz可视化
A=pgv.AGraph()
文件“”,第6行
A=pgv.AGraph()
^
SyntaxError:无效语法
>>>A.从(G.边())添加边
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“A”
>>>A.布局(prog='dot')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“A”
>>>A.draw('planar.png')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“A”

您的问题涉及到几个难以计算的问题

首先,一些理论。如果图G是平面的,则G的每个子图都是平面的。从G(具有
e
edges)翻转边,将得到
2^e-1
平面子图(如果我们不关心连通性),这是指数型的(即,巨大且“不好”)。很可能,您希望找到“最大”平面子图

如果你想画平面图,它看起来也像平面,也就是说,知道存在一个边不相交的图形表示是一回事,找到这样的表示是另一回事

执行。networkx似乎没有检查图形是否为平面的功能。其他一些处理图形的包有(例如,has
g.is_planar()
函数,其中
g
是图形对象)。下面,我写了一个基于networkx的“naive”(必须有更有效的方法)平面性检查

Edit2。如果你在pygraphviz上遇到麻烦,试着用networkx绘图,也许你会发现结果还可以。因此,不要使用“Visualization with pygraphviz”块,而是尝试以下操作:

编辑结束2

结果是这样的

你可以看到图片上有一个交叉点(但图形是平面的),它实际上是一个很好的结果(别忘了这个问题在计算上很难),pygraphviz是一个使用启发式算法的包装器。在
A.layout(prog='dot')
行中,您可以尝试将“dot”替换为“twopi”、“neato”、“circo”等,以查看是否实现了更好的可视化效果

编辑。让我们考虑平面子图的问题。 让我们生成一个非平面图:

while True:
    J=nx.gnp_random_graph(n,p)
    if is_planar(J)[0]==False:
        break
我认为寻找平面子图最有效的方法是从“坏的次要”(即K(5)或K(3,3))中删除节点。以下是我的实现:

def find_planar_subgraph(G):
    if len(G)<3:
        return G
    else:
        is_planar_boolean,bad_minor=is_planar(G)
        if is_planar_boolean:
            return G
        else:
            G.remove_node(bad_minor[0])
            return find_planar_subgraph(G)

现在有了非平面图G的平面子图L(networkx图形对象)。

欢迎来到StackOverflow。这是一个问答网站。请查看常见问题解答:您是否需要绘制一个在视觉上看起来也是平面的平面图?一个相关问题:没有那么难。Max说得对,NetworkX不包含平面度测试和绘制代码。但是Boyer的C平面性代码有一个包装器,它可以与NetworkX平滑地互操作,并包含is_planar()和绘图函数。请参阅以获取代码,尤其是可能是我见过的最好答案之一的示例。。。计算平面图的嵌入可以在线性时间内完成。例如,见。困难的是嵌入一个非平面图,这样边交叉的数量就最小化了。对不起,这个答案完全是错误的,我不理解有多少投票。首先,正如其他人已经指出的,找到一个平面嵌入可以在线性时间内完成,并且在计算上并不困难。第二,正如其他人已经指出的那样,您的算法只检查K5和K3,3子图,而不检查平面性所需的K5和K3,3子图。请编辑您的答案,以免混淆未来的读者!!!
import matplotlib.pyplot as plt
nx.draw(G)
# comment the line above and uncomment one of the 3 lines below (try each of them):
#nx.draw_random(G)
#nx.draw_circular(G)
#nx.draw_spectral(G)
plt.show()
while True:
    J=nx.gnp_random_graph(n,p)
    if is_planar(J)[0]==False:
        break
def find_planar_subgraph(G):
    if len(G)<3:
        return G
    else:
        is_planar_boolean,bad_minor=is_planar(G)
        if is_planar_boolean:
            return G
        else:
            G.remove_node(bad_minor[0])
            return find_planar_subgraph(G)
L=find_planar_subgraph(J)
is_planar(L)[0]
>> True