假设图由具有值和无向边的节点组成
我想将图表划分为 我选择的几个组 ,因为它符合 每个分区组具有相似或相同的值总和的条件 该节点具有。
您能否建议使用哪种算法对图表进行分区,并满足我提到的条件?
如果您附加使用python或java实现的算法,我将非常感激。
(为了您的理解,我们附上了图片和数据类型。)
<Data information>
[node_id]: n_1, n_2, n_3 ,, etc
[node_value]: 10, 5, 20,, etc
[node_adjacency_data] : Please refer to the attached picture.
[node_latitude]: 37.25201, 37.25211, 37.25219,, etc
[node_longitude]: 127.10195, 127.11321, 127.11377,, etc
答案 0 :(得分:1)
首先,这个问题是NP-Hard,所以你将无法获得这个问题的完美解决方案。然而,实际上有很多研究旨在以这种方式划分图形。通过查找顶点加权图分区开始搜索。
以这种方式划分图形的最着名的算法是METIS,并且优化的C实现有一个good Python wrapper(您必须单独构建/安装)。它需要networkx图或简单的邻接列表作为输入。
METIS采用带有加权顶点和边的图形,并返回到给定数量的分区,同时最小化被切割边缘的权重。您仍然需要选择要将图表分成多少部分。
以下是使用Python METIS库解决您提供的示例问题的示例代码:
import networkx as nx
import metis
# Set up graph structure
G = nx.Graph()
G.add_edges_from([ (0,1), (0,2), (0,3), (1, 2), (3, 4) ])
# Add node weights to graph
for i, value in enumerate([1,3,2,4,3]):
G.node[i]['node_value'] = value
# tell METIS which node attribute to use for
G.graph['node_weight_attr'] = 'node_value'
# Get at MOST two partitions from METIS
(cut, parts) = metis.part_graph(G, 2)
# parts == [0, 0, 0, 1, 1]
# Assuming you have PyDot installed, produce a DOT description of the graph:
colors = ['red', 'blue']
for i, part in enumerate(parts):
G.node[i]['color'] = colors[part]
nx.nx_pydot.write_dot(G, 'example.dot')
然后我们可以使用GraphViz来显示分区:
您在问题中提供的分区与此相同。