lpSolve 包似乎给出了奇怪的结果

lpSolve package seems to give strange results

我正在使用 R "lpSolve" 包 downloaded from Cran link,它似乎给出了奇怪的答案。我想确保不是我把事情搞砸了(很可能是这样)。

比如我要解决的问题是

maximize -3x-2y
s.t       5x -y <=  1
         -2x-2y <= -1
         -3x-2y <=  0

我在R中的设置:

> obj
   -3 -2
> cond
    5   -1
   -2   -2
   -3   -2
> dir
   "<=" "<=" "<="
> rhs
   1 -1  0

将这些应用于 lp.solve

中的 lp 函数
> lp(direction="max", objective.in=obj, const.mat=cond, const.dir=dir, const.rhs=rhs)$objval

这个returns-1,不过,我知道解是0而不是-1。

我也尝试将 objective 设置为 "min",我得到:

> lp(direction = "max", objective.in = obj, const.mat = cond, const.dir = dir, const.rhs = rhs)$objval
[1] -1
> lp(direction = "min", objective.in = obj, const.mat = cond, const.dir = dir, const.rhs = rhs)$objval
[1] 0

当我尝试最小化 objective 时,我怎么可能得到更大的值?它与 x 的负系数有关吗?我翻了一下包手册,没有看到objective功能的相关要求。

你是对的,(x, y) = (-1, 1.5) 产生了一个 objective 值 0,从约束来看显然是最大可能值。

阻碍您获得此信息的是 ?lp 中的以下行:

Note that every variable is assumed to be >= 0!

假设每个变量都是非负的,-1 确实是你能做的最好的。

要解决您原来的问题,您可以定义非负决策变量 x+x- 来表示 x 的正负部分,并对 y。这是生成的优化模型:

mod <- lp(direction = "max",
          objective.in = c(obj, -obj),
          const.mat = cbind(cond, -cond),
          const.dir = dir,
          const.rhs = rhs)
mod$objval
# [1] 0
mod$solution[1:2] - mod$solution[3:4]
# [1] -1.0  1.5

在所有情况下,此处使用的转换的效果是消除变量的非负性要求并保持其他一切不变。

最后,你的最小化看起来像是给你一个 objective 值 0 的原因是它实际上是无界的并且没有在其响应中设置 objval 值:

lp(direction = "min", objective.in = obj, const.mat = cond, const.dir = dir, const.rhs = rhs)
# Error: status 3