jit.gms : Design of Just-in-Time Flowshops

Description

This just-in-time flowshop problem involves P products and
S stages. Each stage contains identical equipment performing the
same type of operation on different products. The objective is
to minimize the total equipment related cost.


Small Model of Type : MINLP


Category : GAMS Model library


Main file : jit.gms

$title Design of Just-in-Time Flowshops (JIT,SEQ=250)

$onText
This just-in-time flowshop problem involves P products and
S stages. Each stage contains identical equipment performing the
same type of operation on different products. The objective is
to minimize the total equipment related cost.


Gunasekaran, A, Goyal, S K, Martikainen T, and Yli-Olli, P,
Equipment Selection Problems in just-in-time Manufacturing Systems.
Journal of the Operational Research Society 44 (1993), 345-353

Gutierrez, R A, and Sahinidis, N, A
Lagrangian Approach to the Pooling Problem.
Interantional J Production Research 34 (1996), 797-818.

Keywords: mixed integer nonlinear programming, equipment selection, just in time
          manufacturing, capacity planning
$offText

Set
   p 'products'
   s 'stages';

Parameter
   alpha(p,s) 'processing cost'
   beta(p,s)  'production inbalance cost'
   delta(p)   'demand'
   mu(s)      'machine cost'
   M          'maximum amount of money for investment'
   pi(p,s)    'priority weight'
   sigma(p,s) 'product cycles'
   q(p,s)     'batch size'
   tau(p,s)   'processing time'
   omega(s)   'resource requirements'
   bigomega   'max resource available for all machines';

Variable
   n(s)     'number of machines'
   pr(p,s)  'production rate'
   dpr(p,s) 'absolute value differences'
   obj;

Integer Variable n;

Equation
   objdef
   prdef(p,s)
   budget
   resource
   abs1
   abs2;

objdef.. obj =e= sum((p,s), alpha(p,s)*sigma(p,s)/pr(p,s))
              +  sum((p,s)$(ord(s) < card(s)), beta(p,s)*dpr(p,s))
              +  sum(s, mu(s)*n(s));

prdef(p,s)..  pr(p,s) =e= pi(p,s)/tau(p,s)*n(s);

budget..      sum(s, mu(s)*n(s)) =l= M;

resource..    sum(s, omega(s)*n(s)) =l= bigomega;

abs1(p,s+1).. dpr(p,s) =g= pr(p,s)   - pr(p,s+1);

abs2(p,s+1).. dpr(p,s) =g= pr(p,s+1) - pr(p,s);

Model jit / all /;

Set
   p / p1*p3 /
   s / s1*s4 /;

Parameter
   delta(p)  / p1 3000, p2 2000, p3 4000          /
   mubase(s) / s1 5000, s2 5500, s3 4000, s4 6000 /
   omega(s)  / s1   60, s2   50, s3   80, s4   40 /
   M         / 6E6  /
   bigomega  / 3000 /;

Table dat(*,p,s) 'data from table 10.16'
         p1.s1  p1.s2  p1.s3 p1.s4  p2.s1 p2.s2 p2.s3 p2.s4  p3.s1  p3.s2  p3.s3  p3.s4
   alpha   2.0    1.5    3.0   2.0    3.0   2.5   1.0   2.0    2.0    2.0    2.0    1.0
   beta     60     90     60    80     90    80    80    70     80    100     80     90
   kappa   0.2    0.3    0.4   0.3    0.1   0.4   0.3   0.2    0.2    0.3    0.2    0.2
   pi      0.2    0.4    0.5   0.5    0.6   0.3   0.3   0.2    0.2    0.3    0.2    0.3
   tau       1      1      1     1      1     1     1     1      1      1      1      1
   q       800    800    800   800    700   700   700   700    900    900    900    900;

Set c 'cases' / case1*case9 /;

Parameter
   multq(c)  / case1 1,   case2 1,   case3 1
               case4 1,   case5 1,   case6 0.5
               case7 1.5, case8 2,   case9 2.5 /
   multmu(c) / case1 1,   case2 0.5, case3 1.5
               case4 2,   case5 2.5, case6 1
               case7 1,   case8 1,   case9 1   /
   rep(c,*) 'summary report';

n.lo(s)    = 1;
pr.lo(p,s) = .01;
pi(p,s)    = dat('pi',p,s);
alpha(p,s) = dat('alpha',p,s);
beta(p,s)  = dat('beta',p,s)*1e+5;

abort$sum(s, abs(1 - sum(p, pi(p,s))) > 1e-10) 'weight do not add to 1', pi;

option optCr = 0;

loop(c,
   q(p,s)     = dat('q',p,s)*multq(c);
   mu(s)      = mubase(s)*multmu(c);
   tau(p,s)   = q(p,s)*(dat('tau',p,s) - dat('kappa',p,s)*1e-5*mu(s));
   sigma(p,s) = delta(p)/q(p,s);
   pr.lo(p,s) = pi(p,s)/tau(p,s);

   solve jit using minlp min obj;

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

   rep(c,s) = n.l(s);

   rep(c,'ModelStat') = jit.modelStat;
   if(jit.modelStat   = %modelStat.optimal% or jit.modelStat = %modelStat.integerSolution%,
      rep(c,'Processing') = sum((p,s), alpha(p,s)*sigma(p,s)/pr.l(p,s));
      rep(c,'Imbalance')  = sum((p,s)$(ord(s) < card(s)), beta(p,s)*abs(pr.l(p,s)-  pr.l(p,s+1)));
      rep(c,'Investment') = sum(s, mu(s)*n.l(s));
   );
);

display rep;