2

I would like to further constrain the system below with the following additional constraint, which makes use of the absolute value operator:

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

Is there a feasible way to implement these additional absolute value constraints in R?

System of equations:

maximize: x1 + 9x2 + x3;

subject to:

x1 + 2x2 + 3x3 <= 9

3x1 + 2x2 + 2x3 <= 15

R Code:

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)

Solution:

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

Obviously this is a simple example to illustrate the problem I pulled after searching online. It seems there is an approach in lp_solve itself, as evidenced here in the lp_solve online help guide. However, I would prefer to keep the problem framed in R if possible.

989
  • 12,579
  • 5
  • 31
  • 53
jd8585
  • 187
  • 1
  • 8

1 Answers1

6

To model |x| in an LP, you typically create two new variables, x^- and x^+. Constrain them both to be nonnegative:

x^-, x^+ >= 0

Then each time you have x in your model, replace it with x^+ - x^-, and each time you have |x|, replace it with x^+ + x^-. Note that this only works if you're using a simplex-based LP solver rather than an interior-point method. lp_solve uses simplex.

The reason why this works is: Suppose x = 10 in the optimal solution. Then the solver would set x^+ = 10 and x^- = 0 to obtain

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

And if x = -10 in the optimal solution, then x^+ = 0, x^- = 10, and

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

(The solver won't choose, say, x^+ = 50 and x^- = 40 to get x = 10 because the simplex method always chooses extreme-point solutions.)

If you do this trick separately with each of the three abs's in your model, it should work.

LarrySnyder610
  • 2,277
  • 12
  • 24
  • Thanks! Implementation is still a bit fuzzy to me but I should figure it out. If you have any code examples from where you have implemented this, that would be appreciated. Thanks again. – jd8585 Mar 09 '15 at 01:57
  • 2
    I don't -- I'm not an R user. Good luck! – LarrySnyder610 Mar 09 '15 at 17:30