ラウンドロビンと呼ばれるチェス トーナメントなどで使用される非常に単純なシステムがあります。
アイデアは、プレーヤーをテーブルの両側に分割することです。プレイヤーの 1 人が「ハブ」として指定されます (より適切な言葉が必要です)。トーナメントは、プレイヤー同士が向かい合って対戦することから始まります。最初のラウンドの後、ハブ以外の全員が椅子を 1 つ前に移動し、白/黒 (スポーツではホーム/アウェイ) の順序が入れ替わります。プレイヤーが元の場所に着席すると、総当り競技全体が終了します。全員に 2 回プレイしてもらいたい場合は、同じことをもう一度行います。
実装の詳細を含むウィキペディアの記事。
あなたの特別なケースでは、すべてのチームを含めてラウンドロビンを1回実行してみます. 次に、ディビジョンごとに同じことを 1 回行い、ディビジョン内のチームがホームで 1 回、アウェイで 1 回対戦することを確認するために、チームがそのラウンドでどのようにプレーしたかを最初のラウンドロビンから確認します。
もちろん、これの欠点は、トーナメントが終了するかなり前にすべてのディビジョン間の試合を行うことです (最後の n-1 試合はディビジョン内のチームと対戦するため [n = ディビジョン内のチームの数])。これが問題になる場合は、マッチを少し交換するだけです。
私は実際に、これを行う簡単な Python スクリプトを作成しました。多くのコード行を必要とせず、かなり良い結果が得られました。これにより、各チームが同じディビジョンの各チームと 2 回対戦し、他のディビジョンのチームと 1 回対戦するスケジュールが作成されます。ただし、同じチームがホームにいるような方法で、チームが互いに 2 回会うことを確認するためのチェックはありません。しかし、このコードは、独自のスケジューリング コードを作成する方法についての良いアイデアを提供するはずです。
#!/usr/bin/python
div1 = ["Lions", "Tigers", "Jaguars", "Cougars"]
div2 = ["Whales", "Sharks", "Piranhas", "Alligators"]
div3 = ["Cubs", "Kittens", "Puppies", "Calfs"]
def create_schedule(list):
""" Create a schedule for the teams in the list and return it"""
s = []
if len(list) % 2 == 1: list = list + ["BYE"]
for i in range(len(list)-1):
mid = int(len(list) / 2)
l1 = list[:mid]
l2 = list[mid:]
l2.reverse()
# Switch sides after each round
if(i % 2 == 1):
s = s + [ zip(l1, l2) ]
else:
s = s + [ zip(l2, l1) ]
list.insert(1, list.pop())
return s
def main():
for round in create_schedule(div1):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div2):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div3):
for match in round:
print match[0] + " - " + match[1]
print
for round in create_schedule(div1+div2+div3):
for match in round:
print match[0] + " - " + match[1]
print
if __name__ == "__main__":
main()