Существует ли эффективный алгоритм для создания этого типа расписания?
Я создаю расписание для спортивной лиги с несколькими десятками команд. У меня уже есть все игры в установленном порядке, и теперь мне просто нужно назначить одну команду в качестве "домашней" команды и одну "в гостях" для каждой игры.
Проблема имеет два ограничения:
- Каждая пара команд должна сыграть одинаковое количество домашних и выездных игр друг против друга. Например, если команда A и команда B играют в 4 игры, то 2 должны быть проведены A, а 2 - B. Предположим, что каждая пара команд играет четное количество игр друг против друга.
- Ни одна команда не должна иметь более трех последовательных домашних игр или трех последовательных выездных игр в любой точке графика.
Я пытался использовать грубую силу в R для решения этой проблемы, но я не могу получить ни один из своих блоков кода для своевременного решения проблемы. Есть ли у кого-нибудь совет о том, как алгоритмически справляться с одним (или обоими) из вышеуказанных ограничений?
1 ответ
Вам нужно больше исследовать простое планирование. Есть много ссылок на эти вещи. Вот основы для вашего приложения. Предположим, лига состоит из 6 команд; процесс одинаков для любого числа.
Матч 1: Просто запишите номера команд по порядку, в парах, в ринге. Свести он кольцо в две строки. Матчи верхние (домашние) и нижние (выездные).
1 2 3
6 5 4
Матчи 2-5: Команда 1 остается на месте; остальные вращаются вокруг кольца.
1 6 2
5 4 3
1 5 6
4 3 2
1 4 5
3 2 6
1 3 4
2 6 5
Это один полный цикл. Чтобы уравновесить расписание на выезде, просто поменяйте местами матчи в каждом другом матче:
1 2 3 5 4 3 1 5 6 3 2 6 1 3 4
6 5 4 1 6 2 4 3 2 1 4 5 2 6 5
Там твой первый полный раунд. Просто скопируйте это, снова переключая домашние светильники в чередующихся раундах. Таким образом, второй тур будет:
6 5 4 1 6 2 4 3 2 1 4 5 2 6 5
1 2 3 5 4 3 1 5 6 3 2 6 1 3 4
Повторите эту пару раундов столько раз, сколько необходимо, чтобы получить продолжительность графика вам нужно.
Если у вас нечетное количество команд, просто объявите одно из чисел как "пока" в расписании. Мне проще всего следовать, если я использую невращающуюся команду - команду 1 в этом примере.
Обратите внимание, что этот процесс смены дома гарантирует, что ни у одной команды нет трех последовательных матчей дома или в гостях: они получают два подряд при округлении конца ряда. Тем не менее, даже два подряд подряд не пострадают в конце раунда: обе эти команды прерывают серию в первом матче следующего раунда.
К сожалению, при произвольном существующем расписании вы застряли в грубой силе поиска с возвратом. Вы можете использовать некоторые ограничения и эвристики, такие как балансировка частичных приспособлений для дома в качестве первого варианта на каждом этапе. Тем не менее, лучший подход заключается в том, чтобы сделать ваше оригинальное расписание корректным.
Существует также небольшая проблема, заключающаяся в том, что вы не можете гарантировать, что ваш существующий график будет соответствовать заданным требованиям. Например, учитывая 8 команд команды в следующем порядке:
1 2 3 4
5 6 7 8
1 2 5 6
3 4 7 8
1 3 5 7
2 4 6 8
Невозможно избежать, чтобы по крайней мере две команды играли три матча подряд дома или в гостях.