我相信数学模型看起来像:
这里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