Групповая или зависящая от результатов оптимизация с OMPR? - PullRequest
0 голосов
/ 27 апреля 2019

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

Как я могу это сделать?

Вот простой воспроизводимый пример оптимизации оценок для Анны, Питера, Джона и Михаила, которые играли в игру три раза.

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

library(ompr)
library(ompr.roi)
library(ROI.plugin.glpk)
library(dplyr)

data <- data.frame(i=1:12,time=rep(1:3,each=4),id=rep(c("Anna","Peter","John","Michael"),3),score=c(1:6,6:1))

score <- function(i) data$score[i]

# this constraint specifies that the result has to include two results (rows) for each 'time'
each_time_constraint <- function(model){
  is_time <- function(i) as.integer(data$time[i] == j)    

  for (j in 1:length(unique(data$time))){
    model <- add_constraint(model, sum_expr(colwise(is_time(i)) * x[i], i = 1:nrow(data)) == 2)
  }

  model
}

# model set to optimize (maximize) the score
my_model <- MILPModel() %>%
  add_variable(x[i], i = 1:nrow(data), type = "binary") %>% 
  set_objective(sum_expr(colwise(score(i)) * x[i], i = 1:nrow(data))) %>% 
  each_time_constraint()

model_results <- solve_model(my_model,with_ROI(solver="glpk"))

model_results %>% 
  get_solution(x[i]) %>% 
  left_join(.,data,by="i") %>% 
  filter(value>0)

Это дает оптимизированное решение для Джона-Майкла (время 1), Анны-Петра (время 2) и Анны-Петра (время 3).

Я хочу ограничить оптимизатор так, чтобы решение для времени 2 зависело от решения для времени 1.

Например, должно быть одно и то же решение: Джон-Майкл (время 1), Джон-Майкл (время 2).

Или у него должно быть хотя бы одно и то же имя: Джон-Майкл (время 1), Анна-Джон (время 2).

Может кто-нибудь помочь, как кодировать ограничение для получения этого результата?

...