我正在使用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)。
任何人都可以帮助编写代码来产生此结果吗?