dumpsol.gms : Alternate Solutions for a Simple Facility Location Problem

Description

A simple version of a facility location problem is used to show how the
solution pool and the tools associated with it work. This example is taken
from the Cplex 11 User's Manual (ILOG, Cplex 11 User's Manual, 2007)

A company is considering opening as many as four warehouses in order to serve
nine different regions. The goal is to minimize the sum of fixed costs
associated with opening warehouses as well as the various transportation
costs incurred to ship goods from the warehouses to the regions.

Whether or not to open a warehouse is represented by binary variable ow.
Whether or not to ship goods from warehouse i to region j is represented
by binary variable oa.

Each region needs a specified amount of goods, and each warehouse can store
only a limited quantity of goods. In addition, each region must be served
by exactly one warehouse.


Small Model of Type : GAMS


Category : GAMS Test library


Main file : dumpsol.gms

$Title Alternate Solutions for a Simple Facility Location Problem (DUMPSOL,SEQ=476)
$Ontext

A simple version of a facility location problem is used to show how the
solution pool and the tools associated with it work. This example is taken
from the Cplex 11 User's Manual (ILOG, Cplex 11 User's Manual, 2007)

A company is considering opening as many as four warehouses in order to serve
nine different regions. The goal is to minimize the sum of fixed costs
associated with opening warehouses as well as the various transportation
costs incurred to ship goods from the warehouses to the regions.

Whether or not to open a warehouse is represented by binary variable ow.
Whether or not to ship goods from warehouse i to region j is represented
by binary variable oa.

Each region needs a specified amount of goods, and each warehouse can store
only a limited quantity of goods. In addition, each region must be served
by exactly one warehouse.


The following GAMS program demonstrates how to collect the solutions
found during optimization in several GAMS solvers. GAMS will store the
individual solutions in GDX containers/files which can then be further
used by other programs or the same GAMS run. The solver links will name
these GDX containers 'soln_loc_pNN.gdx', where NN will be the serial
number of the solution found. To manage the different solutions, the
names of the GDX containers created by the solver link will be stored in
dumpsol.gdx in the set 'index' using the set elements file*.

$offtext

Set i    warehouses   / w1*w4 /
    j    regions      / r1*r9 /
Parameters
    f(i) fixed costs  / w1 130, w2 150, w3 170, w4 180 /
    c(i) capacity     / w1  90, w2 110, w3 130, w4 150 /
    d(j) demand       / r1 10, r2 10, r3 12, r4 15, r5 15,
                        r6 15, r7 20, r8 20, r9 30 /;

Table t(j,i) transport costs
        w1   w2   w3   w4
    r1  10   30   25   55
    r2  10   25   25   45
    r3  20   23   30   40
    r4  25   10   26   40
    r5  28   12   20   29
    r6  36   19   16   22
    r7  40   39   22   27
    r8  75   65   55   35
    r9  34   43   41   62;

Variables
    totcost    total cost
    fcost      fixed cost
    tcost      transportation cost
    ow(i)      indicator for open warehouse
    oa(i,j)    indicator for open shipment arc warehouse to region
Binary variables ow, oa;

Equations
    deftotcost definition total cost
    deffcost   definition fixed cost
    deftcost   definition transportation cost
    defwcap(i) limit utilization of warehouse by its capacity
    onew(j)    only one warehouse per region
    defow(i,j) warehouse open if shipment from i to j;

deftotcost.. totcost =e= fcost + tcost;

deffcost..   fcost =e= sum(i, f(i)*ow(i));

deftcost..   tcost =e= sum((i,j), t(j,i)*oa(i,j));

defwcap(i).. sum(j, d(j)*oa(i,j)) =l= c(i);

onew(j)..    sum(i, oa(i,j)) =e= 1;

defow(i,j).. ow(i) =g= oa(i,j);

Model loc /all/ ;


* --- Define sets, parameters and files to hold solutions

Sets soln           possible solutions /file1*file1000,soln_loc_p1*soln_loc_p1000/
     solnpool(soln) actual solutions;
Scalar cardsoln     number of solutions;

* create empty dumpsol.gdx in case solver finds optimal solution right away (e.g., cbc)
execute_unload 'dumpsol.gdx', solnpool=index;

Alias (soln,s1,s2), (*,u);
Parameters
    owX(soln,i)    warehouse indicator by solution
    oaX(soln,i,j)  arc indicator by solution
    totcostX(soln) total cost
    fcostX(soln)   fixed cost
    tcostX(soln)   transportation cost
    xcostX(soln,*) cost structure by solution
    mcostX(soln,*) cost structure by solution;
files fsoln;
option limrow=0, limcol=0, optcr=0;
loc.optfile=1; loc.solprint=%solprint.Quiet%; loc.savepoint = 1;

$if %gams.mip% == cbc    $echo dumpsolutions dumpsol.gdx          > cbc.opt
$if %gams.mip% == cplex  $echo solnpool      dumpsol.gdx          > cplex.opt
$if %gams.mip% == gurobi $echo solnpool      dumpsol.gdx          > gurobi.opt
$if %gams.mip% == scip   $echo gams/dumpsolutions = "dumpsol.gdx" > scip.opt
$if %gams.mip% == xpress $echo solnpool      dumpsol.gdx          > xpress.opt
solve loc min totcost using mip;

execute_load 'dumpsol.gdx', solnpool=index;
cardsoln = card(solnpool); display cardsoln;
oaX(soln,i,j) = 0; owX(soln,i) = 0; xcostX(soln,u) = 0;
loop(solnpool(soln),
  put_utility fsoln 'gdxin' / solnpool.te(soln);
  execute_loadpoint;
  oaX(soln,i,j)             = round(oa.l(i,j));
  owX(soln,i)               = round(ow.l(i));
  xcostX(soln,'totcost')    = totcost.l;
  xcostX(soln,'tcost')      = tcost.l;
  xcostX(soln,'fcost')      = fcost.l;
);
* Restore the solution reported to GAMS
execute_loadpoint 'loc_p.gdx';
display xcostX;

$if %gams.mip% == cbc    $echo dumpsolutionsmerged dumpsol.gdx          > cbc.op2
$if %gams.mip% == cplex  $echo solnpoolMerge       dumpsol.gdx          > cplex.op2
$if %gams.mip% == scip   $echo gams/dumpsolutionsmerged = "dumpsol.gdx" > scip.op2
$if %gams.mip% == xpress $echo solnpoolMerge       dumpsol.gdx          > xpress.op2


* create empty dumpsol.gdx in case solver finds optimal solution right away (e.g., cbc)
option clear=solnpool;
execute_unload 'dumpsol.gdx', solnpool=index, oaX=oa, owX=ow, totcostX=totcost, tcostX=tcost, fcostX=fcost;

loc.optfile=2;
solve loc min totcost using mip;
execute_load 'dumpsol.gdx', solnpool=index, oaX=oa, owX=ow, totcostX=totcost, tcostX=tcost, fcostX=fcost;

mcostX(solnpool,'totcost') = totcostX(solnpool);
mcostX(solnpool,'tcost')   = tcostX(solnpool);
mcostX(solnpool,'fcost')   = fcostX(solnpool);

display xcostX, mcostX;