📜  设置封面问题|集合1(贪心近似算法)

📅  最后修改于: 2021-05-06 21:04:34             🧑  作者: Mango

给定一个由n个元素构成的集合U,则集合U的子集表示S = {S 1 ,S 2 …,S m },其中每个子集S i都有相关的成本。找到覆盖U的所有元素的S的最小成本子集合。

例子:

U = {1,2,3,4,5}
   S = {S1,S2,S3}
   
   S1 = {4,1,3},    Cost(S1) = 5
   S2 = {2,5},      Cost(S2) = 10
   S3 = {1,4,3,2},  Cost(S3) = 3

Output: Minimum cost of set cover is 13 and 
        set cover is {S2, S3}

There are two possible set covers {S1, S2} with cost 15
and {S2, S3} with cost 13.

为什么有用?
这是Karp的NP完全问题之一,在1972年证明是这样。其他应用程序:边缘覆盖,顶点覆盖
有趣的例子:IBM发现计算机病毒(维基百科)
Elements- 5000种已知病毒
设置9000个子字符串,包含20个或更多连续字节的病毒,未在“良好”代码中找到。
找到180张的封面。只需搜索这180个子字符串以验证已知计算机病毒的存在即可。

再举一个例子:考虑到通用汽车需要购买一定数量的各种供应品,并且有一些供应商针对不同的材料组合提供各种交易(供应商A:2吨钢+ 500瓷砖,价格为$ x;供应商B:1吨钢+ $ y的2000个磁贴;以此类推)。您可以使用布套来找到在减少成本的同时获取所有材料的最佳方法
资料来源:http://math.mit.edu/~goemans/18434S06/setcover-tamara.pdf

套装保护套为NP-Hard:
没有可用于该问题的多项式时间解,因为该问题是已知的NP-Hard问题。有一个多项式时间贪婪近似算法,贪婪算法提供了Logn近似算法。

2-近似贪婪算法:
令U为元素的宇宙,{S 1 ,S 2 ,…S m }为U的子集的集合,Cost(S 1 ),C(S 2 ),…Cost(S m )为子集的成本。

1) Let I represents set of elements included so far.  Initialize I = {}

2) Do following while I is not same as U.
    a) Find the set Si in {S1, S2, ... Sm} whose cost effectiveness is 
       smallest, i.e., the ratio of cost C(Si) and number of newly added 
       elements is minimum. 
       Basically we pick the set for which following value is minimum.
           Cost(Si) / |Si - I|
    b) Add elements of above picked Si to I, i.e.,  I = I U Si

例子:
让我们考虑以上示例以了解贪婪算法。

第一次迭代:
我= {}

S 1的每个新元素成本= Cost(S 1 )/ | S 1 – I | = 5/3

S 2的每个新元素成本= Cost(S 2 )/ | S 2 – I | = 10/2

S 3的每个新元素成本= Cost(S 3 )/ | S 3 – I | = 3/4

由于S 3具有最小值S 3 ,所以I变为{1,4,3,2}。

第二次迭代:
I = {1,4,3,2}

S 1的每个新元素成本= Cost(S 1 )/ | S 1 – I | = 5/0
请注意,S 1不会向I添加任何新元素。

S 2的每个新元素成本= Cost(S 2 )/ | S 2 – I | = 10/1
请注意,S 2仅将5加到I。

贪心算法为上述示例提供了最佳解决方案,但可能并非始终都提供最佳解决方案。考虑以下示例。

S1 = {1, 2}
S2 = {2, 3, 4, 5}
S3 = {6, 7, 8, 9, 10, 11, 12, 13}
S4 = {1, 3, 5, 7, 9, 11, 13}
S5 = {2, 4, 6, 8, 10, 12, 13}

Let the cost of every set be same.

The greedy algorithm produces result as {S3, S2, S1}

The optimal solution is {S4, S5} 

证明以上贪心算法为Logn近似。
令OPT为最优解决方案的成本。说(k-1)个元素在上述贪婪算法迭代之前已被覆盖。第k个元素的成本<= OPT /(n-k + 1)(请注意,元素的成本由其集合的成本除以该集合所添加的元素数量来评估)。我们是怎么得到这个结果的?由于第k个元素尚未覆盖,因此有一个S i在贪婪算法的当前步骤之前尚未覆盖,并且在OPT中存在。由于贪心算法选择了最具成本效益的S i ,所以选择集中的每个元素成本必须小于OPT除以其余元素。因此,第k个元素的成本<= OPT / | UI | (请注意,UI是贪婪算法中尚未涵盖的元素集)。 | UI |的值是n-(k-1),即n-k + 1。

Cost of Greedy Algorithm = Sum of costs of n elements 
                        [putting k = 1, 2..n in above formula]
                         <= (OPT/n + OPT(n-1) + ... + OPT/n) 
                         <= OPT(1 + 1/2 + ...... 1/n)
                        [Since 1 + 1/2 + .. 1/n ≈ Log n]
                         <= OPT * Logn

来源:
http://math.mit.edu/~goemans/18434S06/setcover-tamara.pdf