【问题标题】:Linear optimisation programing in RR中的线性优化编程
【发布时间】:2018-01-31 21:28:32
【问题描述】:

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

我们有:

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

提前谢谢你,

博里亚纳

【问题讨论】:

  • 如果您没有得到“正确”的解决方案,那么要么有多个解决方案,要么您使用了错误的 lpsolve。但是,您没有提供代码,因此很难进一步帮助您。
  • 我设法设置了正确的解决方案。约束数量的限制是什么?是否仅来自矩阵大小限制?

标签: r optimization


【解决方案1】:

决定将此任务简化为线性规划任务。这种决策方式为 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 和矩阵的大小?

【讨论】:

    【解决方案2】:
    # 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)
    

    【讨论】:

    • 这是一个解决方案还是只是您没有放入问题本身的代码?你能详细说明一下吗?
    • @LW001 这是所描述问题的代码解决方案。在 30 例的情况下。可以使用的案例大小取决于计算机。
    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多