airsp.gms : Aircraft Allocation

Description

The objective of this model is to allocate aircrafts to routes to maximize
the expected profit when traffic demand is uncertain. Three different
formulations are presented:

    the original lambda formulation
    a stochastic equivalent with sampling
    a stochastic equivalent with all scenarios


Large Model of Type : LP


Category : GAMS Model library


Main file : airsp.gms

$title Aircraft allocation - stochastic Optimization (AIRSP,SEQ=189)

$onText
The objective of this model is to allocate aircrafts to routes to maximize
the expected profit when traffic demand is uncertain. Three different
formulations are presented:

  * the original lambda formulation
  * a stochastic equivalent with sampling
  * a stochastic equivalent with all scenarios


Dantzig, G B, Chapter 28. In Linear Programming and Extensions.
Princeton University Press, Princeton, New Jersey, 1963.

Keywords: linear programming, stochastic programming, aircraft allocation, routing
$offText

Set
   i       'aircraft types and unassigned passengers' / a, b, c, d      /
   j       'assigned and unassigned routes'           / route-1*route-5 /
   h       'demand states'                            / 1*5      /
   ss      'nodes'                                    / s1*s1000 /
   s(ss)   'actual ord temp nodes'
   ij(i,j) 'possible assignments'
   jh(j,h) 'possible demand states';

Alias (h,hp,h1,h2,h3,h4,h5);

Table dd(j,h) 'demand distribution on route j'
               1    2    3    4    5
   route-1   200  220  250  270  300
   route-2    50  150
   route-3   140  160  180  200  220
   route-4    10   50   80  100  340
   route-5   580  600  620          ;

Table lambda(j,h) 'probability of demand state h on route j'
              1   2    3    4   5
   route-1   .2  .05  .35  .2  .2
   route-2   .3  .7
   route-3   .1  .2   .4   .2  .1
   route-4   .2  .2   .3   .2  .1
   route-5   .1  .8   .1         ;

Table c(i,j) 'costs per aircraft (1000s)'
       route-1  route-2  route-3  route-4  route-5
   a        18       21       18       16       10
   b                 15       16       14        9
   c                 10                 9        6
   d        17       16       17       15       10;

Table p(i,j) 'passenger capacity of aircraft i on route j'
       route-1  route-2  route-3  route-4  route-5
   a        16       15       28       23       81
   b                 10       14       15       57
   c                  5                 7       29
   d         9       11       22       17       55;

Parameter
   aa(i)       'aircraft availability'               / a 10, b 19, c 25, d 15 /
   k(j)        'revenue lost (1000 per 100  bumped)' / (route-1,route-2) 13, (route-3,route-4) 7, route-5 1 /
   ed(j)       'expected demand'
   deltb(j,h)  'incremental demand'
   gamma(j,h)  'probability of demand segment'
   drand(j,ss) 'sampled demand'
   sample(j)   'sampled mean'
   num         'temp value'
   prob(ss)    'scenario probability'
   probxx      'temp probability value';

ij(i,j) = p(i,j);
jh(j,h) = lambda(j,h);

ed(j)          = sum(h, lambda(j,h)*dd(j,h));
deltb(jh(j,h)) = dd(j,h) - dd(j,h-1);
gamma(j,h)     = sum(hp$(ord(hp) >= ord(h)), lambda(j,hp));

display deltb, gamma, ed;

Positive Variable
   x(i,j)   'number of aircraft type i assigned to route j'
   z(j)     'allocated capacity'
   bh(j,h)  'passengers bumped'
   bs(j,ss) 'passengers bumped';

Variable
   phi 'total expected costs'
   oc  'operating cost';

Equation
   ab(i)     'aircraft balance'
   cb(j)     'capacity balance'
   dbh(j,h)  'demand balance'
   dbs(j,ss) 'demand balance'
   ocd       'operating cost definition'
   objh      'objective function'
   objs      'objective function';

ab(i)..    sum(ij(i,j), x(ij)) =l= aa(i);

cb(j)..    z(j) =e= sum(ij(i,j), p(ij)*x(ij));

dbh(j,h).. dd(j,h)    - bh(j,h) =l= z(j);

dbs(j,s).. drand(j,s) - bs(j,s) =l= z(j);

ocd..      oc  =e= sum((i,j), c(i,j)*x(i,j));

objh ..    phi =e= oc + sum(j, k(j)*sum(jh(j,h), lambda(j,h)*bh(j,h)));

objs..     phi =e= oc + sum(j, k(j)*sum(s, prob(s)*bs(j,s)));

Model
   alloch 'aircraft allocation' / ab, cb, dbh, ocd, objh /
   allocs 'aircraft allocation' / ab, cb, dbs, ocd, objs /;

option limCol = 0, limRow = 0, solPrint = off;

Parameter rep 'quick report';

solve alloch minimizing phi using lp;
rep(i,j,'alloch')      = x.l(i,j);
rep('ev',' ','alloch') = phi.l;

* set up a sample of some size
s(ss) = (ord(ss) <= 100);

loop((j,s),
   num = uniform(0,1);
   drand(j,s) = sum(jh(j,h)$(num < gamma(jh)), deltb(j,h));
);
prob(s)   = 1/card(s);
sample(j) = sum(s, drand(j,s))/card(s);

display sample;

solve allocs minimizing phi using lp;
rep(i,j,'allocs')      = x.l(i,j);
rep('ev',' ','allocs') = phi.l;

* enumerate all scenarios
prob(s) = 0;
s(ss)   = no;
s('s1') = yes;
loop((h1,h2,h3,h4,h5),
   probxx = lambda('route-1',h1)
          * lambda('route-2',h2)
          * lambda('route-3',h3)
          * lambda('route-4',h4)
          * lambda('route-5',h5);
   if(probxx,
      drand('route-1',s) = dd('route-1',h1);
      drand('route-2',s) = dd('route-2',h2);
      drand('route-3',s) = dd('route-3',h3);
      drand('route-4',s) = dd('route-4',h4);
      drand('route-5',s) = dd('route-5',h5);
      prob(s) = probxx;
*     s(ss) = s(ss-1)   this looks nice but is very slow
      s(ss+1)$s(ss) = yes;
      s(ss-1)$s(ss) =  no;
   );
);
s(ss) = prob(ss);

solve allocs minimizing phi using lp;
rep(i,j,'allocss')      = x.l(i,j);
rep('ev',' ','allocss') = phi.l;

display rep;