【发布时间】:2019-08-15 19:35:24
【问题描述】:
我很难用算法来创建我将为图表着色的顺序。 让我们考虑下图:
import networkx as nx
from matplotlib import pyplot as plt
nodes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
edges = [(1, 2), (2, 3), (3, 4), (4, 5), (1, 5), (5, 6), (6, 10),
(6, 7), (4, 7), (3, 8), (7, 8), (8, 9), (8, 11)]
# Create the graph
G = nx.Graph()
# Add edges
G.add_edges_from(edges)
# Plot
nx.draw(G, with_labels=True, font_size = 16)
plt.show()
我想有多个起点,称为initial_nodes,并在相邻节点周围创建订单。对于上图,我们将起始节点视为节点2 和7。
顺序是:
# Step 1: - Initial nodes
order = [2, 7]
# Step 2: - Nodes adjacent to the initial nodes
order = [2, 7, 1, 3, 4, 6, 8]
# Step 3: - Nodes adjacent to the nodes added in the previous step
# If they are not already present in the order...
order = [2, 7, 1, 3, 4, 6, 8, 5, 10, 9, 11]
我觉得递归方法应该很好用,但我不知道如何写下来。有什么想法吗?
编辑:所有问题都描述了一点further。
当前创建订单的算法:
def create_node_order(graph, initial_nodes):
"""
Create the node order.
"""
# Initialization
order = initial_nodes
next_nodes = list()
for node in initial_nodes:
for adj_node in graph.adj[node].keys():
if adj_node not in order:
order.append(adj_node)
next_nodes.append(adj_node)
while len(next_nodes) != 0:
for node in next_nodes:
for adj_node in graph.adj[node].keys():
if adj_node not in order:
order.append(adj_node)
next_nodes.append(adj_node)
next_nodes.remove(node)
return order
【问题讨论】:
-
目标是达到任何着色还是需要找到最小着色?我知道没有证据表明这种方法会产生最佳着色。通常着色的顺序非常重要,我知道的一些方法需要回溯,这意味着“顺序”对它们毫无意义。
-
@EtienneOtt 我不是图论专家......从我读到的内容来看,没有算法可以有效地(小于指数时间)达到最佳着色。我还不知道回溯到底是什么。据我所见,它是沿着一条路走下去,然后再往上走以校正颜色,以实现更好的全局着色。目前,我不想使用回溯,我想尝试一种贪婪的方法。我不会描述整个问题,但我上面描述的顺序是根据我的数据和我试图实现的颜色明智地选择的。
-
@EtienneOtt 我只是想不出一个算法来有效地创建这个订单......虽然我觉得递归方法是正确的选择,但我不知道如何写下来.
标签: python networkx graph-theory graph-coloring