我正在使用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
这返回-1,但是,我知道解决方案是0而不是-1。
我也尝试将目标设置为“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
当我试图最小化目标时,我怎么可能获得更大的价值?是否与x的负系数有关?我查看了包装手册,但没有看到对目标功能的任何相关要求。
你是正确的,(x, y) = (-1, 1.5)
产生一个客观值0,从约束显然是最大可能的。
阻止你获得这个的东西是?lp
中的以下行:
请注意,假设每个变量都> = 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
在所有情况下,这里使用的变换的效果是消除变量的非负性要求并保持其他所有变量相同。
最后,你的最小化看起来像是给你一个客观值为0的原因是它实际上是无界的并且没有在响应中设置objval
值:
lp(direction = "min", objective.in = obj, const.mat = cond, const.dir = dir, const.rhs = rhs)
# Error: status 3