贪心集盖算法

时间:2013-09-19 11:46:36

标签: python algorithm set

所以,我从

中选择了这段代码

How do I make my implementation of greedy set cover faster?

我正在尝试理解集合并设置封面,所以我稍微修改了一下。

U = set([1,2,3,4])
R = U
S = [set([1,2]), 
     set([1]), 
     set([1,2,3]), 
     set([1]), 
     set([3]), 
     set([1,2]), 
     set([3]), 
     set([1,2,3])]
w = [1, 1, 1, 1, 1, 1, 1, 1]

C = []
costs = []

def findMin(S, R):
    minCost = 99999.0
    minElement = -1
    for i, s in enumerate(S):
        try:
            cost = w[i]/(len(s.intersection(R)))
            if cost < minCost:
                minCost = cost
                minElement = i
        except:
            # Division by zero, ignore
            pass
    return S[minElement], w[minElement]

while len(R) != 0:
    S_i, cost = findMin(S, R)
    C.append(S_i)
    R = R.difference(S_i)
    costs.append(cost)

print "Cover: ", C
#print "Total Cost: ", sum(costs), costs

可以看出,U的值为1,2,3,4。这些集合中没有4个。 我不了解重量,所以把它们作为1。

预期输出:set([1,2])set([3])set([1,2,3])或涵盖最大可用内容的内容。

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是 没有封面,因为还有一个额外的4.我的理解是,根据定义,集合封面问题指定{{1中的所有集合的并集必须等于S。所以额外的4不应该存在。

由于你的程序没有停止,直到它找到一个完美的封面(即只要U),它就永远不会停止在这个输入上。您将无效输入传递给算法。

在旁注中,我强烈建议不要使用一揽子len(R) != 0条款来测试零分割。这不是except的好用;我认为这是一个你应该在跳跃之前看的情况。