簡體   English   中英

python的頂點着色-色數X(G)

[英]Vertex coloring by python- Chromatic number X(G)

我正在嘗試在 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()

此代碼中存在多個問題:

  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 圖。 查看networkx 的網站 G.add_nodes_from([1,2,3,4,5]) , G.add_edges_from([(1,2),(1,3),(1,4),(1,5),(4,5)]) , G.nodes()

以下是您編輯后的工作格式代碼。

作者= '布倫特'

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 中的一個示例:

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 完全的)。 然而,它非常緊湊。

您應該發布您遇到的錯誤、您所期望的以及實際發生的情況。

至少,這個:

color_of_neighbor = colors_of_nodes(neighbor)

將引發TypeError: 'dict' object is not callable錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM