R:ompr软件包约束

时间:2018-08-07 17:23:21

标签: r glpk mixed-integer-programming

我在R中使用ompr软件包来解决优化问题。 书面形式的优化问题如下:

Min wi * xi

xi ϵ {0,1}

xi≤xj,i的j个跟随者

如果在距离矩阵(distmatrix)中有值,则i是j的跟随者。如果值为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的约束范围内分别处理?

1 个答案:

答案 0 :(得分:0)

您的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的逻辑向量,该逻辑向量指示应在模型中包括哪一行,而不应包括在哪一行。 >