R: ompr 包约束
R: ompr package constraints
我在 R 中使用 ompr 包来解决优化问题。
书面优化问题如下所示:
最小 wi * xi
xi ε {0,1}
xi ≤ xj , i 的 j 关注者
如果在距离矩阵 (distmatrix) 中有一个值可用,则 i 是 j 的跟随者。如果值为 inf,则不可能有从 i 到 j
的连接
目标是分析 Material 的账单,为了让我的示例更简单一些,我创建了一个更简单的示例,其中的材料更少。
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])
如果我划掉约束,我得到的结果是 expext(考虑到约束未被使用)。我如何在约束内分别处理 i 和 j?
您的 add_constraint
调用中的过滤条件产生错误。 i
和 j
是向量,使用向量索引矩阵不会生成 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
)需要return一个长度为i/j
的逻辑向量,表示哪一行应该包含在模型中,哪一行应该包含在模型中不包括在内。
我在 R 中使用 ompr 包来解决优化问题。 书面优化问题如下所示:
最小 wi * xi
xi ε {0,1}
xi ≤ xj , i 的 j 关注者
如果在距离矩阵 (distmatrix) 中有一个值可用,则 i 是 j 的跟随者。如果值为 inf,则不可能有从 i 到 j
的连接目标是分析 Material 的账单,为了让我的示例更简单一些,我创建了一个更简单的示例,其中的材料更少。
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])
如果我划掉约束,我得到的结果是 expext(考虑到约束未被使用)。我如何在约束内分别处理 i 和 j?
您的 add_constraint
调用中的过滤条件产生错误。 i
和 j
是向量,使用向量索引矩阵不会生成 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
)需要return一个长度为i/j
的逻辑向量,表示哪一行应该包含在模型中,哪一行应该包含在模型中不包括在内。