Я создал код для генерации оптимального расписания соревнований, которое должно удовлетворять некоторым условиям. Это все работает, но для четного числа команд, а не для нечетного числа. Я хотел бы знать, может ли кто-нибудь помочь мне исправить код, чтобы он работал для команд с нечетным числом.
Условия:
- совпадения не могут встречаться дважды в расписании
- команда может играть только один раз за раунд
- каждая команда должна играть против любой другой команды ровно один раз
- Запрещено, чтобы 2 команды из одного города играли дома в одном и том же round
Код ниже (я скопировал все это, так что мне совершенно ясно, что я делаю):
def construct_schedule_greedy(players):
#""" Create a schedule for the players in the list and return it"""
dic = self.teams
clubs = list(dic.keys())
s = []
if len(players) % 2 == 1: # I need to know what to put after the if statement(i guess),
# so it satisfy a optimal schedule for odd number teams
# manipulate map (array of indexes for list) instead of list itself
# this takes advantage of even/odd indexes to determine home vs. away
n = len(clubs)
map = list(range(n))
mid = n // 2
for i in range(n-1):
l1 = map[:mid]
l2 = map[mid:]
l2.reverse()
round = []
for j in range(mid):
t1 = players[l1[j]]
t2 = players[l2[j]]
if j == 0 and i % 2 == 1:
# flip the first match only, every other round
# (this is because the first match always involves the last player in the list)
round.append((t2, t1))
else:
round.append((t1, t2))
s.append(round)
# rotate list by n/2, leaving last element at the end
map = map[mid:-1] + map[:mid] + map[-1:]
return s
Чтобы пояснить, я добавлю код self.teams:
4 команды, ключи: команда, значение: город
{'Ajax': 'Amsterdam', 'Feyenoord': 'Rotterdam', 'PSV': 'Eindhoven', 'Sparta': 'Rotterdam'}
5 команд, ключи: команда, значение: город
..{'Ajax': 'Amsterdam', 'AZ': 'Alkmaar', 'Feyenoord': 'Rotterdam', 'PSV': 'Eindhoven', 'Sparta': 'Rotterdam'}
Заранее спасибо