User Tools

Site Tools


How do I model an absolute value in a linear model?

You cannot put an absolute term for a variable directly into a linear model such as LP or MIP. The model fragment below will not work:

obj..       z=e=sum(j, abs(x(j)));
cons(i)..   sum(j, a(i,j)*x(j)) =l= b(i);

model foo /all/;
solve foo minimizing z using lp;

Various error messages will be given:

  14  solve foo minimizing z using lp;
****                                 $51,256
****  51  Endogenous function argument(s) not allowed in linear models
**** 256  Error(s) in analyzing solve statement. More detail appears
****      Below the solve statement above
**** The following LP errors were detected in model foo:
****  51 equation obj.. the function ABS is called with non-constant arguments

Instead of using the abs() function, you could introduce two positive variables xpos(j) and xneg(j) and substitute:

  • abs(x(j)) = xpos(j) + xneg(j)
  • x(j) = xpos(j) - xneg(j)

This reformulation splits the x(j) into a positive part xpos(j) and a negative part xneg(j). Note that this only works if abs(x(j)) is minimized, because in that case, either xpos(j) or xneg(j) is forced to zero in an optimal solution.

The reformulated model fragment is:

positive variable xpos(j), xneg(j);
obj..        z=e=sum(j, xpos(j) + xneg(j));
cons(i)..    sum(j, a(i,j)*(xpos(j) - xneg(j))) =l= b(i);

model foo /all/;
solve foo minimizing z using lp;
IMPRESSUM / LEGAL NOTICEPRIVACY POLICY gams/model_an_absolute_value_in_a_linear_model.txt · Last modified: 2020/05/19 07:00 by Frederik Fiand