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;