$ontext Filename: pool.gms Author: Mohit Tawarmalani, August 2002 Purpose: To encode the pq-formulation of the pooling problem described in: M. Tawarmalani and N. V. Sahinidis, "Convexification and Global Optimization of the Pooling Problem," May 2002, Mathematical Programming, submitted. $offtext options optcr=0, optca=1.e-6, limrow=0, limcol=0, reslim = 10000; positive variables q(comp, pool), y(pool, pro), z(comp, pro); q.up(comp, pool) = ubq(comp, pool); y.up(pool, pro) = uby(pool, pro); z.up(comp, pro) = ubz(comp, pro); variable cost; equations obj objective function, clower(comp) lower bound component availability cupper(comp) upper bound component availability pszrlt(comp,pool) ss-rlt on pool size constraints plower(pro) minimum product production pupper(pro) maximum product demand pqlower(pro,qual) minimum product quality requirement pqupper(pro,qual) maximum product quality fraction(pool) fractions sum to one extensions(pool, pro) convexification constraints; obj.. cost =e= sum(pro, sum(pool$(uby(pool,pro) > 0), sum(comp$(ubq(comp, pool) > 0), cprice(comp)*y(pool,pro)*q(comp,pool))) - pprice(pro)*sum(pool$(uby(pool,pro) > 0), y(pool, pro)) + sum(comp$(ubz(comp,pro)>0), (cprice(comp)-pprice(pro))*z(comp, pro)) ); clower(comp).. sum(pool$(ubq(comp,pool)>0), sum(pro$(uby(pool,pro)>0), q(comp,pool)*y(pool, pro))) + sum(pro$(ubz(comp,pro)>0), z(comp, pro)) =g= cl(comp); cupper(comp).. sum(pool$(ubq(comp,pool)>0), sum(pro$(uby(pool,pro)>0), q(comp,pool)*y(pool, pro))) + sum(pro$(ubz(comp,pro)>0), z(comp, pro)) =l= cu(comp); pszrlt(comp,pool)$(ubq(comp,pool)>0).. sum(pro$(uby(pool,pro)>0), q(comp,pool)*y(pool,pro)) =l= q(comp,pool)*psize(pool); plower(pro).. sum(pool$(uby(pool,pro)>0), y(pool,pro)) + sum(comp$(ubz(comp, pro)>0), z(comp, pro)) =g= prl(pro); pupper(pro).. sum(pool$(uby(pool,pro)>0), y(pool,pro)) + sum(comp$(ubz(comp, pro)>0), z(comp, pro)) =l= pru(pro); pqlower(pro, qual).. sum(pool$(uby(pool,pro)>0), sum(comp$(ubq(comp,pool)>0), cqual(comp, qual)*q(comp,pool)*y(pool,pro))) + sum(comp$(ubz(comp, pro)>0), cqual(comp, qual)*z(comp, pro)) =g= sum(pool$(uby(pool,pro)>0), pqlbd(pro, qual)*y(pool,pro)) + sum(comp$(ubz(comp, pro)>0), pqlbd(pro, qual)*z(comp, pro)); pqupper(pro, qual).. sum(pool$(uby(pool,pro)>0), sum(comp$(ubq(comp,pool)>0), cqual(comp, qual)*q(comp,pool)*y(pool,pro))) + sum(comp$(ubz(comp, pro)>0), cqual(comp, qual)*z(comp, pro)) =l= sum(pool$(uby(pool,pro)>0), pqubd(pro, qual)*y(pool,pro)) + sum(comp$(ubz(comp, pro)>0), pqubd(pro, qual)*z(comp, pro)); fraction(pool).. sum(comp$(ubq(comp,pool)>0), q(comp, pool)) =e= 1; extensions(pool, pro)$(uby(pool,pro)>0).. sum(comp$(ubq(comp,pool)>0), q(comp, pool)*y(pool, pro)) =e= y(pool, pro); model poolprob /all/; $if %gams.nlp% == baron $include baronoptions.gms solve poolprob minimizing cost using nlp;