Facebook
From Melodic Tapir, 3 Years ago, written in Python.
Embed
Download Paste or View Raw
Hits: 78
  1.  
  2. import itertools
  3.  
  4. kohteet = ("kettu", "kana", "vilja")
  5. kielletyt = [("kettu", "kana"),
  6.              ("kana", "vilja")
  7.             ]
  8.  
  9. g = Graph()
  10.  
  11. for vene in range(2):
  12.     for c in itertools.chain.from_iterable(itertools.combinations(kohteet, r) for r in range(3+1)):
  13.         c1 = tuple(x for x in kohteet if x not in c) #aloituspuoli
  14.         y = c1 if vene else c
  15.         if any(all(k in y for k in ks) for ks in kielletyt): continue
  16.         g.add_vertex((c1, vene))
  17.  
  18. vs = g.vertices()
  19.    
  20. for i1, v1 in enumerate(vs):
  21.     c1, vene1 = v1
  22.     for v2 in vs[i1+1:]:
  23.         c2, vene2 = v2
  24.        
  25.         if vene1==vene2: continue
  26.         if vene1==0: #vienti
  27.             if not set(c2).issubset(set(c1)) or abs(len(c1)-len(c2))>1: continue
  28.         if vene1==1: #takaisin tuonti
  29.             if not set(c1).issubset(set(c2)) or abs(len(c1)-len(c2))>1: continue
  30.        
  31.         g.add_edge(v1, v2)
  32.  
  33.    
  34. g.show(figsize=8)
  35. for p in g.all_paths((kohteet, 0), (tuple(), 1)):
  36.     print (p)
  37.  
  38.