集合覆盖问题matlab,集合覆盖问题 NP问题的近似解

Set Cover problem是计算机算法复杂度领域的经典问题。

问题如下定义:首先有一个元素集合U,给定一系列集合,各集合之中含可能有一些共同的元素(如图所示)。要求访问最少的集合,可以得到U中所有的元素,求出满足要求的最少数量的集合,它是Karp’s

21个NP-complete问题之一。

可以给出公式定义:

给定一个元素集合{U}和集合{S},Si中的元素属于U,即S是U的子集集合。我们要求的一个覆盖就是一个集合C其元素集合之并等于U即:

a4c26d1e5885305701be709a3d33442f.png

用图示表明:

Input:

a4c26d1e5885305701be709a3d33442f.pngOutput:

a4c26d1e5885305701be709a3d33442f.png

Set

cover问题通常在我们寻求高效获取被package起来的项或者寻求一种最优的项表述时出现,显然找到一个cover很简单,但我们目的是求的最优,这样才能更好的节约成本。

我们知道,所有的NP-C(NP完全问题)都还没有多项式时间算法。而当我们遇到这类问题时我们通常采用只对特殊问题求解,动态规划或分支定界,概率算法,只求近似解或者启发式方法求解。

下面就使用贪婪算法给出近似解:

首先给出如下函数定义

a4c26d1e5885305701be709a3d33442f.png

给出贪婪算法:

a4c26d1e5885305701be709a3d33442f.png

下面对此算法进行分析:

此贪婪算法已被证明是set cover问题的一个多项式时间复杂度,(1+In

r)ratio近似算法,其中r是输入S中集合的最大的集的势。

证明:假设S1,S2…Sj是通过贪婪算法依次选择的集合,Ci={S1,S2…Si},opt是满足集合覆盖最优解的集合数,由于贪婪规则,显然,当我们选择Si+1时Si+1必定覆盖了当前还未被Ci覆盖的最多元素。还未被Ci覆盖的元素是|U|-f(Ci),他们可以被opt个子集合最优覆盖。因此,按平均来算,最优解集合的一个子集可以覆盖(|U|-f(Ci))/opt个没有被Ci覆盖的元素,因此推出:

a4c26d1e5885305701be709a3d33442f.png

解决Set cover问题的贪婪算法已经被证明是解决set cover问题的最可能的多项式时间复杂度近似算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值