【问题标题】:Generating a random dictionary and coloring associated graph生成随机字典并对关联图着色
【发布时间】:2022-01-26 12:49:35
【问题描述】:

我想从一个包含 5 个元素的数组开始生成一个随机字典。该字典将代表一个平面图。 如何生成一个随机字典,它是一个平面图,其值和键是数组的 5 个元素? 这是我尝试过的:

q = [0, 1, 2, 3, 4]
d = {i: sample([j for j in q if i != j], randrange(1, len(q) - 1))
     for i in q}

这是它生成的图表示例:

{0: [1], 1: [4, 3], 2: [4], 3: [4], 4: [0, 2]}

如您所见,问题在于 它没有创建适当的邻接矩阵(3 与 1 相连,但 1 不在其邻接矩阵中) 你们中的一些人向我提出了一个已经提出的问题,但是该问题的答案非常复杂,因为它会生成一个非常大的平面图,我在这里尝试做的是一个简单的代码,它生成一个具有 5 个顶点的小平面图.请记住,图形的平面性始终可以通过networkx 中的checkplanarity 进行检查,更多的是here,我需要解决的问题是矩阵的邻接性。

我这样做的原因是然后使用名为coloring 的以下函数为生成的图形着色四种颜色,而矩阵问题使我无法正确着色,以使相同的颜色永远不会接触。要为函数coloring 提供创建的图表,我执行以下操作:

def coloring(adj, V):
    result = [-1] * V
    result[0] = 0
    available = [False] * V
    # add values to adj matrices
    for y in range(0, V):
        for x in adj[y]:
            if y not in adj[x]:
                adj[x].append(y)

    for u in range(1, V):
        for i in adj[u]:
            if (result[i] != -1):
                available[result[i]] = True
        cr = 0
        while cr < V:
            if (available[cr] == False):
                break

            cr += 1

        result[u] = cr

        for i in adj[u]:
            if (result[i] != -1):
                available[result[i]] = False

    for u in range(V):
        print("Vertex", u, " --->  Color", result[u])

要使用创建的图形 d 为函数 coloring 提供数据,我执行以下操作:

coloring([node for node in d.values()], 5)

【问题讨论】:

  • and that has as values the elements of the array? ...这是什么意思?
  • 如果您在高层次上解释平面图是什么(由值列表表示)可能会有所帮助
  • @chitown88 平面图是可以绘制到 2 平面上且没有任何线相互交叉的图。例如,您绘制一个矩形,角点是图中的节点,这将是一个平面图
  • 这能回答你的问题吗? Generate a large random planar graph

标签: python arrays dictionary random graph


【解决方案1】:

让我们用 numpy 来做这件事。

  1. 让我们创建一个随机数在 0 到 9 之间的随机矩阵,大小为 nxn = 5x5
  2. 接下来,让我们将矩阵与其转置相加,以确保它是对称矩阵
  3. 修复对角线 with np.fill_diagonal 以移除自环
  4. 定义条件connectivity,条件越大,随机图中的连接数越少。
  5. 最后将矩阵转换成字典
  6. 情节。
import numpy as np
import networkx as nx

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

生成具有高连接(连接 = 0)的图 -

G = random_graph(5, 0)
g = nx.Graph(G)
print(G)
nx.draw(g)
{0: [1, 2, 3, 4],
 1: [0, 2, 3, 4],
 2: [0, 1, 3, 4],
 3: [0, 1, 2, 4],
 4: [0, 1, 2, 3]}

生成连接数较低的图(连接数 = 8)-

G = random_graph(5, 8)
g = nx.Graph(G)
print(G)
nx.draw(g)
{0: [2, 3], 
 1: [2, 3, 4], 
 2: [0, 1, 4], 
 3: [0, 1], 
 4: [1, 2]}

【讨论】:

  • 谢谢,但我在您提供给我的random_graph 函数中收到以下错误:Traceback (most recent call last): File "c:\Users\besan\OneDrive\Desktop\LAM da correggere\test.py", line 56, in &lt;module&gt; G = random_graph(5, 0) File "c:\Users\besan\OneDrive\Desktop\LAM da correggere\test.py", line 46, in random_graph arr = np.random.randint(0,10,(n,n)) NameError: name 'n' is not defined
  • 另外,如何避免节点连接到自己?
  • 我已经编辑了问题,添加了更多上下文,帮助你帮助我
  • 更新了我的答案,n 是我的错误,已修复!此外,添加了一个附加部分以删除自循环。请检查答案,如果它对您有用,请标记并投票给答案。如果您需要对上述解决方案进行任何具体说明,请告诉我。
  • 谢谢,它现在完美运行,我对这个脚本快疯了。还有一件事,我正在考虑通过生成 0 到 10 之间的随机数来随机化连接。您对如何向图中添加简单的随机元素有更好的想法吗?
【解决方案2】:

对您的代码稍作修改,您就可以对称化您的图表:

import random
random.seed(0)

q = [0, 1, 2, 3, 4]
d = {i: set(random.sample([j for j in q if i != j], random.randrange(1, len(q) - 1)))
     for i in q}

现在对称化:

for node in d:
    for link_target in d[node]:
        d[link_target].add(node)

这种方式节点不会连接到自己,就像在您的代码中一样。您仍然需要验证图形是否是平面的。

设置边数

如果您希望将边数固定为k,您可以执行以下操作:

  1. 生成对角线为零的三角矩阵,使用零(假)和一(真)表示边之间的连通性。您可以通过随机改组 k 个和 N*(N-1)/2 个零并将它们分布到三角矩阵的非对角位置来实现。
  2. 将矩阵的转置添加到自身
  3. 将矩阵转换为您喜欢的字典格式。

注意:还是要确认图形是否是平面的。

【讨论】:

  • 我已经编辑了问题,添加了更多上下文,帮助你帮助我
  • 在不保证对称性的情况下,通过省略 for 循环,上面的代码生成{0: {1, 4}, 1: {2, 4}, 2: {1, 4}, 3: {0, 1, 2}, 4: {0, 1}}。使用for循环保证对称,结果为{0: {1, 3, 4}, 1: {0, 2, 3, 4}, 2: {1, 3, 4}, 3: {0, 1, 2}, 4: {0, 1, 2}}是否解决了你的问题?
  • 不幸的是它没有。在这个问题中,我发布了我的整个着色程序,以便您了解问题所在。同样,我的最终目标是用四种颜色为图形着色,而不用相邻的相同颜色
  • 你如何用udcoloring
  • 我刚刚更新了问题,对此进行了更多解释
猜你喜欢
  • 2011-12-26
  • 2018-06-04
  • 1970-01-01
  • 2016-02-20
  • 2018-03-22
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
相关资源
最近更新 更多