【问题标题】:MIP (ompr) model taking too much time to solve in RMIP (ompr) 模型在 R 中花费太多时间来解决
【发布时间】:2021-09-01 04:55:34
【问题描述】:

我正在尝试解决 R 中的容量设施位置问题。该示例数据:

n<- 500 #number of customers
m<- 20 #number of facility centers

set.seed(1234)

fixedcost <- round(runif(m, min=5000, max=10000))

warehouse_locations <- data.frame(
  id=c(1:m),
  y=runif(m, 22.4, 22.6),
  x= runif(m, 88.3, 88.48)
)

customer_locations <- data.frame(
  id=c(1:n),
  y=runif(n, 22.27, 22.99),
  x= runif(n, 88.12, 88.95)
)

capacity <- round(runif(m, 1000, 4000))
demand <- round(runif(n, 5, 50))

具有成本函数的模型:

library(geosphere)

transportcost <- function(i, j) {
  customer <- customer_locations[i, ]
  warehouse <- warehouse_locations[j, ]
  (distm(c(customer$x, customer$y), c(warehouse$x, warehouse$y), fun = distHaversine)/1000)*20
}


library(ompr)
library(magrittr)
model <- MIPModel() %>%
  # 1 iff i gets assigned to SC j
  add_variable(x[i, j], i = 1:n, j = 1:m, type = "binary") %>%
  
  # 1 if SC j is built
  add_variable(y[j], j = 1:m, type = "binary") %>%
  
  # Objective function
  set_objective(sum_expr(transportcost(i, j) * x[i, j], i = 1:n, j = 1:m) + 
                  sum_expr(fixedcost[j] * y[j], j = 1:m), "min") %>%
  
  #Demand of customers shouldn't exceed total facility capacities
  add_constraint(sum_expr(demand[i] * x[i, j], i = 1:n) <= capacity[j] * y[j], j = 1:m) %>%
  
  # every customer needs to be assigned to a SC
  add_constraint(sum_expr(x[i, j], j = 1:m) == 1, i = 1:n) %>% 
  
  # if a customer is assigned to a SC, then this SC must be built
  add_constraint(x[i,j] <= y[j], i = 1:n, j = 1:m)
model



library(ompr.roi)
library(ROI.plugin.glpk)
result <- solve_model(model, with_ROI(solver = "glpk", verbose = TRUE))

此时,正在对结果进行计算。

有什么办法可以减少计算时间?如果我理解正确,那么 0.4% 是当前模型与预期结果之间的差异。即使差异远大于此,我也会很高兴,我可以获得合适的模型。有什么办法可以设置吗?就像 5-6% 的差异就足够了。

【问题讨论】:

  • 您可能想尝试 Symphony。请参阅此处的讨论:github.com/dirkschumacher/ompr/issues/290
  • 这完成了工作。非常快。谢谢。 (P.S:您博客的忠实粉丝/追随者)
  • 当我在我的实时数据中尝试 Symphony 时,它非常慢,它有 7500 个客户点和 8 个服务中心。我将差距设置为 3%,它运行了 1.5 小时并没有产生任何结果。

标签: r optimization mixed-integer-programming operations-research ompr


【解决方案1】:

从@Erwin Kalvelagen 的评论中获得帮助。使用交响乐求解器并编辑了一行:

library(ROI.plugin.symphony)
result <- solve_model(model, with_ROI(solver = "symphony",
                                      verbosity=-1, gap_limit=1.5))

处理时间减少了很多,得到了答案!

【讨论】:

  • 谁能解释一下为什么 Symphony 是一个更好的求解器?或者指向资源/参考,以了解 ROI 中可用的求解器更快还是更慢?我无法让交响乐在我的上下文中运行...
  • @Bajcz Symphony 在您的案例中发生了什么?另外,我不认为一个比另一个更好,我认为最终的解决方案(如果可行的话)对两者都是相同的。对于这个问题,我使用了 symphony,因为我可以设置 gap_limit。即使在今天,我也从symphony 切换到glpk,以便设置时间限制。
  • 由于某种原因,我无法将 Symphony 的库安装在我的 U 的超级计算集群上。但我知道 ROI 中有大约 17 个求解器,所以我认为某些求解器必须比其他求解器具有一些优势。
【解决方案2】:

您可以尝试以下 3 种方法

  1. 您可以通过重新制定最后一个约束来进行测试。

如果一个客户被分配到一个 SC,那么这个 SC 必须被建立

你可以使用下面的来代替当前的约束 add_constraint(sum_expr(x[i,j], i = 1:n)

这应该会减少运行时间而不影响输出。

  1. 除此之外,您还可以根据您希望的最小最优性差距或/和您希望模型运行的最长运行时间添加终止标准。

  2. 您也可以尝试使用其他求解器而不是 glpk 并查看它的帮助。

【讨论】:

  • 谢谢!改变约束是有效的,但它没有给出任何解决方案,即每个解决方案的值都是 0。知道如何在 R 中做数字 2 吗?如果我可以设置一个最小的最优差距,那么我认为它会工作得很好。
  • 我不认为这种重新表述是正确的。
  • 谢谢@ErwinKalvelagen。是的,这是不正确的。感谢您指出。
  • 您可以使用M*y[j] 使其工作。然而,分类版本通常更可取。
【解决方案3】:

R 和 Python 库对于 MIP 来说非常慢 尝试使用 lp solve 开源求解器

【讨论】:

  • 您能否就某人(尤其是 R 用户)如何进行此操作提供额外的指导?我们中的一些人需要在 R 中工作和/或可能不熟悉它以外的开源选项......
猜你喜欢
  • 2022-07-02
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多