Некоторые сведения:
В волейболе игроки играют в пулах для определения ранжирования. Команды - это пары игроков. Матчи - это пара игроков против другой пары игроков. В этом примере давайте предположим, что существует только один суд, в котором можно сыграть матч, а когда игрок не играет, они сидят/ждут. Количество игроков в пуле будет между 4 и 7. Если в пуле есть 8 игроков, они просто разломят его на 2 пула 4.
Я хочу рассчитать наименьшее количество совпадений, чтобы каждый игрок мог играть с каждым другим игроком.
Например, у пула 4 игрока будут следующие команды:
import itertools
players = [1,2,3,4]
teams = [t for t in itertools.combinations(players,2)]
print 'teams:'
for t in teams:
print t
Выходы:
teams:
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
и количество совпадений:
matches = []
for match in itertools.combinations(teams,2):
# A player cannot be on both teams at the same time
if set(match[0]) & set(match[1]) == set():
matches.append(match)
for match in matches:
print match
Выходы:
((1, 2), (3, 4))
((1, 3), (2, 4))
((1, 4), (2, 3))
Что правильно, но этот алгоритм ломается, когда я добавляю пятого игрока в пул:
((1, 2), (3, 4))
((1, 2), (3, 5))
((1, 2), (4, 5))
((1, 3), (2, 4))
((1, 3), (2, 5))
((1, 3), (4, 5))
((1, 4), (2, 3))
((1, 4), (2, 5))
((1, 4), (3, 5))
((1, 5), (2, 3))
((1, 5), (2, 4))
((1, 5), (3, 4))
((2, 3), (4, 5))
((2, 4), (3, 5))
((2, 5), (3, 4))
Команды дублируются несколько раз.
Я пытался сохранить список команд, которые играют, но этот алгоритм оказывается жадным. Под этим я подразумеваю, что когда он добирается до (1,5) команды, все остальные команды [(2,3), (2,4), (3,4)] уже играют и (1,5) никогда не получают играть.
Что я ищу:
((1,2), (3,4)) (player 5 waits)
((1,3), (2,5)) (player 4 waits)
((1,4), (3,5)) (player 2 waits)
((1,5), (4,2)) (player 3 waits)
((2,3), (4,5)) (player 1 waits)
Было бы проще просто вычислить это вручную для каждого размера пула, или это можно легко сделать в python?
Спасибо за помощь!
Редактировать: Удален тег Python. Любой язык будет достаточным, и я могу преобразовать его в Python.