1

我有 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 次治疗。

提前致谢。

4

1 回答 1

2

我相信数学模型看起来像:

在此处输入图像描述

这里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
于 2017-04-17T09:38:14.643 回答