Пакет R OMPR - Ограничение количества выбранных уникальных переменных компонентов

Я использую пакет ompr для создания и решения задачи целочисленного программирования. Для простоты в качестве примера я буду использовать фэнтези-игроков НФЛ.

Я хочу максимизировать количество очков, набранных в двух играх, играя только с одним игроком на каждой позиции за игру. (Для простоты предположим, что любой игрок может играть на любой позиции.)

Часть, с которой у меня возникли проблемы, связана с 25 возможными игроками, я хочу ограничить общее количество игроков, выбранных в двух играх, до 15. Компонент i добавленной переменной ompr представляет индексы игроков, но я не уверен, как добавить ограничение, которое ограничивает общее количество выбранных уникальных i.

Любая помощь будет принята с благодарностью!

n_players = 25
n_positions = 11
n_games = 2

# Points each player will score at each position per game
points_game1 = matrix(runif (25*11), nrow = 25, ncol = 11)
points_game2 = matrix(runif (25*11), nrow = 25, ncol = 11)
points_array <- array(c(points_game1, points_game2), dim = c(n_players, n_positions, 2))

mip <- ompr::MIPModel() %>% 
  
  # Initialize player/position set of binary options
  ompr::add_variable(x[i, j, k], i = 1:n_players, j = 1:n_positions, k = 1:n_games, type = 'binary') %>%
  
  # Every player/game can only be 0 or 1 across all positions
  ompr::add_constraint(sum_expr(x[i, j, k], j = 1:n_positions) <= 1, i = 1:n_players, k = 1:n_games) %>% 
  
  # Every position/game has to be exactly 1 across all players
  ompr::add_constraint(sum_expr(x[i, j, k], i = 1:n_players) == 1, j = 1:n_positions, k = 1:2) %>%
  
  # ****** Limit to 15 players total ??? ****
  
  # Objective is to maximize points
  ompr::set_objective(sum_expr(x[i, j, k] * points_array[i, j, k], i = 1:n_players, j = 1:n_positions, k = 1:n_players), 'max') %>% 

  # Solve model
  ompr::solve_model(with_ROI(solver = 'symphony', verbosity = -2))

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
288
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить набор двоичных переменных, проиндексированных по игрокам, которые отслеживают, используется ли игрок в любой позиции в любой игре. Затем вы можете ограничить сумму этих переменных до вашего предела (15). Это позволяет вам учитывать игрока только один раз, даже если он используется в обеих играх. Затем вы можете добавить большое ограничение M, которое заставит новые двоичные переменные быть равными 1, если игрок используется в любой позиции в любой игре, но позволяет переменной быть равной 0, если игрок не используется. Поскольку у нас есть две игры, и игрок может находиться не более чем на 1 позиции в каждой игре, мы можем установить большое M равным 2 для всех игроков.

ompr::add_variable(is_used[i], i = 1:n_players, type = 'binary') %>%
ompr::add_constraint(sum_expr(is_used[i],i = 1:n_players) <= 15) %>%
# big M constraint ensuring that is_used is 1 if a player is used
ompr::add_constraint(2*is_used[i] >= sum_expr(x[i,j,k],j = 1:n_positions, k = 1:2), i = 1:n_players) %>%

Большое спасибо! Я относительно новичок в смешанном целочисленном программировании и ompr, поэтому все еще обдумываю функциональность, но это работает отлично.

Sam 17.12.2020 20:59

Другие вопросы по теме