coffeebeforecode

set_cover_python_greedy.py

Dec 7th, 2021 (edited)
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.31 KB | None | 0 0
  1. def set_cover(universe, subsets,costs):
  2.     cost=0
  3.     elements = set(e for s in subsets for e in s)
  4.     if elements != universe:
  5.         return None
  6.     covered = set()
  7.     cover = []
  8.     while covered != elements:
  9.         subset = max(subsets, key=lambda s: len(s - covered)/costs[subsets.index(s)])
  10.         #cover.append(subset)
  11.         cover.append(subsets.index(subset))
  12.         cost+=costs[subsets.index(subset)]
  13.         covered |= subset
  14.  
  15.     return cover, cost
  16.  
  17. def main():
  18.     #universe = set(range(1, 11))
  19.     #universe = list(map(int, input("Universal set: ").split()))
  20.     universe = set()
  21.     #m = int(input("Number of subsets: "))
  22.     m = 6
  23.     subsets = list()
  24.     costs = list()
  25.     for i in range(1, m+1):
  26.         print("S" + str(i) +" = ", end='')
  27.         s = set(map(int, input().split()))
  28.         subsets.append(s)
  29.         universe |= s
  30.         print("Cost(S"+str(i)+")=", end='')
  31.         c = int(input())
  32.         costs.append(c)
  33.        
  34.     cover, cost = set_cover(universe, subsets, costs)
  35.     print("Cost =", cost)
  36.     #print("Result =",cover)
  37.     print("Result={", end='')
  38.     for i in range(len(cover)):
  39.         print("S" + str(cover[i]+1), end='')
  40.         if (i != len(cover) - 1):
  41.             print(end=",")
  42.     print(end="}")
  43.    
  44. if __name__ == '__main__':
  45.     main()
Add Comment
Please, Sign In to add comment