集合实例(集合覆盖)

集合覆盖是一种优化问题,旨在找到最小数量的集合来覆盖另一个集合的所有元素。本文介绍了该问题的背景,解释了算法原理,并提供了一个近似算法的实现。示例展示了如何使用该算法解决具体的集合覆盖问题。
摘要由CSDN通过智能技术生成

集合覆盖是一种优化求解问题,对很多组合数学和资源选择问题给出了很好的抽象模型。 问题如下:给定一个集合S,集合P由集合S的子集A1到An组成,集合C由集合P中的一个或多个子集组成。如果S中的每个成员都包含在C的至少一个子集中则称集合C覆盖集合S。此外,C包含的P的子集越少越好。

设想从一大群选手中挑选人员组建一支队伍,每名选手都拥有特定的技能组合。目标是组建出一只最小的队伍,使得队伍整体拥有一组特定的技能组合。也就是说,对于队伍整体所需要的技能,队伍中至少有一名选手必须拥有这项技能。假定S为队伍所必须拥有的技能集合,P为所有待选选手的技能集合。从P中挑选出一些技能组合以构成C,C必须覆盖S中所要求的所有技能。重要一点,我们选择的选手数量必须尽可能少。

针对集合覆盖的算法是一种近似算法,它并不总是获得最优解。该算法的工作原理是:

不断从P中选出一个集合,使其能够覆盖S中最多的成员数量。换句话说,该算法每次都尝试尽可能早覆盖S中更多的成员,因此该算法采用了贪心法的思路。由于每个集合都是从P中选出的,如果P被移除,则它的成员也将从S中移除。当P中剩余的成员没有任何集合能够覆盖S中的成员时,此时覆盖集合C就完成了。

让我们看看对于12种技能的集合S={a,b,c,d,e,f,g,h,i,j,k,l}的最佳覆盖集。现在考虑有7名待选选手的集合P={A1,...A7}。P中选手拥有的技能集合为:A1={a,b,c,d},A2={e,f,g,h},A3={j,k,l},A4={a,e},A5={b,f,g},A6={c,d,g,h,k,l},A7={l}。最佳覆盖集应该是C={A1,A2,A3}。这里给出的算法选择的集合是C={A6,A2,A1,A3}(见图1)。

集合覆盖问题的函数实现

我们使用函数cover,该函数在集合P的子集A1~An中挑选出能够覆盖集合S的近似最优解。该函数有3个参数:

1、members是待覆盖的集合S;

2、subsets是集合P中的子集;

3、covering作为返回的覆盖集C。

该函数将修改所传入的3个参数,因此在调用该函数时,如果有必要话应该保存一份参数的拷贝。

函数执行过程:开始时,covering通过调用set_init先得到初始化。

我们使用循环进行迭代,只要members中还有未覆盖的成员,且subsets中的子集还没有挑选完,最外层的循环就得继续迭代。

在这个循环中,每次迭代时它都在subsets中找出能够覆盖到members的最大交集。

然后它将这个集合加到覆盖集covering中并把它的成员从members中移除(因为这些成员已经被覆盖,下一次迭代将判断剩余的成员能否被覆盖)。在循环的最后,将所选择的这个集合从su

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值