limdom01.gms : Test limited domains for variables in model

Description

With GAMS 31 we introduced the capability to limit the domain of variables
in the model statement. This test uses the trnsport model to verify that
this new feature leads to the same result as using explicit dollar conditions
and that explicit dollar conditions can also be used together with variables
with limited domains.

Contributor: Lutz Westermann, March 2020


Small Model of Type : GAMS


Category : GAMS Test library


Main file : limdom01.gms

$Title Test limited domains for variables in model (limdom01,SEQ=812)

$ontext
With GAMS 31 we introduced the capability to limit the domain of variables
in the model statement. This test uses the trnsport model to verify that
this new feature leads to the same result as using explicit dollar conditions
and that explicit dollar conditions can also be used together with variables
with limited domains.

Contributor: Lutz Westermann, March 2020
$offtext


Set
   i 'canning plants' / seattle,  san-diego /
   j 'markets'        / new-york, chicago, topeka /;

Parameter
   a(i) 'capacity of plant i in cases'
        / seattle    350
          san-diego  600 /

   b(j) 'demand at market j in cases'
        / new-york   325
          chicago    300
          topeka     275 /;

Table d(i,j) 'distance in thousands of miles'
              new-york  chicago  topeka
   seattle         2.5      1.7     1.8
   san-diego       2.5      1.8     1.4;

Scalar f 'freight in dollars per case per thousand miles' / 90 /;

Parameter c(i,j) 'transport cost in thousands of dollars per case';
c(i,j) = f*d(i,j)/1000;

Set ij(i,j) / #i.#j /;

Variable
   x(i,j) 'shipment quantities in cases'
   z      'total transportation costs in thousands of dollars';

Positive Variable x;

Equation
   cost       'define objective function'
   costD      'define objective function'
   supply(i)  'observe supply limit at plant i'
   supplyD(i) 'observe supply limit at plant i'
   demand(j)  'satisfy demand at market j'
   demandD(j) 'satisfy demand at market j';

cost..       z =e= sum((i,j), c(i,j)*x(i,j));
costD..      z =e= sum((i,j), c(i,j)*x(i,j)$ij(i,j));

supply(i)..  sum(j, x(i,j))         =l= a(i);
supplyD(i).. sum(j, x(i,j)$ij(i,j)) =l= a(i);

demand(j)..  sum(i, x(i,j))         =g= b(j);
demandD(j).. sum(i, x(i,j)$ij(i,j)) =g= b(j);


Model transportExplDol Use explicut dollar conditions
                       / costD, supplyD, demandD        /;
Model transportImplDol Limit the domain of variable x
                       / cost,  supply,  demand,  x(ij) /;
Model transportTwoDol  Combine explicit dollar conditions and the limited domain of x
                       / costD, supplyD, demandD, x(ij) /;

option lp=convert;
Alias (i,ii), (j,jj);

loop((ii,jj),
    ij(ii, jj) = no;
    
    solve transportExplDol using lp minimizing z;
    execute.CheckErrorLevel 'grep -v "LP written by GAMS" gams.gms > transportExplDol.gms';
    
    solve transportImplDol using lp minimizing z;
    execute.CheckErrorLevel 'grep -v "LP written by GAMS" gams.gms > transportImplDol.gms';
    
    solve transportTwoDol using lp minimizing z;
    execute.CheckErrorLevel 'grep -v "LP written by GAMS" gams.gms > transportTwoDol.gms';
    
    execute.CheckErrorLevel '=diff -b transportExplDol.gms transportImplDol.gms';
    execute.CheckErrorLevel '=diff -b transportExplDol.gms transportTwoDol.gms';
    
    ij(ii, jj) = yes;
);