![](/img/trans.png)
[英]exact gurobi solver for chromatic number of coloring problem [error in the objective]
[英]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()
此代碼中存在多個問題:
Purpul
-> Purple
colors_of_nodes
是一個字典,因此它不能作為函數調用。 所以colors_of_nodes(neighbor)
會失敗。 您可以通過兩種方式為字典建立索引colors_of_nodes[node]
或colors_of_nodes.get(node, default_value_if_node_is_not_a_key)
。 你想做第二個。G.neighbors(node)
。 此外,邊是不可散列的set
,因此不能是字典鍵。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.