Advertisement
Guest User

Untitled

a guest
Aug 29th, 2014
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.61 KB | None | 0 0
  1. import random
  2. import string
  3.  
  4. def make_groups(ppl, forbidden, gsize):
  5.     assert len(ppl) % gsize == 0
  6.  
  7.     edges = set()
  8.     for (a, b) in forbidden:
  9.         edges.add((a, b))
  10.         edges.add((b, a))
  11.  
  12.     ppl = list(ppl)
  13.     random.shuffle(ppl)
  14.     groups = [ ppl[gsize*i:gsize*(i+1)] for i in range(len(ppl) // gsize) ]
  15.  
  16.     while True:
  17.         random.shuffle(groups)
  18.  
  19.         found_bad = False
  20.  
  21.         for g in groups:
  22.             bad = []
  23.             for i in range(gsize):
  24.                 for j in range(i + 1, gsize):
  25.                     if (g[i], g[j]) in edges:
  26.                         bad.append((i, j))
  27.  
  28.             if len(bad) > 0:
  29.                 found_bad = True
  30.                 fix = random.choice(random.choice(bad))
  31.                 other_group = random.randint(0, len(groups) - 1)
  32.                 other_idx = random.randint(0, gsize - 1)
  33.                 g[fix], groups[other_group][other_idx] = groups[other_group][other_idx], g[fix]
  34.  
  35.         if not found_bad:
  36.             break
  37.  
  38.     return groups
  39.  
  40.  
  41. def rand_str(n):
  42.     return ''.join( random.choice(string.ascii_lowercase) for i in range(n) )
  43.  
  44. n = 200
  45. ppl = set([ rand_str(5) for i in range(n) ])
  46. forbidden = set()
  47.  
  48. for p in ppl:
  49.     cnt = random.randint(0, 10)
  50.     for c in range(cnt):
  51.         forbidden.add((p, random.choice(list(ppl))))
  52.  
  53. print(ppl)
  54. for a, b in forbidden:
  55.     print(a, b)
  56.  
  57. for g in make_groups(ppl, forbidden, 4):
  58.  
  59.     for i in range(len(g)):
  60.         for j in range(i + 1, len(g)):
  61.             assert (g[i], g[j]) not in forbidden
  62.             assert (g[j], g[i]) not in forbidden
  63.  
  64.     print(g)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement