我正在使用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的负系数有关?我查看了包装手册,但没有看到任何相关的目标函数要求。
答案 0 :(得分:3)
你是对的,(x, y) = (-1, 1.5)
产生的客观值为0,从约束中可以看出这是最大可能值。
阻止你获取此信息的是?lp
中的以下行:
请注意,假设每个变量都是> = 0!
假设每个变量都是非负数,确实-1是你能做的最好的。
要解决原始问题,您可以定义非负决策变量x+
和x-
来表示x
的正面和负面部分,并为{{1}执行相同操作}}。以下是最终的优化模型:
y
在所有情况下,这里使用的转换的效果是消除变量的非负性要求并保持其他一切相同。
最后,您的最小化看起来像是给出了客观值为0的原因是它实际上是无界的,并且没有在其响应中设置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
值:
objval