私はカバー問題を設定するのが初めてで、Pythonで単純なインスタンスを解決するための単純な貪欲なアルゴリズムを書くことができました。
Universe = set([1,2,3,4,5,6,7,8])
Subsets = [set([1,2]),
set([3,4]),
set([5,6]),
set([7,8]),
set([2,4,6,8]),]
weights = [1,1,1,1,1]
C = []
costs = []
def findMin(Subsets, Universe):
minCost = 99999.0
minElement = -1
for i, s in enumerate(Subsets):
try:
cost = weights[i]/(len(s.intersection(Universe)))
if cost < minCost:
minCost = cost
minElement = i
except:
# Division by zero, ignore
pass
return Subsets[minElement], weights[minElement]
while len(Universe) != 0:
S_i, cost = findMin(Subsets, Universe)
C.append(S_i)
Universe = Universe.difference(S_i)
costs.append(cost)
print("Cover: ", C)
print("Total Cost: ", sum(costs), costs)
これは問題なく動作しますが、粒子群最適化などの最適化アルゴリズムを問題に適用したいと考えていますが、問題をアルゴリズム (および他の発見的アルゴリズム) の目的関数として定式化することはできません。助けてください。