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

kport.gms : Product Portfolio Optimization


This problem computes minimal cost solutions satisfying the
demand of pre-given product portfolios. It determines the number
and size of reactors and gives a schedule of how may batches of
each product run on each reactor. There are two scenarios (s1 20
products. s2 40 products), add --scenario s2 as a GAMS
parameter to specify the second scenario.

The global optimal reactor volumes are:
data set s1
vr.fx('r1') = 132.5; vr.fx('r2') = 250;

data set s2
vr.fx('r1') = 20; vr.fx('r2') = 100; vr.fx('r3') = 250;

Two formulations are presented, a compact MINLP formulations
and a linearized MIP formulation using special ordered sets.

Problem sizes for data set s1

                         MINLP       MIP
variables                 102        548
equations                  28        418
Non-zeros                 190       1574
discrete variables         40        186

References:
Large Model of Type: MINLP
$Title Product Portfolio Optimization (KPORT,SEQ=270) $Ontext This problem computes minimal cost solutions satisfying the demand of pre-given product portfolios. It determines the number and size of reactors and gives a schedule of how may batches of each product run on each reactor. There are two scenarios (s1 20 products. s2 40 products), add --scenario s2 as a GAMS parameter to specify the second scenario. The global optimal reactor volumes are: data set s1 vr.fx('r1') = 132.5; vr.fx('r2') = 250; data set s2 vr.fx('r1') = 20; vr.fx('r2') = 100; vr.fx('r3') = 250; Two formulations are presented, a compact MINLP formulations and a linearized MIP formulation using special ordered sets. Problem sizes for data set s1 MINLP MIP variables 102 548 equations 28 418 Non-zeros 190 1574 discrete variables 40 186 Kallrath, J. Exact Computation of Global Minima of a Nonconvex Portfolio Optimization Problem. In Frontiers in Global Optimization. Eds Floudas C A and Pardalos P M. Kluwer Academic Publishers, Dortrecht, 2003. $Offtext $eolcom // Sets s scenario / s1,s2 / rR reactors / R1*R3 / pP products / L1*L37 / r(rR) reactors considered in scenario p(pP) products considered in scenario Table RData(rR,s,*) Reactor data s1.VMIN s1.VMAX s2.VMIN s2.VMAX R1 102.14 250 20 50 R2 176.07 250 52.5 250 R3 151.25 250 Table PData(pP,s,*) Product data s1.Dem s1.PTime s2.Dem s2.Ptime L1 2600 6 2600 6 L2 2300 6 2300 6 L3 1700 6 450 6 L4 530 6 1200 6 L5 530 6 560 6 L6 280 6 530 6 L7 250 6 530 6 L8 230 6 140 6 L9 160 6 110 6 L10 90 6 110 6 L11 70 6 10 6 L12 390 6 110 6 L13 250 6 90 6 L14 160 6 90 6 L15 100 6 90 6 L16 70 6 70 6 L17 50 6 50 6 L18 50 6 30 6 L19 50 6 10 6 L20 10 6 L21 10 6 L22 190 6 L23 180 6 L24 70 6 L25 70 6 L26 40 6 L27 40 6 L28 40 6 L29 30 6 L30 20 6 L31 20 6 L32 20 6 L33 10 6 L34 10 6 L35 10 6 L36 10 6 L37 10 6 Parameters VMIN(rR) volume flow of products in m^3 per week VMAX(rR) volume flow of products in m^3 per week DEMAND(pP) volume flow of products in m^3 per week PRODTIME(pP) production time in hours per batch Scalars WHRS hours in a week / 168 / CSTI in kEuro depreciation per m^3 reactor and week / 0.97 / CSTF in kEuro per week and reactor / 2.45 / ESF economies of scale factor / 0.5 /; $if not set scenario $set scenario s1 VMIN(rR) = RDATA(rR,'%scenario%','VMIN'); VMAX(rR) = RDATA(rR,'%scenario%','VMAX'); DEMAND(pP) = PDATA(pP,'%scenario%','Dem'); PRODTIME(pP) = PDATA(pP,'%scenario%','PTime'); * Determine scenario sets r(rR) = VMAX(rR) > 0; p(pP) = DEMAND(pP) > 0; * definition of compact MINLP model Variables cTotal total costs cInvest invest cost cFixed fix costs f(rR,pP) utilization rate vR(rR) reactor volume in m^3 pS(pP) surplus production bvr(rR) indicating whether reactor r is active nB(rR,pP) number of batches of product p in reactor r Positive variables f,vR,pS; Integer variable nB; Binary Variables bvr; Equations DEFcT total costs DEFcF fix costs DEFcI invest cost TR(rR) production time of reactor r SPP(pP) compute surplus production p RVUB(rR) maximal volume of reactor r RVLB(rR) minimal volume reactor r; * define the total cost DEFcT.. cTotal =e= cFixed + cInvest; DEFcF.. cFixed =e= sum (r, CSTF*bvr(r)); DEFcI.. cInvest =e= sum (r, CSTI**ESF*vR(r)**ESF); * limit the total production time of reactor r TR(r).. sum(p, PRODTIME(p)*nB(r,p) ) =l= WHRS*bvr(r); * compute the surplus production SPP(p).. pS(p) =e= SUM(r, nB(r,p)*f(r,p)*vR(r))/DEMAND(p) - 1 ; * lower and upper bounds on reactor volume RVLB(r).. vR(r) =g= VMIN(r)*bvr(r); RVUB(r).. vR(r) =l= VMAX(r)*bvr(r); Model portfolioMINLP / DEFcT, DEFcF, DEFcI, TR, SPP, RVLB, RVUB / ; f.lo(r,p) = 0.4; f.up(r,p) = 1; // bounds on the utilization rates pS.lo(p) = 0; pS.up(p) = 1; // bounds on the surplus production * bounds on the number of batches nB.lo(r,p) = 0; nB.up(r,p) = min(WHRS/PRODTIME(p),floor(2*DEMAND(p)/(VMIN(r)*f.lo(r,p)))); nB.up(r,p)$(2*DEMAND(p) < f.lo(r,p)*VMIN(r)) = 0; vR.l(rR) = 99; vR.lo(r) = VMIN(r); solve portfolioMINLP using minlp minimizing cTotal; * additional variables and equations to define the MIP formulation * first we need to linearize the product terms: Sets i dyadic represenation set / 0*10 / j discretization points for SOS2 / 0*10 / rpi(rR,pP,i) i required for representing np Parameters vRj(rR,j) x part of SOS2 construct ESFvRj(rR,j) y part of SOS2 construct Positive Variable pT(rR,pP) number of batches x reactor volume in m^3 pT2(rR,pP,i) same for in dyadic representation ESFvR(rR) economies of scale for vR Binary Variables nBx(rR,pP,i) dyadic represenation of nB SOS2 Variables lambda(rR,j) approximation of economies of scale function Equations CNP(rR,pP) compute the nonlinear products nB(rp)*f(rp)*vR(r) SPPx(pP) compute surplus production p CNPl0(rR,pP) linearized version of CNP CNPl1(rR,pP) linearized version of CNP CNPl2(rR,pP,i) linearized version of CNP CNPl3(rR,pP,i) linearized version of CNP CNPl4(rR,pP,i) linearized version of CNP DEFSOSx(rR) SOS2 x construct DEFSOSy(rR) SOS2 y construct DEFSOSone(rR) SOS2 sum construct DEFcIlp linearized version of DEFcI; * new surplus production equation SPPx(p).. pS(p) =e= SUM(r, pT(r,p))/DEMAND(p) - 1 ; * computes batches x volume CNP(r,p).. pT(r,p) =e= nB(r,p)*f(r,p)* vR(r); * Linearized version of CNP CNPl0(r,p).. pT(r,p) =e= sum(rpi(r,p,i),2**(ord(i)-1)*pT2(rpi)); CNPl1(r,p).. nB(r,p) =e= sum(rpi(r,p,i),2**(ord(i)-1)*nBx(rpi)); CNPl2(rpi(r,p,i)).. pT2(rpi) =l= VMAX(r)*nBx(rpi); CNPl3(rpi(r,p,i)).. pT2(rpi) =l= vR(r); CNPl4(rpi(r,p,i)).. pT2(rpi) =g= f.lo(r,p)*(vR(r)-VMAX(r)*(1-nbx(rpi))); * SOS2 approximation of economies of scale function DEFSOSx(r).. vR(r) =e= sum(j, vRj(r,j)*lambda(r,j)); DEFSOSy(r).. ESFvR(r) =e= sum(j, ESFvRj(r,j)*lambda(r,j)); DEFSOSone(r).. sum(j, lambda(r,j)) =e= 1; DEFcIlp.. cInvest =e= sum (r, CSTI**ESF*ESFvR(r)); rpi(r,p,i) = ord(i) <= ceil(log(max(1,nB.up(r,p)))/log(2)) + 1$nB.up(r,p); vRj(r,j) = (VMAX(r)-VMIN(r))*(ord(j)-1)/(card(j)-1) + VMIN(r); ESFvRj(r,j) = vRj(r,j)**ESF; Model PortfolioMIP /TR, SPPx, RVLB, RVUB, DEFcF, DEFcIlp, DEFcT, CNPl0, CNPl1, CNPl2, CNPl3, CNPl4, DEFSOSx, DEFSOSy, DEFSOSone/; portfolioMIP.iterlim = 1e8; portfolioMIP.optcr = .05; solve portfolioMIP using mip minimizing cTotal;