2017-06-12 7 views
2

私は2タプルのリストを持っており、そのリストからできるだけ多くの3タプルを生成したいと考えています。例:今、私はこのリストから生成可能な巡回3タプルの最大量を見つけるしたいと思います2タプルのリストから3タプルの最大数を生成する

a = [(1, 2), (1, 3), ..., (1, 9), (2, 3), ..., (8, 9)] 

すなわち

#!/usr/bin/python 
import itertools 
a = list(itertools.combinations([1,2,3,4,5,6,7,8,9], 2)) 

、そのような3つのタプルは次のようになります。

(1,2),(2,3),(1,3) -> (1,2,3) 

各2タプルは1回のみ使用できます。私はブルートフォースのアプローチを使うことができると思いますが、もっとスマートな方法でやり遂げることができると感じています。何かご意見は?

関心のある人にとって、問題はスケジューリングの問題です。 nチームはシーズン中に一度お互いにプレイしなければなりません。シーズンはいくつかのトーナメントで構成されています。トーナメントは3チーム全員がお互いにプレーしている理想的なトーナメントです(トーナメントで合計3試合)。目標は2つのチームだけでトーナメントを回避することです。

+0

あなたはこれを関連付けることができます[グラフのサイクル](http://www.geeksforgeeks.org/detect-cycle-undirected-graph/)? –

+0

私は推測していますが、無向グラフのエッジでこれを考えると、完全なグラフ(https://en.wikipedia.org/wiki/Complete_graph)を扱っています。このグラフでは、できるだけ多くの3サイクルを見つけたいと考えています。 – Lennart

答えて

3

itertools.permutations()を使用してサイクルを生成する方が簡単です。

あなたのデータセットの量はどれくらいですか? itertools.product()小さなデータセットのためにあなたができるだけで強引にそれを、例えば:

In [1]: 
import itertools as it 

a = list(it.permutations([1,2,3,4,5,6,7,8,9], 2)) 
cycle = lambda x, y, z: x[1] == y[0] and y[1] == z[0] and z[1] == x[0] 
[(x, y, z) for x, y, z in it.product(a, repeat=3) if cycle(x, y, z)] 

Out[1]: 
[((1, 2), (2, 3), (3, 1)), 
((1, 2), (2, 4), (4, 1)), 
((1, 2), (2, 5), (5, 1)), 
((1, 2), (2, 6), (6, 1)), 
((1, 2), (2, 7), (7, 1)), 
((1, 2), (2, 8), (8, 1)), 
...] 

は、だから私は今、あなたの問題を理解し、あなたがより建設的なアプローチを取ることができ、例えば:

In [2]: 
from collections import deque 

a = [1,2,3,4,5,6,7,8,9]  
sched = [[x for x in zip(*[iter(a)]*3)]] 
for i in range(3): 
    r = [] 
    for i, x in enumerate(sched[-1]): 
     x = deque(x) 
     x.rotate(i) 
     r.append(x) 
    sched.append(list(zip(*r))) 
sched 

Out[2]: 
[[(1, 2, 3), (4, 5, 6), (7, 8, 9)], 
[(1, 6, 8), (2, 4, 9), (3, 5, 7)], 
[(1, 9, 5), (6, 2, 7), (8, 4, 3)], 
[(1, 7, 4), (9, 6, 3), (5, 2, 8)]] 
+0

おかげさまで、セットのサイズは小さく(例えば、2つのタプルが20個未満)、ブルートフォースが行います。エレガントなアルゴリズムのためのちょっとした説明 – Lennart

+0

各2タプルは1回だけ使用できますか? –

+0

@ B.M、それは正しいです。出力(1,2)では何度も起こりますが、これは許されません。出力はさらにフィルタリングする必要がありますが、開始は – Lennart

関連する問題