我们试图解决下一个线性优化问题:
我们有:
- Pij, i=1÷
- 3, j=1÷30, Pij 为正数
- Bi, i=1÷3, 整数正 数
搜索结果是 3 x 30 的二进制值 Xij 的矩阵,具有以下条件:
约束:
- 对于每个 j =1÷30,总和(按指数 i=1÷3(Xij=1
- 对于每个 i =1÷3,指数之和为 (j=1÷3o(Xij≤Bi
目标: 优化:
- 最大化(总和(按索引 i=1÷3( 总和(按索引 j=1÷30( Pij *Xij(
呵,我们可以解决R中的问题吗?
我试图用lpsolve
包做。收到的值不正确。
线性规划解决方案中 R 中的约束数量是否存在限制?
在实际情况中,我们的案例超过 25000(j 指数为 1÷30000(
提前谢谢你,
博里亚纳
决定将此任务简化为线性编程任务。这种决策方式构造了一个矩阵,Bi 约束维数为 3 x 3*j,Xij 约束构造了一个矩阵 j x 3*j 维数。两个矩阵应该垂直组合作为任务的约束——接收到的矩阵是 3+j x 3*j 维数。对象向量由 Pij 构造,但作为向量 90 x 1。rhs 约束是 Bi (1 x 3( 和 1 (1 x j( 向量的组合 – 向量是 1 x 3 + j。它适用于 lp 或 Rglpk_solve_LP。我用几个组合检查了这个。它适用于 j=5000,但不适用于 j=10000。我们应该将其用于 30000 个案例。矩阵变得太大了。是否有可能用另一种方式解决这个问题?线性编程过程有哪些限制?它们是否仅由计算机的RAM和矩阵的大小提供?
# read file
pd30 = read.csv("b3ovd30.csv") # read csv file
# objective function
P <- t(pd30)
c <- as.vector(t(P))
# linear constraints
S <- matrix(rep(1),1, ncol(P))
S0 <- matrix(rep(0),1, ncol(P))
#constraint that sum across row <= B[i]
A1 <- rbind ( cbind(S,S0,S0),cbind(S0,S,S0),cbind(S0,S0,S) )
rm(S0)
A0 <- matrix(rep(0),nrow(P),1)
Ad <- diag(1, ncol(P), ncol(P))
# constraint that sum of rows is 1
A2 <- cbind(Ad, Ad, Ad)
# both constraints
A <- rbind (A1, A2)
rm(A0)
rm(Ad)
rm(A1)
rm(A2)
# RHS of constraint for A1
b1 <- matrix(c(8,19,30), ncol=1)
# RHS of constraint for A2
b2 <- t(S)
# both RHS
b <- rbind (b1, b2)
rm(b1)
rm(b2)
#specify symbols for constraints:
LEG1 <- matrix(rep("<="), nrow(P),1)
LEG2 <- matrix(rep("=="), ncol(P),1)
LEG <- rbind (LEG1, LEG2)
rm(LEG1)
rm(LEG2)
types <- matrix(rep("B"), nrow(P)*ncol(P),1)
# Run
install.packages("Rglpk")
library(Rglpk)
result <- Rglpk_solve_LP(c, A, LEG, b, types , max = TRUE)
print(result$status)
print(result$solution)
solution3 <- matrix(result$solution, ncol=3, byrow = F)