【问题标题】:Mixed linear integer optimization - Optimize Profit based on different treatments to all the stores in R [closed]混合线性整数优化 - 根据对 R 中所有商店的不同处理优化利润 [关闭]
【发布时间】:2017-04-17 06:20:42
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: r optimization linear-programming mixed-integer-programming


    【解决方案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
    

    【讨论】:

    • 嗨 Erwin,谢谢你,这真的很有帮助。但是,尝试在完整数据集上运行时出现错误:保护():保护堆栈溢出。有什么帮助吗?
    • 这在一定程度上取决于这到底发生在哪里以及数据集有多大。一些想法:(1)可以增加保护堆栈的大小(2)如果 MIP 问题变得非常大,请使用一些外部最先进的商业求解器(3)我认为有很好的机会来预处理数据只保留有趣的候选者(4)实施一些启发式而不是正式的优化步骤。在我看来,这就像一个小型研究项目。
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多