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

📅  最后修改于: 2021-10-26 02:35:54             🧑  作者: Mango

给定一个包含 n 个元素的宇宙 U,U 的子集集合说 S = {S 1 , S 2 …,S m },其中每个子集 S i都有相关的成本。找出 S 的一个最小成本子集合,它覆盖了 U 的所有元素。

例子:

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 发现计算机病毒(维基百科)
元素 – 5000 种已知病毒
集合 – 来自病毒的 20 个或更多连续字节的 9000 个子字符串,在“好”代码中找不到。
发现了 180 套的封面。搜索这180个子串就足以验证已知计算机病毒的存在。

另一个例子:考虑通用汽车需要购买一定数量的各种供应品,并且有供应商针对不同的材料组合提供各种交易(供应商 A:2 吨钢材 + 500 块瓷砖,价格为 x 美元;供应商 B:1 吨钢材+ 2000 块 y 美元;等等)。您可以使用集合覆盖来找到获得所有材料的最佳方式,同时最大限度地降低成本
资料来源:http://math.mit.edu/~goemans/18434S06/setcover-tamara.pdf

Set Cover 是 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}。

第二次迭代:
我 = {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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。