在二部图的集合U中选择最小数目的顶点以覆盖集合V

问题描述

我有一个二部图 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...