Es gibt ein ziemlich einfaches System, das z. Schachturniere, genannt Round-Robin.
Die Idee ist, die Spieler auf die zwei Seiten eines Tisches zu teilen. Einer der Spieler wird als "Hub" (für ein besseres Wort) bezeichnet. Das Turnier beginnt damit, dass sich die Spieler gegenüberstehen und gegeneinander spielen. Nach der ersten Runde zieht jeder außer dem Hub einen Stuhl nach vorne und der Weiß/Schwarz-Auftrag (Heim/Auswärts im Sport) wird geschaltet. Der gesamte Round-Robin-Wettbewerb ist beendet, wenn die Spieler an ihren ursprünglichen Plätzen sitzen. Wenn Sie möchten, dass jeder zweimal spielt, machen Sie das Gleiche erneut.
Wikipedia article mit Implementierungsdetails.
In Ihrem speziellen Fall würde ich versuchen, das Round Robin einmal einschließlich aller Teams zu tun. Dann machen Sie das gleiche für jede Division einmal und um sicherzustellen, dass sich Teams innerhalb der Divisionen einmal zu Hause spielen und einmal weg, überprüfen Sie ab der ersten Runde, wie die Mannschaften in dieser Runde gespielt haben.
Der Nachteil davon ist natürlich, dass Sie alle Spiele zwischen den Divisionen lange vor dem Ende des Turniers spielen werden (da die letzten n-1 Spiele gegen Teams innerhalb der Division sind [n = Anzahl der Teams in Aufteilung]). Wenn das ein Problem ist, könntest du die Matches einfach ein bisschen herum tauschen.
Ich schrieb tatsächlich ein einfaches Python-Skript, das dies tut. Es brauchte nicht viele Codezeilen und erzeugte ziemlich gute Ergebnisse. Dadurch wird ein Zeitplan erstellt, in dem jede Mannschaft zwei Teams in ihrer Division zweimal und einmal gegen Teams in anderen Divisionen spielt. Es wird nicht überprüft, ob die Mannschaften sich zweimal so treffen, dass die gleiche Mannschaft zu Hause ist. Aber dieser Code sollte Ihnen eine gute Idee geben, wie Sie Ihren eigenen Terminierungscode erstellen können.
#!/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()
Ja das ist die Absicht des obigen Codes :) –
@Rune: In diesem Fall +1 !!!! –