混合线性整数优化 - 基于对 R 中所有商店的不同处理优化利润

Mixed linear integer optimization - Optimize Profit based on different treatments to all the stores in R

我有 4 家商店 (1,2,3,4),我可以对这 4 家商店中的每家进行 3 次治疗(A、B、C)。 每种治疗都有自己的成本和利润。

矩阵如下:

Store   Treatment   Cost    Profit
1   A   50  100
1   B   100 200
1   C   75  50
2   A   25  25
2   B   150 0
2   C   50  25
3   A   100 300
3   B   125 250
3   C   75  275
4   A   25  25
4   B   50  75
4   C   75  125

使用简单的 lpp 对此不起作用。

如何在 R 中限制最大成本的情况下最大化利润? 每家店铺只能获得1次治疗。

提前致谢。

我相信数学模型可以是这样的:

这里 i 是商店,j 是治疗。在 R 中,这可以使用不同的工具来实现。这里我用的是OMPR。完整的 R 脚本如下:

library(dplyr)
library(tidyr)
library(ROI)
library(ROI.plugin.symphony)
library(ompr)
library(ompr.roi)

df<-read.table(text="
Store   Treatment   Cost    Profit
1   A   50  100
1   B   100 200
1   C   75  50
2   A   25  25
2   B   150 0
2   C   50  25
3   A   100 300
3   B   125 250
3   C   75  275
4   A   25  25
4   B   50  75
4   C   75  125
",header=T)
stores<-unique(df$Store)
treatments<-levels(df$Treatment)
num_treatments <- length(treatments)
cost <- as.matrix(spread(subset(df,select=c(Store,Treatment,Cost)),Treatment,Cost)[,-1])
profit <- as.matrix(spread(subset(df,select=c(Store,Treatment,Profit)),Treatment,Profit)[,-1])

max_cost <- 300   

m <- MIPModel() %>%
  add_variable(x[i,j],i=stores,j=1:num_treatments,type="binary") %>%
  add_constraint(sum_expr(x[i,j],j=1:num_treatments)<=1,i=stores) %>%
  add_constraint(sum_expr(cost[i,j]*x[i,j],i=stores,j=1:num_treatments)<=max_cost) %>%
  set_objective(sum_expr(profit[i,j]*x[i,j],i=stores,j=1:num_treatments),"max") %>%
  solve_model(with_ROI(solver = "symphony"))

cat("Status:",solver_status(m))
cat("Objective:",objective_value(m))

get_solution(m,x[i, j]) %>%
  filter(value > 0) %>%
  mutate(Treatment = treatments[j],Store = i) %>%
  select(Store,Treatment)

这应该给出:

Status: optimal
Objective: 650    

  Store Treatment
1     2         A
2     3         A
3     1         B
4     4         C