Алгоритм - Попытка сбалансировать уровни командного мастерства, имея равное количество игроков.
У меня есть 3 команды, у них есть 2 игрока, 3 игрока и 7 игроков. На боковых линиях 18 игроков, ожидающих назначения.
Каждый игрок имеет свой собственный уровень квалификации, то есть уровень 1 не собирается побеждать уровень 10.
Я хочу сбалансировать команды по 10 игроков в каждой. И я хочу постараться, чтобы все 3 команды были одинаково умелыми. Но я не хочу удалять игроков уже в команде.
Но я не уверен, как бы это сделать. Я также не уверен, есть ли простой ответ, или это будет дорого вычислять.
Уровень квалификации - это число, которое у меня уже есть. Все команды имеют равное количество игроков. Это означает, что уровень навыка является единственным изменяющимся числом.
Пример есть. В команде 13 игрока и общий уровень мастерства 4. В команде 2 6 игроков и общий уровень мастерства 8. В команде 3 8 игроков и общий уровень мастерства 9.
У меня есть 13 игроков, которые должны быть назначены, так что команды по 10 игроков в каждой. И я хочу попробовать сопоставить общий уровень квалификации.
3 ответа
Это выглядит для меня так, как будто вы пытаетесь разделить (несколько) набор чисел ("уровни умений") на блоки одинакового размера ("команды"), чтобы средние значения ("общий уровень умений") были близки к равным насколько это возможно.
Чтобы решить эту проблему, я бы начал с вычисления среднего уровня мастерства, который представляет собой сумму уровней мастерства, деленную на количество игроков, называющих это число. s
, Если есть m
Всего команд, каждая с k
игроки, давая в общей сложности m*k
игроков, то целевой уровень квалификации для каждой команды k*s
,
Так как ваши команды уже частично заполнены, проблема, которую вы создали, основана на вашем примере.
У меня есть 3 команды, у них есть 2 игрока, 3 игрока и 7 игроков. На боковых линиях 18 игроков, ожидающих назначения.
является следующим:
- Команда А, с текущим уровнем квалификации
a
нужно 8 игроков, чтобыp1 + ... + p8 + a = 10*s
- Команда B, с текущим уровнем квалификации
b
нужно 7 игроков, чтобыq1 + ... + q7 + b = 10*s
- Команда C, с текущим уровнем квалификации
c
нужно 3 игрока, чтобыr1 + r2 + r3 + c = 10*s
Для решения проблемы грубой силы сначала найдите игроков для команды C, а затем используйте оставшихся игроков, чтобы решить для команд A и B.
Для более умного решения вам нужно понять, что это действительно проблема с подмножеством сумм, и использовать один из известных алгоритмов для ее решения. Я рекомендую решение для динамического программирования, как описано в связанной статье.
Здесь невозможно дать четкий ответ, потому что действительно важно то, насколько точна схема ранжирования и удовлетворяет ли она некоторым логическим свойствам.
Аддитивность: если рейтинг является идеальным, то он, вероятно, будет в некотором смысле аддитивным. Мое мышление исходит из бриджа, но подойдет любая задача, где игроки могут быть ранжированы и могут формировать группы. Так что было бы неплохо, если бы игрок 10 и 1 ранга, когда он объединился, подойдет для пары, состоящей из игроков 5 и 6 ранга. (Ранжирование мостов может быть более точным в логическом смысле, чем я читал.)
Синергия: Работают ли некоторые вместе лучше, чем другие в группе? Опять же, это вопрос ранжирования, потому что ваш рейтинг с одним человеком может быть лучше, чем с другими. Здесь часто есть синергетический аспект. В качестве примера, избегая мостика, гольф приходит на ум. Поместите двух человек вместе на поле для гольфа, если один человек - это тот тип, который постоянно разговаривает, а другому нужно молчать, чтобы сконцентрироваться, тогда по логике они будут плохо играть вместе.
Прагматичный подход, который даст вам хороший ответ, состоит в том, чтобы назначить игрока с самым высоким рейтингом команде с самым низким рейтингом, пока не будут назначены все игроки, где вы вычисляете ранг команды путем суммирования рангов ее игроков.