Потрібна допомога з визначення алгоритму планування ліги


9

Я намагаюся створити планувальник спортивної ліги. У мене виникають проблеми з визначенням алгоритму, який допоможе мені ефективно заповнити кожен слот.

Приклад даних для складання розкладу буде:

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

Таблиця комбо (містить 45 комбо)

Ідентифікатор
Team1ID
Team2ID,
біт, призначений

Таблиця розкладу (містить 45 часових інтервалів)

scheduleID
homeTeamID
awayTeamID
GameDate
GameTime

Наразі мої існуючі процедури заповнюють близько 90% слотів, залишаючи 10% моїх слотів порожніми для конфлікту планування, виходячи з вищезазначених правил.

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

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

Я вважаю, що деякі дні проходять нормально, а в інші дні мої останні 2 останні команди вже грали на попередньому тижні, тому їх знову не додавали до розкладу.

Єдине, що я ще не намагався - це "скинути" дні конфлікту та спробувати їх ще раз, щоб побачити, чи я отримаю кращі місця розташування.

Хтось має якісь пропозиції?


5
розклад турніру з круговим режимом
кевін клан

Кевін спасибі Ваше право. Мені здається, що зараз мій масив починається з того самого місця щоразу і немає повороту, тому немає впорядкованого потоку для сполучення команд.
steve

1
Я використовую абсолютно випадковий підхід. Випадково виберіть слот і дві команди. Якщо правила виконуються, тоді плануйте гру. Якщо не відмовитися, спробуйте ще раз. Я встановлюю обмеження на загальну кількість спроб, і якщо ліміт досягнуто, відкидаю весь графік і починаю заново. Насправді це досить добре працює на практиці.
Серад

Я закінчився іду і слідуючи за круговим підходом. Я на 95% завершив написання сценарію для підключення до БД, але при тестуванні він, здається, працює плавно і врівноважено. Я ставлюся до своїх днів, як до "раундів", і вони залишаються приємними і врівноваженими. Я можу грати в свої раунди в будь-якому порядку і розміщувати ігри для кожного раунду в будь-якому порядку, але переміщення гри з одного раунду в інший врешті-решт порушить правила.
steve

Відповіді:


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). Примітка: в кінці раунду 2 всі команди грають у 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 роки, щоб розібратися.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.