GAMS [ Home | Support | Sales | Solvers | Documentation | Model Libraries | Search | Contact Us ]

bchtlheu.inc : Heuristic for trimloss minimization


Used by:  bchtlbas.gms


$title Trim Loss Minimization (Heuristic)

SET i product roll
    j pattern number

SCALAR Bmax width of entire roll
       delta maximum loss in pattern
       Nkmax maximum number of knives

PARAMETER n(i)  number of orders of each product roll
          b(i)  width of each roll
          mupp(j)

* Load data from the instance
$gdxin trimloss
$load i j Bmax delta Nkmax n b mupp

VARIABLES
	 r(i,j)    number of products of type i in pattern j
	 y(j)      existence of pattern j
	 m(j)      repeats of pattern j
         objval    objective function variable;

FREE VARIABLES    objval;
BINARY VARIABLE   y;
INTEGER VARIABLE  r;

Parameter rx(i,j) number of products of type i in pattern j;
* Load the LP solution from the node
$gdxin bchout
$load r

rx(i,j) = r.l(i,j);

* Undo the bound change from branching
r.lo(i,j) = 0; r.up(i,j) = Nkmax;

EQUATIONS
	 f           objective function
	 numroll(i)  order constraints ensuring sufficient production
	 widthL(j)   width lower bound constraint
	 widthU(j)   width upper bound constraint
	 rL(j)       logical constraint on r
	 sumr(j)     logical constraint on r
	 mL(j)       logical constraint on m
	 mU(j)       logical constraint on m
	 sumbil      lower bound on total number of patterns made
	 yy(j)       ordering of y variables to reduce degeneracy
	 lmm(j)      ordering of m variables to reduce degeneracy
;

f.. objval =e= SUM(j, m(j) + ord(j)/10 * y(j));

numroll(i).. SUM(j, m(j) * rx(i,j)) =g= n(i);

widthL(j).. SUM(i,b(i) * r(i,j)) =g= (Bmax - delta) * y(j);
widthU(j).. SUM(i,b(i) * r(i,j)) =l= Bmax * y(j);

rL(j).. y(j) =l= SUM(i,r(i,j));

sumr(j).. SUM(i,r(i,j)) =l=  Nkmax * y(j);

mL(j).. y(j) =l= m(j);
mU(j).. m(j) - mupp(j) * y(j) =l= 0;

sumbil  .. SUM(j, m(j)) =g=
              max(ceil(sum(i,n(i))/Nkmax), ceil(sum(i,b(i)*n(i))/Bmax))+1;

yy(j+1).. y(j+1) =l= y(j);

lmm(j+1).. m(j+1) =l= m(j);

* Bounds
r.UP(i,j) = Nkmax;
m.UP(j) = mupp(j);

MODEL trimlossx /ALL/;

Positive variables dp(i,j), dm(i,j) deviations
Equations
         defdev(i,j)
         defcovered(i)
         defobj
;

defdev(i,j).. r(i,j) =e= rx(i,j) + dp(i,j) - dm(i,j);
defcovered(i).. sum(j, r(i,j)) =g= 1;
defobj.. objval =e= sum((i,j), dp(i,j) + dm(i,j));

MODEL findr /defobj, defcovered, defdev, widthL, widthU, rL, sumr, yy/;

findr.optcr=0;
SOLVE findr USING MIP MINIMIZING objval;

r.fx(i,j) = round(r.l(i,j));
rx(i,j) = r.l(i,j);

trimlossx.optcr = 0;
SOLVE trimlossx USING MIP MINIMIZING objval;