可能なすべてのペアリングを生成する必要がありますが、特定のペアリングが結果で1回だけ発生するという制約があります。したがって、たとえば:
import itertools
for perm in itertools.permutations(range(9)):
print zip(perm[::2], perm[1::2])
可能なすべての2対の順列を生成します。出力の小さなサブセットを次に示します。
...
[(8, 4), (7, 6), (5, 3), (0, 2)]
[(8, 4), (7, 6), (5, 3), (1, 0)]
[(8, 4), (7, 6), (5, 3), (1, 2)]
[(8, 4), (7, 6), (5, 3), (2, 0)]
[(8, 4), (7, 6), (5, 3), (2, 1)]
[(8, 5), (0, 1), (2, 3), (4, 6)]
[(8, 5), (0, 1), (2, 3), (4, 7)]
[(8, 5), (0, 1), (2, 3), (6, 4)]
[(8, 5), (0, 1), (2, 3), (6, 7)]
[(8, 5), (0, 1), (2, 3), (7, 4)]
[(8, 5), (0, 1), (2, 3), (7, 6)]
[(8, 5), (0, 1), (2, 4), (3, 6)]
[(8, 5), (0, 1), (2, 4), (3, 7)]
[(8, 5), (0, 1), (2, 4), (6, 3)]
...
さらにフィルタリングして、(8,4)を1回だけ(フィルタリングされたすべての順列全体で)、(8,5)を1回だけ、(0,1)を1回だけ、(4,7)を表示するようにするにはどうすればよいですか? )一度だけなど?
基本的に、各2要素のペアリングが1回だけ発生するような順列が必要です。
これを解決する追加のitertoolがあると思いますが、私はそれが何であるかを知るのに十分な専門家ではありません。
更新:GarethReesは正しいです-ラウンドロビン問題を解決しようとしていることに完全に気づいていませんでした。私がしているのはペアプログラミング演習のために人々をグループ化することであるという追加の制約があります。したがって、人数が奇数の場合は、3人のグループを作成して、各エクササイズに奇数人を含める必要があります。私の現在の考えは、(1)見えない人を加えることで偶数人にすることです。次に、ペアリング後、見えない人とペアになっている人を見つけ、それらを既存のグループにランダムに配置して、3人のチームを形成します。ただし、これをより適切に行うラウンドロビンのアルゴリズムや調整はまだないのではないかと思います。
更新2:Theodrosのソリューションは、上記で説明した上品な煩わしさなしに、正確に正しい結果を生成します。誰もが驚くほど役に立ちました。