2

我想用以下附加约束进一步约束下面的系统,它使用绝对值运算符:

abs(x1)+abs(x2)+abs(x3) <= 10

是否有可行的方法在 R 中实现这些额外的绝对值约束?

方程组:

maximize: x1 + 9x2 + x3;

subject to:

x1 + 2x2 + 3x3 <= 9

3x1 + 2x2 + 2x3 <= 15

代码:

require(lpSolve)
# objective function, constants, constraints
obj = c(1,9,1)
con = matrix(c(1,2,3,3,2,2), nrow=2, byrow=TRUE)
rel = c("<=", "<=")
rhs = c(9,15)

解决方案:

my.lp = lp("max", obj, con, rel, rhs)
my.lp$objval
my.lp$solution

显然这是一个简单的例子来说明我在网上搜索后得出的问题。正如在线帮助指南中所证明lp_solve,它本身似乎有一种方法。但是,如果可能,我更愿意将问题保留在 R 中。lp_solve

4

1 回答 1

6

|x|在 LP 中建模,您通常会创建两个新变量,x^-并且x^+. 将它们都约束为非负数:

x^-, x^+ >= 0

然后每次你x在你的模型中,用 替换它x^+ - x^-,每次你有|x|,用 替换它x^+ + x^-。请注意,这仅在您使用基于单纯形的 LP 求解器而不是内点方法时才有效。lp_solve 使用单纯形。

这样做的原因:假设x = 10在最佳解决方案中。然后求解器将设置x^+ = 10x^- = 0获得

 x  = x^+ - x^- = 10
|x| = x^+ + x^+ = 10.

如果x = -10在最优解中,则x^+ = 0, x^- = 10, 和

 x  = x^+ - x^- = -10
|x| = x^+ + x^+ =  10.

(求解器不会选择,比如说,x^+ = 50得到x^- = 40x = 10因为单纯形法总是选择极值点解。)

abs如果您对模型中的三个 's 中的每一个分别执行此技巧,它应该可以工作。

于 2015-03-09T00:31:30.627 回答