Advertisement
Guest User

Over-engineering Combinatoric Problem

a guest
Feb 12th, 2021
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.98 KB | None | 0 0
  1. import json
  2. from copy import deepcopy
  3. import random
  4. import quantumrandom
  5.  
  6. # Seeding the PRNG with True Randomness
  7. # from a Quantum Random Number Generator
  8. seed = quantumrandom.randint(1, 100)
  9. random.seed(int(seed))
  10.  
  11. # integers only and list of lists only
  12. s =  input("Input list of integers (no repeating elements) for S with commas (eg. 1,2,3,4...) : ").split(',')
  13. c =  input('enter list for C (eg. [1,2,3],[4,5,6]): ')
  14. c = json.loads(c)
  15. s = [int(a) for a in s]
  16. c_copy = deepcopy(c)
  17.  
  18. miss = []
  19. delete = []
  20. def input_validation():
  21.     # checking for missing elements.
  22.     for a in c:
  23.         for b in a:
  24.             miss.append(b)
  25.     for d in s:
  26.         if d not in miss:
  27.             print('False', d)
  28.     # Throw out unwanted orderings of sub-lists
  29.     for a in range(0, len(c)):
  30.         c[a] = sorted(c[a])
  31.     # Lists are treated as sets, so lists
  32.     # with repeating elements is thrown out
  33.     for r in range(0, len(c)):
  34.         if len(c[r]) != len(set(c[r])):
  35.             c[r] = [['xx']]
  36.     # Throw out lists that have elements that do
  37.     # not exist in s.
  38.     # Throw out lists with more than 3
  39.     # Throw out lists less than 3
  40.     for a in range(0, len(c)):
  41.       for b in c[a]:
  42.         if c[a].count(b) > 1:
  43.           delete.append(c[a])
  44.           break
  45.         if len(c[a]) != 3:
  46.           delete.append(c[a])
  47.       for bb in c[a]:
  48.         if bb not in s:
  49.           delete.append(c[a])
  50.     for b in delete:
  51.       if b in c:
  52.         del c[c.index(b)]
  53. s_copy = deepcopy(s)
  54. input_validation()
  55. # remove repeating lists
  56. c = [c[x] for x in range(len(c)) if not(c[x] in c[:x])]
  57. def bijective_mapp():
  58.     for a in range(0, len(s)):
  59.         s[a] = a+1
  60.     for b in range(0, len(c)):
  61.         for bb in range(0, len(c[b])):
  62.             c[b][bb] = s_copy.index(c[b][bb])+1
  63. bijective_mapp()
  64. n = len(s)
  65. steps = n*(2**1)*((n*(2**1))-1)*((n*(2**1))-2)//6
  66. reset = 0
  67. c_elem = set()
  68. set_cover = []
  69. partial = []
  70. for a in range(0, steps + 1):
  71.     reset = reset + 1
  72.     if reset > len(c):
  73.         c_elem = set()
  74.         reset = 0
  75.         x={sublist[0] for sublist in c}
  76.         order=list(range(len(x)))
  77.         random.shuffle(c)
  78.         ord_map=dict(zip(x,order))
  79.         c = sorted(c, key=lambda sublist: ord_map[sublist[0]])
  80.         set_cover = []
  81.     c.append(c[0])
  82.     del(c[0])
  83.     for l in c:
  84.         if not any(v in c_elem for v in l):
  85.             set_cover.append(l)
  86.             c_elem.update(l)
  87.     # if exact solution not found,
  88.     # then use partial solution
  89.     if set_cover not in partial:
  90.         partial.append(set_cover)
  91. list_of_partials = [len(r) for r in partial]
  92. k = partial[list_of_partials.index(max(list_of_partials))]
  93. # Reversing the Bijective mapping
  94. # to the original input.
  95. for a in range(0, len(k)):
  96.     for b in range(0, len(k[a])):
  97.         l = s.index(k[a][b])
  98.         k[a][b] = s_copy[l]
  99. for a in range(0, len(k)):
  100.   k[a] = sorted(k[a])
  101. for a in c_copy:
  102.   if sorted(a) in k:
  103.     l = k.index(sorted(a))
  104.     k[l] = a
  105. print(k)
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement