[英]Return keys when solving Set Cover problem with a dictionary and the greedy algorithm
[英]greedy set cover algorithm
所以,我从
我试图了解布景和布景,因此,我对此进行了一些修改。
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])
或覆盖最大可用值的内容。
您的代码的问题是没有覆盖,因为有一个额外的4。我的理解是,根据定义,集合覆盖问题指定S
中所有集合的并集必须等于U
这样就不应该有额外的4个。
由于您的程序直到找到完美的覆盖后才会停止(即,只要len(R) != 0
),它就永远不会在此输入上停止。 您正在将无效输入传递给算法。
顺带一提,我强烈建议不要使用一揽子except
条款来测试零除。 不好用try/except
; 我认为在这种情况下,您应该在飞跃之前先看一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.