MWIS(最大权重无关集)是一个NP完全问题,所以如果P!= NP,我们找不到足够好的时间复杂度的解决方案。
我正在寻找一种能够在良好的时间复杂度内找到任意图形中MWIS的近似值的算法。我目前正在研究一个包含128个节点和3051个边缘的连通图。
我找到了this paper,但它似乎只适用于具有独特MWIS的二分图。
如果有人可以帮我提供一些参考资料,或者使用工作算法的伪代码,我会很高兴。
答案 0 :(得分:2)
可以将此表述为以下问题。假设图中的每个顶点 v 的权重为 w(v)。你定义一个变量 x(v),并使用一些开箱即用的线性编程求解器来解决
max \ sum_v w(v)x(v)(最大化所选顶点的权重)
受
的约束x(u)+ x(v)< = 1,(u,v)\ in E (不要带邻居)
和
x(v)\ in {0,1} (只能选择是否取一个顶点)
这是一个组合问题(最后一个约束是顶点数的指数)。有两种方法可以从这里继续:
将最后一个约束切换为
x(v)\ in [0,1] (您选择顶点的程度)
使用LP解算器解决它,并继续this paper, 4.3。
在下面的评论中,David Eisenstat声称,对于图表的大小,整数解算器会很好(并产生更好的结果)
答案 1 :(得分:0)
如@Ami所引用的论文中所建议的,这是为MWIS查找最小加权度顶点的代码。
import networkx as nx import numpy as np graph = nx.generators.random_graphs.barabasi_albert_graph(50,10) for u in graph: graph.nodes[u]['weight'] = np.random.uniform(0,1) adj_0 = nx.adj_matrix(graph).todense() a = -np.array([graph.nodes[u]['weight'] for u in graph.nodes]) IS = -np.ones(adj_0.shape[0]) while np.any(IS==-1): rem_vector = IS == -1 adj = adj_0.copy() adj = adj[rem_vector, :] adj = adj[:, rem_vector] u = np.argmin(a[rem_vector].dot(adj!=0)/a[rem_vector]) n_IS = -np.ones(adj.shape[0]) n_IS[u] = 1 neighbors = np.argwhere(adj[u,:]!=0) if neighbors.shape[0]: n_IS[neighbors] = 0 IS[rem_vector] = n_IS print IS
IS是最小加权独立集。
答案 2 :(得分:0)
要解决 MWIS,您可以在补充图上使用最大权重团求解器。 TSM-MWC 是一个用 C 实现的快速算法。如果你的图不是太大,你可以使用 Python 中的 Networkx 解决这个问题:这里是 complement
和 {{3 }} 函数。