Thursday, September 17, 2009

Modeling question

I'm a new GAMS user. I am trying to model and solve a problem using
binary variables.

In the problem I have two sets:

t time periods /t1*t7/
l location /L1*L5/ ;

Currently, I do not have an objective function and I am just trying to
satisfy the constraints of my problem. I have a simplifed case of my
problem working.

Simplified case equations and constraints:
- I have a binary variable x with 35 entries
        binary variable x(t,l)

- "Equation1" Solves for the supply at time period for each location
(L1, L2, L3, L4, and L5). The supply depends on the binary variable x
(t,l). For example:
        x(t1,L1) = 1, then the supply value would INCREASE
        x(t1,L1) = 0, then the supply value would DECREASE

- "Equation2" The sum of all the binary variables x(t,l) over a time
period must equal 1 (only one location can have increasing supply
during a given time period). Example:
        equation2(t)    ..      sum(l,x(t,l)) =e= 1 ;

- "Equation3" Provides the upper limit of the supply value that can be
reached at each location.

- "Equation4" Provides the lower limit of the supply value that can be
reached at each location.

This simplified case solves correctly (satisfies all constraints).

Current problem:
My problem is that currently (in the simplified case), the binary
variable can move to any location from one time period to the next.
So, if the supply gets too low at location 5 (L5), the binary variable
can jump from any location to L5 (example, from L1 during time period
t4 to L5 during time period t5).

What I need to tell GAMS is that the binary variable can only move 1
spot from time period to time period. Example:

At t1, x(t1,'L1') = 1 (so the binary variable is at L1).
The supply value is low at L5.
But the binary variable can only move in the following manner:
t1 -> x(t1,'L1') = 1
t2 -> x(t2,'L2') = 1
t3 -> x(t3,'L3') = 1
t4 -> x(t4,'L4') = 1
t5 -> x(t5,'L5') = 1 (finally arrives at L5)

Also, the binary variable can't move from L1 to L5 (imagine the
locations are in a line, unable to wrap around).

Can anyone provide an idea (or similar example problem implementation,
if possible) on how to model this in GAMS? I tried the following:

m1(t)$((ord(t) lt card(t)) and (x(t,'b1') eq 1))        ..      x(t+1,'L1') + x(t
+1,'L2') =e= 1 ;
m2(t)$(ord(t) lt card(t) and x(t,'b2') = 1)     ..      x(t+1,'L2') + x(t
+1,'L1') + x(t+1,'L3') =e= 1 ;
m3(t)$(ord(t) lt card(t) and x(t,'b3') = 1)     ..      x(t+1,'L3') + x(t
+1,'L2') + x(t+1,'L4') =e= 1 ;
m4(t)$(ord(t) lt card(t) and x(t,'b4') = 1)     ..      x(t+1,'L4') + x(t
+1,'L3') + x(t+1,'L5') =e= 1 ;
m5(t)$(ord(t) lt card(t) and x(t,'b5') = 1)     ..      x(t+1,'L5') + x(t
+1,'L4') =e= 1 ;

But I got the following error from GLPK (using mip):
**** The following MIP errors were detected in model first:
****  57 equation m1 .. VAR operands relational or boolean
****  57 equation m2 .. VAR operands relational or boolean
****  57 equation m3 .. VAR operands relational or boolean
****  57 equation m4 .. VAR operands relational or boolean
****  57 equation m5 .. VAR operands relational or boolean

I don't understand these error messages...

In summary:
I would appreciate any help (examples, books, etc.) on how to
constrain the movement on the binary variable to the position that is
either 1) the same (L2 to L2 is legal) or 2) adjacent (L2 can only
move to L1 or L3, if not staying at L2). I am stuck and getting
frustrated. Thank you!

You can not have a variable in a dollar condition. That would make the model nonlinear: you are writing essentially an if-then expression.

If I read the description correctly you could do something like:

positive variable pos(t) 'position at t';
defpos(t)..   pos(t) =e= sum(L, ord(L)*x(t,L));
bound1pos(t-1)..  pos(t) =L= pos(t-1) +1;
bound2pos(t-1)..  pos(t) =G= pos(t-1) -1;