启发式算法在一个图表中找到最大权重独立集合

时间:2015-06-18 17:32:08

标签: algorithm graph graph-algorithm linear-programming np-complete

MWIS(最大权重无关集)是一个NP完全问题,所以如果P!= NP,我们找不到足够好的时间复杂度的解决方案。

我正在寻找一种能够在良好的时间复杂度内找到任意图形中MWIS的近似值的算法。我目前正在研究一个包含128个节点和3051个边缘的连通图。

我找到了this paper,但它似乎只适用于具有独特MWIS的二分图。

如果有人可以帮我提供一些参考资料,或者使用工作算法的伪代码,我会很高兴。

3 个答案:

答案 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 }} 函数。