【问题标题】:Vertex coloring by python- Chromatic number X(G)python的顶点着色-色数X(G)
【发布时间】:2012-04-05 10:57:32
【问题描述】:

我正在尝试在 python 中编写一个小代码来为图形顶点着色,并计算使用的颜色数量,因此没有两个连接的顶点具有相同的颜色。 这是我的代码,我不知道它有什么问题,有什么帮助吗? 这不是家庭作业!

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()

colors = ['Red', 'Blue', 'Green', 'Yellow',  'Black','Pink','Orange','White','Gray','Purpul','Brown','Navy']

G.nodes = [1,2,3,4,5]
G.edges= [{1,5},{1,3},{1,2},{1,4},{4,5}]
colors_of_nodes={}

def coloring(node, color):
   for neighbor in G.edges:
       color_of_neighbor = colors_of_nodes(neighbor)
       if color_of_neighbor == color:
          return False

   return True

def get_color_for_node(node):
    for color in colors:
       if coloring(node, color):
          return color

def main():
    for node in G.nodes:
        colors_of_nodes[node] = get_color_for_node(node)

    print colors_of_nodes


main()

【问题讨论】:

  • 在哪里可以找到此示例的完整源代码,它是开放的吗?提前致谢

标签: python graph colors theory vertex


【解决方案1】:

此代码中有多个问题:

  1. 小拼写错误Purpul -> Purple
  2. 语法错误:colors_of_nodes 是字典,因此不能作为函数调用。所以colors_of_nodes(neighbor) 会失败。您可以通过colors_of_nodes[node]colors_of_nodes.get(node, default_value_if_node_is_not_a_key) 两种方式为字典编制索引。你想做第二个。
  3. 逻辑错误:邻居被设置为边缘值而不是节点。您想要循环遍历作为邻居或特定节点的节点。幸运的是,networkx 有一个简单的功能:G.neighbors(node)。此外,一条边是 set,它是不可散列的,因为它不能是字典键。
  4. 语义错误:您没有使用正确的语义来创建和访问 networkx 图。看the website for networkxG.add_nodes_from([1,2,3,4,5]), G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(4,5)]), G.nodes()

以下是您编辑后的工作格式代码。

作者 = 'brent'

import networkx as nx
import matplotlib.pyplot as plt
G=nx.Graph()

colors = ['Red', 'Blue', 'Green', 'Yellow',  'Black', 'Pink', 'Orange', 'White', 'Gray', 'Purple', 'Brown', 'Navy']

G.add_nodes_from([1,2,3,4,5])
G.add_edges_from([(1,5),(1,3),(1,2),(1,4),(4,5)])
colors_of_nodes={}


def coloring(node, color):
   for neighbor in G.neighbors(node):
       color_of_neighbor = colors_of_nodes.get(neighbor, None)
       if color_of_neighbor == color:
          return False

   return True

def get_color_for_node(node):
    for color in colors:
       if coloring(node, color):
          return color

def main():
    for node in G.nodes():
        colors_of_nodes[node] = get_color_for_node(node)

    print colors_of_nodes


main()

请注意,这是一种用于为图形着色的贪心技术,并不一定会为您提供最佳的图形着色。

【讨论】:

  • 它是 python,你需要将 matplotlib 和 networkx 包添加到你的 requirements.txt 和 pip install -r requirements.txt 中。如果您是 python 新手(或者说实话甚至不是 python 新手),anaconda 是一个不错的起点。 continuum.io/downloads 。 networkx 链接在帖子中。不知道你还需要什么,python your_file_name.py
【解决方案2】:

您应该发布您遇到的错误、您期望的错误以及实际发生的错误。

至少,这个:

color_of_neighbor = colors_of_nodes(neighbor)

将引发TypeError: 'dict' object is not callable 错误。

【讨论】:

    【解决方案3】:

    找到色数的另一种方法是将此程序转换为线性优化问题并将其提供给求解器。以下是 Python 中的示例:

    from pulp import *
    
    edges = [(1,2), (3,2), (2,4), (1,4), (2,5), (6,5), (3,6), (1,5)]
    n = len(set([u for u, v in edges] + [v for u, v in edges]))
    
    model = LpProblem(sense=LpMinimize)
    
    chromatic_number = LpVariable(name="chromatic number", cat='Integer')
    variables = [[LpVariable(name=f"x_{i}_{j}", cat='Binary') \
                  for i in range(n)] for j in range(n)]
    
    for i in range(n):
        model += lpSum(variables[i]) == 1
    
    for u, v in edges:
        for color in range(n):
            model += variables[u - 1][color] + variables[v - 1][color] <= 1
    
    for i in range(n):
        for j in range(n):
            model += chromatic_number >= (j + 1) * variables[i][j]
    
    model += chromatic_number
    
    status = model.solve(PULP_CBC_CMD(msg=False))
    
    print("chromatic number:", int(chromatic_number.value()))
    print("\n".join([f"vertex {i} has color {j}" \
          for i in range(n) for j in range(n) if variables[i][j].value()]))
    

    我正在使用pulp Python 库。这种方法总是会产生色数,但对于较大的图是不可行的(因为这个问题是 NP 完全的)。但是,它非常紧凑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2011-05-24
      相关资源
      最近更新 更多