Я настраиваю простой оптимизатор с 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).
Может кто-нибудь помочь, как кодировать ограничение для получения этого результата?