使用OMPR进行基于组或结果的优化?

时间:2019-04-27 14:09:33

标签: r optimization linear-programming integer-programming

我正在使用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)

这将为John-Michael(时间1),Anna-Peter(时间2)和Anna-Peter(时间3)提供优化的解决方案。

我想要约束优化器,以使时间2的解决方案取决于时间1的解决方案。

例如,它必须是相同的解决方案:John-Michael(时间1),John-Michael(时间2)。

或者它必须至少具有以下名称之一:约翰·迈克尔(时间1),安娜·约翰(时间2)。

任何人都可以帮助编写代码来产生此结果吗?

0 个答案:

没有答案