Нужна помощь в определении алгоритма планирования лиги

9

Я пытаюсь создать планировщик спортивной лиги. У меня проблемы с определением алгоритма, который поможет мне эффективно заполнить каждый слот.

Пример данных для построения графика будет:

  1. 10 команд
  2. Каждая команда играет друг с другом 1 раз (требуется 45 игр)
  3. Каждая команда играет не более 1 раза в день
  4. В своем тестировании я использую 9 дней с 5 слотами в день.

Комбинированный стол (содержит 45 комбинаций)

ID
Team1ID
Team2ID
bitAssigned

Таблица расписаний (содержит 45 временных интервалов)

scheduleID
homeTeamID
awayTeamID
GameDate
GameTime

Прямо сейчас мои существующие процедуры заполняют около 90% слотов, оставляя 10% моих слотов пустыми из-за конфликта планирования, основанного на правилах выше.

Я перебираю таблицу расписания в порядке возрастания даты / времени.
Мой первый слот может быть в субботу в 8 утра.
Я запрашиваю список команд, которые еще не запланированы. Затем я делаю множество возможных комбинаций этих команд. Затем я использую этот массив для извлечения 1 случайной записи из моей таблицы комбинаций из комбинаций, которые еще не были запланированы, и помещаю эти команды в расписание. Затем я установил эту комбинацию как использованную.

Я повторяю цикл снова и снова, и каждый раз мой список доступных команд уменьшается, и мой массив в результате также уменьшается.

Я обнаружил, что некоторые дни проходят хорошо, а в другие дни мои последние две оставшиеся команды уже играли на предыдущей неделе, поэтому они больше не добавляются в расписание.

Единственное, что я еще не пробовал, - это «перезагрузить» дни конфликта и перепробовать их снова, чтобы посмотреть, получу ли я лучшие места размещения.

У кого-нибудь есть предложения?

Стив
источник
5
планирование турнира с круговым турниром
Кевин Клайн
Кевин спасибо. твое право. Мне кажется, что сейчас мой массив каждый раз начинается в одном и том же месте, и нет вращения, поэтому нет никакого упорядоченного потока для объединения команд.
Стив
1
Я использую совершенно случайный подход. Случайно выбрать слот и две команды. Если правила соблюдены, тогда запланируйте игру. Если не откажитесь и попробуйте снова. Я устанавливаю ограничение на общее количество попыток, и если оно будет достигнуто, откажитесь от всего расписания и начнем сначала. На самом деле это работает довольно хорошо.
Cerad
Я закончил тем, что пошел и следовал подходу круглого робина. Я на 95% закончил написание сценария для подключения к БД, но в тестировании он работает гладко и сбалансировано. Я отношусь к своим дням как к «раундам», и они остаются хорошими и сбалансированными. Я могу играть в свои раунды в любом порядке и ставить игры для каждого раунда в любом порядке, но переход игры из одного раунда в другой в конечном итоге нарушит правила.
Стив

Ответы:

5

Вот алгоритм, который я придумал сам. Я не знаю, существует ли он уже или является циклической реализацией:

1 4    1 5   1 6   1 3   1 2
2 5    4 6   5 3   6 2   3 4
3 6    2 3   4 2   5 4   6 5

в основном вы начинаете с

поворот изображения

и всегда держите 1 в том же положении и вращайте остальные.

Таким образом, вы всегда получите расписание уникальных матчей. Это очень легко реализовать и масштабируется с любым количеством противников, даже или неравномерно. Если у вас неравное количество противников, просто не ставьте команду на 1 позицию, и у них есть свободный раунд.

Питер Б
источник
2
как вы управляете домом против баланса?
Эрик Коуп
Это на самом деле не работает - в этом простом алгоритме ротации вращающиеся команды, расположенные на расстоянии 2 слотов (2/4, 3/5), никогда не будут играть.
mdryden
@mdryden это работает. Проверьте это лучше и, пожалуйста, удалите свой комментарий.
Питер Б
@PieterB Я думал, что это будет работать, но на самом деле это не работает, если существует нечетное количество команд, так как те, которые находятся рядом друг с другом (например, 4 и 5), никогда не будут играть друг с другом. Вы можете увидеть это довольно легко в конце с 1, а также на другом конце, потому что у вас есть свисающая команда (пока). Вот хороший ответ, который также имеет дело с нечетным числом: stackoverflow.com/a/6649732/ 6489306
ragingasiancoder
@ragingasiancoder, если нечетное количество команд, добавьте фиктивную команду. Ответ, который вы указали, описывает то же решение, что и я.
Питер Б
1

Я думаю, что вы делаете это задом наперед. Не начинайте с таблицы расписания, начните с таблицы / массива / любой другой игровой комбинации (45 игр). Оттуда это простой процесс назначения игр на один день, основанный на команде, играющей только один раз в день. А поскольку совпадения происходят только один раз (команда A играет только команду B один раз), планирование легко, потому что вам просто нужно убедиться, что совпадение еще не произошло (записи «уникальны» таким образом).

Неизвестный кодер
источник
1

Я сформировал расписание из 10 команд в одиночном раунде ниже. Это заняло у меня около 3 минут.

Информация о расписании:

10 команд - 1 круговая
игра ( отображаются только первые 6 недель) Дата начала сезона 1/6/15 - дата окончания 3/5/15
2 игры каждый вторник, 3 игры каждый четверг, 5 игр каждую неделю без пропущенных дат

  • Все команды распределяются так, чтобы играть в 5 временных интервалах одинаково.
  • Все играют в 9 игр.
  • Все играют друг друга один раз.
  • Все они распределяются равномерно как дома и посетителю (5/4 или 4/5). Примечание: в конце второго раунда все команды играют в 18 игр (9 - дома и 9 - в гостях), и все команды имеют 2 байта.
  • Все они распределены для равномерной игры в 5 временных интервалах каждую неделю.

Мы использовали устаревший основной компьютер Honeywell и чуть менее 3 лет, чтобы собрать все это вместе. После отладки нашего программного обеспечения для планирования потребовалось много часов, чтобы главный компьютер поиска искал миллионы комбинаций и комбинаций, чтобы рассчитать и создать сбалансированные шаблоны для 4–22 команд, которые мы искали.

10 Team Division Schedule   DATE 12/20/14

DATE   DAY TIME    LOCATION  GM  HOME vs VISITOR

Jan  6 Tue 6:00pm  Field #1   1  # 1 vs #10 
Jan  6 Tue 6:00pm  Field #2   1  # 2 vs # 9 
Jan  8 Thu 6:30pm  Field #3   1  # 3 vs # 8 
Jan  8 Thu 6:30pm  Field #4   1  # 4 vs # 7 
Jan  8 Thu 6:30pm  Field #5   1  # 5 vs # 6

Jan 13 Tue 6:00pm  Field #1   2  # 6 vs # 3 
Jan 13 Tue 6:00pm  Field #2   2  #10 vs # 8 
Jan 15 Thu 6:30pm  Field #3   2  # 7 vs # 2 
Jan 15 Thu 6:30pm  Field #4   2  # 9 vs # 1 
Jan 15 Thu 6:30pm  Field #5   2  # 4 vs # 5

Jan 20 Tue 6:00pm  Field #1   3  # 7 vs # 9 
Jan 20 Tue 6:00pm  Field #2   3  # 5 vs # 2 
Jan 22 Thu 6:30pm  Field #3   3  # 6 vs #10 
Jan 22 Thu 6:30pm  Field #4   3  # 3 vs # 4 
Jan 22 Thu 6:30pm  Field #5   3  # 8 vs # 1

Jan 27 Tue 6:00pm  Field #1   4  # 9 vs # 5 
Jan 27 Tue 6:00pm  Field #2   4  # 1 vs # 7 
Jan 29 Thu 6:30pm  Field #3   4  # 2 vs # 3 
Jan 29 Thu 6:30pm  Field #4   4  # 8 vs # 6 
Jan 29 Thu 6:30pm  Field #5   4  #10 vs # 4

Feb  3 Tue 6:00pm  Field #1   5  # 4 vs # 8 
Feb  3 Tue 6:00pm  Field #2   5  # 7 vs # 5 
Feb  5 Thu 6:30pm  Field #3   5  # 1 vs # 6 
Feb  5 Thu 6:30pm  Field #4   5  #10 vs # 2 
Feb  5 Thu 6:30pm  Field #5   5  # 3 vs # 9

Feb 10 Tue 6:00pm  Field #1   6  # 3 vs # 7 
Feb 10 Tue 6:00pm  Field #2   6  # 6 vs # 4 
Feb 12 Thu 6:30pm  Field #3   6  # 5 vs # 1 
Feb 12 Thu 6:30pm  Field #4   6  # 9 vs #10 
Feb 12 Thu 6:30pm  Field #5   6  # 8 vs # 2 

Не существует алгоритма, который решает общие проблемы планирования, связанные с сотнями или тысячами различных типов лиг, видов спорта и потенциальных ситуаций. Что мы сделали, чтобы решить эту проблему, так это использовать другой подход для расчета расписаний. Он начинается с очень сложной математики, чтобы определить правильные парные команды (матчи), но это было только начало. Другие части необходимы для создания полезного сбалансированного графика, который можно публиковать и распространять. Игроки, тренеры, родители и т. Д., Все должны знать не только, кого они играют ; но где они играют ; во сколько они играют ; если они дома или в гостях ; и для многих лиг, номер игры .

Я надеюсь, что это поможет вам и другим понять, что нам понадобилось 3 года, чтобы понять.

Сообщество
источник