Алгоритм: выбор пар команд из набора игр

#algorithm #scheduling #combinatorics #sports-league-scheduling-problem

#алгоритм #планирование #комбинаторика #спорт-лига-планирование-проблема

Вопрос:

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

Допустим, у меня есть набор команд A = {1,2,3,...,n} и набор пар этих команд B = {(1,2), (1,3), (2,4), (6,9),...} . У B нет всех возможных комбинаций команд из A. Предположим, что A имеет четное количество команд. Моя программа пытается создать подмножество B (назовем это подмножеством S) таким образом, чтобы каждая команда из A появлялась в S ровно один раз. Он делает это, перемещая пары из B в S по одному за раз. Предположим, что он уже поместил несколько пар в S. Как я могу узнать, возможно ли успешно создать S, учитывая текущую ситуацию?

Пример:

 A = {1,2,3,4}, B = {(1,2), (1,3), (1,4), (3,4)}

If after one move, S = {(1,2)}, then it can be completed by moving (3,4).
If after one move, S = {(1,3)}, then it cannot be completed.
  

Обновить:
Этот алгоритм будет одной из эвристик, которые я использую в своем генераторе расписаний. Цель состоит в том, чтобы неявно разделить расписание на «волны», где у каждой команды по одной игре на волну. Итак, предположим, что у меня есть пул из 16 команд, и у каждой команды будет по 5 игр против других команд в пуле. Идеальное расписание должно гарантировать, что ни одна команда не проведет вторую игру до того, как каждая команда проведет хотя бы одну игру. Планировщик выбирает игры по одной и назначает им дату. Итак, идея состоит в том, чтобы планировщик отслеживал игры, запланированные в этой «волне», и никогда не выбирал игру, которая помешала бы каждой команде сыграть ровно один раз в текущей волне. Планировщик также использует множество других эвристик, поэтому я не могу явно упорядочить игры и упорядочить их.

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

Комментарии:

1. Возможно, я не очень хорошо понял проблему, но почему (2,3) и (2, 4) не включены в B в вашем примере?

2. B не обязательно имеет все возможные комбинации пар из A. Я думаю, что если бы у него были все возможные комбинации, то всегда можно было бы завершить S.

3. Я не могу понять, что вы пытаетесь сделать. На футбольном языке группа — это набор команд (обычно 4), которые будут играть во все возможные игры друг против друга (например, на начальном этапе чемпионата мира), но вы, похоже, занимаетесь чем-то другим… Это может помочь описать, что вы хотите, чтобы ваше планирование выполнялось на более высоком уровне, а не на конкретных элементах A, B и C.

4. Требуется ли вам использовать вашу текущую ситуацию, например, используя A,B , как описано в постановке задачи?

5. @ missingno — Я добавил больше информации о назначении этого алгоритма. Надеюсь, это прояснит ситуацию. @brc — Пример, который я привел, является очень простым примером. В реальном использовании A будет иметь от 16 до 50 команд, а B будет иметь 6-12 пар для каждого элемента в A.

Ответ №1:

Это проблема максимального соответствия в теории графов. Существует несколько известных алгоритмов для решения этой проблемы.

В вашем проблемном графике G (V — набор вершин, E — набор ребер), где V = A, E = B. Также добавьте противоположные ребра к графику. Вес каждого ребра равен 1.

Я предлагаю вам использовать венгерский алгоритм для двудольных графов и алгоритм Эдмонда для других.

Комментарии:

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

2. Похоже, это именно так. Спасибо.

Ответ №2:

Важно сделать некоторые предположения, чтобы прояснить то, что представлено ниже.
Сначала предположим, что мы говорим о 16 командах в лиге настольного тенниса, и вам нужно расписание, в котором все команды играют по пять игр, не дублируя ни одного соперника.
Во-вторых, вы хотите, чтобы все 16 команд завершили игру в каждом сете, прежде чем какая-либо команда сыграет снова.
В-третьих, вы хотите, чтобы все команды были распределены для игры за 8 столами, а не чтобы одна команда всегда играла за одним столом.

Если я правильно понял предположения, то вам нужны первые 5 «наборов» (вы называете каждый набор волной) игр из сбалансированного кругового расписания из 16 команд. Это даст вам командные матчи турнирного типа, в которых каждая команда играет по 5 игр против 5 разных команд. Каждый сет (или волна) состоит из 8 игр, и ни одна команда не всегда играет за одним столом, и команды не играют игры в следующем сете, пока все команды не закончат играть текущий сет.

Ниже приведены первые 5 «наборов» из сбалансированного расписания из 16 команд, которое я создал для вас. Проверьте это.

 16 TEAM SCHEDULE       DATE 8/3/14            

DATE   DAY  TIME    LOCATION    GM#  HOME VS VISITOR

___ __ ___ _______  Table #1     1   #1  v  #16
___ __ ___ _______  Table #2     1   #2  v  #15
___ __ ___ _______  Table #3     1   #3  v  #14
___ __ ___ _______  Table #4     1   #4  v  #13
___ __ ___ _______  Table #5     1   #5  v  #12
___ __ ___ _______  Table #6     1   #6  v  #11
___ __ ___ _______  Table #7     1   #7  v  #10
___ __ ___ _______  Table #8     1   #8  v  #9

___ __ ___ _______  Table #1     2   #13 v  #2
___ __ ___ _______  Table #2     2   #15 v  #1
___ __ ___ _______  Table #3     2   #16 v  #14
___ __ ___ _______  Table #4     2   #12 v  #3
___ __ ___ _______  Table #5     2   #11 v  #4
___ __ ___ _______  Table #6     2   #10 v  #5
___ __ ___ _______  Table #7     2   #9  v  #6
___ __ ___ _______  Table #8     2   #7  v  #8

___ __ ___ _______  Table #1     3   #6  v  #7
___ __ ___ _______  Table #2     3   #16 v  #12
___ __ ___ _______  Table #3     3   #15 v  #13
___ __ ___ _______  Table #4     3   #14 v  #1
___ __ ___ _______  Table #5     3   #2  v  #11
___ __ ___ _______  Table #6     3   #4  v  #9
___ __ ___ _______  Table #7     3   #5  v  #8
___ __ ___ _______  Table #8     3   #3  v  #10

___ __ ___ _______  Table #1     4   #8  v  #3
___ __ ___ _______  Table #2     4   #14 v  #12
___ __ ___ _______  Table #3     4   #1  v  #13
___ __ ___ _______  Table #4     4   #9  v  #2
___ __ ___ _______  Table #5     4   #10 v  #16
___ __ ___ _______  Table #6     4   #11 v  #15
___ __ ___ _______  Table #7     4   #4  v  #7
___ __ ___ _______  Table #8     4   #5  v  #6

___ __ ___ _______  Table #1     5   #3  v  #6
___ __ ___ _______  Table #2     5   #13 v  #11
___ __ ___ _______  Table #3     5   #15 v  #9
___ __ ___ _______  Table #4     5   #2  v  #7
___ __ ___ _______  Table #5     5   #10 v  #14
___ __ ___ _______  Table #6     5   #16 v  #8
___ __ ___ _______  Table #7     5   #12 v  #1
___ __ ___ _______  Table #8     5   #4  v  #5

-