我正在尝试在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()
答案 0 :(得分:3)
此代码中存在多个问题:
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()
以下是您编辑的工作格式代码。
作者 ='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()
请注意,这是一种用于着色图形的贪婪技术,并不一定能为您提供图形的最佳着色。
答案 1 :(得分:0)
您应该发布您正在获得的错误,您期望的错误以及实际发生的错误。
最低限度,这个:
color_of_neighbor = colors_of_nodes(neighbor)
会引发TypeError: 'dict' object is not callable
错误。
答案 2 :(得分:0)
另一种找到色数的方法是将此程序转换为线性优化问题并将其提供给求解器。这是 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 完全的)。然而,它非常紧凑。