【问题标题】:R: ompr package constraintsR: ompr 封装约束
【发布时间】:2019-01-14 20:50:46
【问题描述】:

我在 R 中使用 ompr 包来解决优化问题。 书面优化问题是这样的:

最小 wi * xi

xi ϵ {0,1}

xi ≤ xj , i 的 j 个追随者

i 是 j 的跟随者,如果在距离矩阵 (distmatrix) 中有一个值可用。如果值为 inf,则 i 到 j 之间没有连接

目标是分析物料清单,为了使我的示例更容易一些,我创建了一个更简单的示例,其中包含更少的材料。

vertices_undef <- data.frame(matrix(ncol=3, nrow=5))
vertices_undef$X1 <- c("3","5","9","7","2")
vertices_undef$X3 <- c(12, -8, 8, 3, -9)

rownames(vertices_undef) <- vertices_undef$X1

distMatrix <- data.frame(matrix(ncol=5, nrow=5))
rownames(distMatrix) <- vertices_undef$X1
colnames(distMatrix) <- vertices_undef$X1
distMatrix$`3` <- c("inf", 0.7, "inf", "inf", 0.3)
distMatrix$`5` <- c(3, "inf", "inf", "inf", 0.3)
distMatrix$`9` <- c("inf", 0.7, "inf", 0, 3)
distMatrix$`7` <- c("inf", "inf", "inf", 0.3, "inf")
distMatrix$`2` <- c("inf", 7, "inf", "inf", 0.3)


w <- vertices_undef$X3
w <- t(w)
colnames(w)<- vertices_undef$ID
w <- t(w)

    result <- MIPModel() %>%
      add_variable(x[i], type = "binary", i = as.integer(as.character(vertices_undef$X1))) %>%
      set_objective(sum_expr(x[i]*w[i,1], i = as.integer(as.character(vertices_undef$X1))), "min") %>%
      add_constraint(x[i]<=x[j], i = as.integer(as.character(vertices_undef$X1)), j = as.integer(as.character(vertices_undef$X1)), is.finite(distMatrix[i,j])==TRUE)%>%
      solve_model(with_ROI(solver = "glpk"))

    get_solution(result, x[i])

如果我划掉约束,我会得到结果(考虑到没有使用约束)。我怎样才能在 i 和 j 的约束内分别处理?

【问题讨论】:

    标签: r glpk mixed-integer-programming ompr


    【解决方案1】:

    add_constraint 调用中的过滤条件会产生错误。 ij 是向量,使用向量索引矩阵不会产生 add_constraint 要求的单个逻辑向量,而是另一个矩阵。此外,一些i/j 组合不属于您的distMatrix 矩阵。

    内部发生的事情本质上是这样的:

    x <- expand.grid(i = as.integer(as.character(vertices_undef$X1)),
                     j = as.integer(as.character(vertices_undef$X1)))
    is.finite(distMatrix[x$i, x$j])
    

    过滤条件(即表达式is.finite(distMatrix[i,j])==TRUE)需要返回一个长度为i/j的逻辑向量,表示模型中应该包含哪些行,哪些不应该包含。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多