我有网络(大和小),我需要修剪,直到只剩下隔离物。我想最大化分离株的数量。有算法可以做到这一点吗?如果它更复杂? (例如,在底部也可能有连接的节点)
考虑这个简单的例子:
import networkx as nx
G = nx.DiGraph()
G.add_edges_from([(1,2), (2,3), (2,4), (3,5), (3,6), (4,7), (4,8),
(1,2+9), (2+9,3+9), (2+9,4+9), (3+9,5+9), (3+9,6+9), (4+9,7+9), (4+9,8+9) ])
这里,最佳解决方案是删除节点1,3,4,11和12.
答案 0 :(得分:1)
这听起来像是要计算Maximum Independent Set(一般图 NP-hard )。 (维基百科还提到名称顶点包装)。
Networkx有approximation algorithm。
也许你的近似值是不够的(我认为没有预建替代品)。
根据上面的维基百科链接,igraph中有一个确切的算法。
另外请记住,这种近似算法适用于通用图,因此可能非常有可能,树有更好的方法。
修改(不检查)This SO-answer presents an algorithm for trees(问题可能重复)。