R

时间:2017-03-21 10:49:47

标签: r optimization

我们试图解决下一个线性优化问题:

我们有:

  • Pij,i = 1÷3,j = 1÷30,Pij是正的
  • Bi,i = 1÷3,整数正

搜索结果是具有下一个条件的3×30二进制值Xij的矩阵:

约束:

  • 对于每个j = 1÷30,Sum(通过索引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)

提前谢谢你,

Boriana

2 个答案:

答案 0 :(得分:0)

决定将此任务减少为线性编程任务。这种决策方式构造一个矩阵,其具有用于Bi约束的3×3×j维度和用于Xij约束的一个矩阵j×3 * j维度。应该将两个矩阵垂直组合作为任务的约束 - 接收的矩阵是3 + j×3 * j维。对象矢量由Pij构造,但是作为矢量90×1构成.rhs约束是Bi(1×3)和矢量1(1×j)之间的组合 - 矢量是1×3 + j。 它与lp或Rglpk_solve_LP一起使用。 我用几种组合检查了这个。它适用于j = 5000,但它不适用于j = 10000。我们应该将它用于30000个案例。矩阵变得太大了。是否有可能以另一种方式解决这个问题? 线性编程程序有哪些限制?它们只来自计算机的RAM和矩阵的大小吗?

答案 1 :(得分:0)

# 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)