如何用lpSolve解决简单的线性规划问题

时间:2019-01-26 15:20:00

标签: optimization linear-programming

我正试图最大化功能 $ a_1x_1 + \ cdots + a_nx_n $ 受约束 $ b_1x_1 + \ cdots + b_nx_n \ leq c $ $ x_i \ geq 0 $ 用于所有 $ i $ 。对于下面的玩具示例,我选择了 $ a_i = b_i $ ,所以问题是最大化 $ 0x_1 + 25x_2 + 50x_3 + 75x_4 + 100x_5 $ 给定 $ 0x_1 + 25x_2 + 50x_3 + 75x_4 + 100x_5 \ leq 100 $ 。通常,目标函数的最大值应为100,但是当我运行下面的代码时,得到的解决方案为2.5e + 31。发生了什么事?

library(lpSolve)

a <- seq.int(0, 100, 25)
b <- seq.int(0, 100, 25)
c <- 100


optimal_val <- lp(direction = "max", 
                  objective.in = a,
                  const.mat = b, 
                  const.dir = "<=", 
                  const.rhs = c, 
                  all.int = TRUE)

optimal_val

1 个答案:

答案 0 :(得分:1)

b不是正确的矩阵。在lp调用之前,您应该这样做:

b <- seq.int(0, 100, 25)
b <- matrix(b,nrow=1)

这将为您提供一个明确的1 x 5矩阵:

> b
     [,1] [,2] [,3] [,4] [,5]
[1,]    0   25   50   75  100

现在您将看到:

> optimal_val
Success: the objective function is 100 

背景:默认情况下,R会将矢量视为列矩阵:

> matrix(c(1,2,3))
     [,1]
[1,]    1
[2,]    2
[3,]    3