2015-03-08 151 views
2

我想进一步约束之下具有以下附加约束,这使得使用绝对值运营商的系统:绝对值限制R中

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

是否有实现这些额外的一条可行之路R中的绝对值约束?方程的

系统:

maximize: x1 + 9x2 + x3; 

subject to: 

x1 + 2x2 + 3x3 <= 9 

3x1 + 2x2 + 2x3 <= 15 

R代码里面:

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本身有一种方法,联机帮助指南中的here就是证明。但是,如果可能,我宁愿将问题保留在R中。

回答

3

要在LP中建模|x|,通常需要创建两个新变量,x^-x^+。约束它们都为负,:

x^-, x^+ >= 0 

然后每次在模型中有x时间,与x^+ - x^-取代它,并在每次有|x|时间,用x^+ + x^-更换。请注意,这仅适用于使用基于Simplex的LP解算器而不是内点法的情况。 lp_solve使用单工。

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

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

如果在最优解x = -10,然后x^+ = 0x^- = 10

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

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

如果你在模型中分别使用三个abs这个技巧,它应该可以工作。

+0

谢谢!对我来说,实现仍然有点模糊,但我应该弄明白。如果你有任何你已经实现的代码示例,那将不胜感激。再次感谢。 – jd8585 2015-03-09 01:57:14

+2

我不 - 我不是R用户。祝你好运! – grendelsdad 2015-03-09 17:30:21