问题描述
我有一个二部图 G =(U,V,E),该图的顶点分为两个不相交的 U 和 V组,这样 E 中的每个边都将 U 中的顶点连接到 V 中的顶点。 我将边缘转换为“覆盖”,即边缘(u,v)意味着顶点 u 可以覆盖顶点 v 。>
U 中的一个顶点可以覆盖 V 中的一个以上的顶点,而 V 中的一个顶点可以被 V 中的一个以上的顶点覆盖 U 。
我想找到 U 中的最小顶点集(最小基数),以覆盖至少 V 个 s 个顶点,这样 s 是整数, 0 。如果 V 中的一个顶点被这样一个最小集合中的多个顶点覆盖,那就很好了。
如果我们还考虑边缘的权重,是否可以找到这样一组最小的顶点,以确保这些顶点的出线边缘具有最大的权重总和(最大覆盖率)?我的意思是,如果有多个这样的最小顶点集(全部具有相同的基数),我们能否找到具有最大基数的最小顶点集?或者至少,我们是否可以找到所有这些最小集,以便稍后过滤掉最大输出权重的那个集?
解决方法
因此,通过从set cover减少(这个问题s < |V|
有点减速,这个问题是NP难题的,但是我们可以复制V
中的每个顶点并进行设置) s = 2 |V| - 1
。
实际上,您可以使用整数编程解决此问题。整数程序如下所示:
0-1 variables x_u for u in U; x_u = 1 means that u is selected
0-1 variables y_v for v in V; y_v = 1 means that v is covered
minimize sum_{u in U} x_u
subject to
sum_{v in V} y_v ≥ s
for each v in V,y_v ≤ sum_{u in U such that u covers v} x_u
对于加权版本,首先求解非加权版本以找到最佳目标(我们将其称为k
)。然后添加一个新的约束并解决一个新的目标:
0-1 variables x_u for u in U; x_u = 1 means that u is selected
0-1 variables y_v for v in V; y_v = 1 means that v is covered
minimize sum_{u in U} x_u (sum_{v in V such that u covers v} weight(uv))
subject to
sum_{u in U} x_u ≤ k
sum_{v in V} y_v ≥ s
for each v in V,y_v ≤ sum_{u in U such that u covers v} x_u
您将需要一个MIP求解器库,例如OR-Tools。