## Friday, May 5, 2017

### Upper bounds on integer variables

In a model I used to solve as a continuous problem, I have some variables $$0 \le x_i \le U_i$$. In addition I have some cost $$c_i$$ and a budget $$B$$:

 $\sum_i c_i x_i \le B$

When moving towards an integer model, of course I want to tighten the upper bounds $$U_i$$. I.e.:

 $U_i := \min\left\{U_i,\frac{B}{c_i}\right\}$

Now, GAMS does not accept non-integer bounds on integer variables:

 **** Matrix error - bounds on discrete variables have to be integer

(it is debatable if it is a good thing to require this). So we can do something like:

 x.up(i) = trunc(min(u(i), budget/cost(i)));

However we could end up with something like trunc(0.999999) which in all likelihood should be considered as 1. Numbers like that can easily result from round-off and truncation errors in floating point computations and during data transfer between systems. We now need to apply a certain tolerance to safeguard against this, e.g.:

 x.up(i) = trunc(min(u(i), budget/cost(i))+1e-6);

It looks like I am taking on much responsibility here. It may have been better to leave things as they were before.