可能なすべてのペアリングを生成する必要がありますが、特定のペアリングが結果内で1回だけ発生するという制約があります。したがって、たとえば:すべてのユニークなペア順列を生成する
import itertools
for perm in itertools.permutations(range(9)):
print zip(perm[::2], perm[1::2])
はすべての可能な2ペアの順列を生成します。一度だけ、私が今までに一度だけ(フィルタリング順列の全てを通して)(8,4)を参照するように、私はさらにそれをフィルタリングするにはどうすればよい
...
[(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,5):ここでは、小さな出力のサブセットです、(0,1)は1回だけ、(4,7)は1回だけなどです。
基本的に、各2要素ペアリングが1回だけ起こるような順列が必要です。
これを解決する追加のitertoolがあると思いますが、私はそれが何であるかを知るには十分な専門家ではありません。
更新:Gareth Reesが正しい - 私はラウンドロビン問題を解決しようとしていたことを完全に知らなかった。私にはもう一つの制約があります。私がやっているのは、ペアプログラミングの演習のために人々をグループ化することです。したがって、奇数の人がいる場合は、3つのグループを作成して、それぞれの練習に奇妙な人物を含める必要があります。私の現在の考えは、(1)目に見えない人を加えて偶数人を作ることです。その後、ペアリングした後、目に見えない人とペアを組んだ人を見つけ、既存のグループにランダムに配置して3人のチームを形成します。しかし、これをより良い方法で行うラウンドロビンのアルゴリズムや調整がまだないのではないかと思います。
更新2:Theodrosのソリューションは、私が上で説明したように、丁寧な結論を出すことなく、正確な結果をもたらします。誰もが驚くほど役に立ちました。
ペアリングの意味はなんですか?順列によって? [(0,1)、(2,3)、(4,5)、(6,7)]は、通常、[0,1,2,3、...、8 ]。 –
あなたの更新のために私の答えを更新しました。 –