Существует довольно простая система, например, шахматные турниры под названием Round-Robin.
Идея состоит в том, чтобы разделить игроков на две стороны стола. Один из игроков обозначен как «хаб» (из-за отсутствия лучшего слова). Турнир начинается с того, что игроки играют друг против друга. После первого раунда все, кроме центра, передвигаются на один стул вперед, и переключается белый / черный (дома / в гостях в спорте). Весь круговой турнир заканчивается, когда игроки сидят на своих местах. Если вы хотите, чтобы все играли по два раза, просто сделайте то же самое снова.
Статья в Википедии с подробностями реализации.
В вашем особом случае, я бы попробовал сделать круговой прием один раз, включая все команды Затем вы делаете то же самое для каждого дивизиона один раз, и чтобы убедиться, что команды внутри дивизий играют друг с другом один раз дома и один раз в гостях, проверьте, как в первом раунде робин играет команды в этом раунде.
Обратной стороной этого является, конечно, то, что вы будете играть во всех матчах между дивизионами задолго до окончания турнира (поскольку последние n-1 матчей против команд внутри дивизии [n = количество команд в дивизионе ]). Если это проблема, вы можете просто поменять местами спички.
На самом деле я написал простой скрипт на Python, который делает это. Это не заняло много строк кода и дало довольно хорошие результаты. Это создаст расписание, в котором каждая команда играет каждую команду в своем дивизионе дважды и один раз против команд в других дивизиях. Нет никакой проверки, чтобы убедиться, что команды встречаются друг с другом дважды таким образом, что одна и та же команда находится дома. Но этот код должен дать хорошее представление о том, как создать свой собственный код планирования.
#!/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()