簡體   English   中英

貪婪集覆蓋算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM