sos1a.gms : Test of SOS1 variables with active upper bounds

Description

simple capacitated transportation model
source_j   -->    dest_j
0<=x_j<=xmax

upper bounds put a squeeze on x_j
when x(J) is SOS1, the MIP and RMIP solutions
should be very different.

N.B. We only test cases where the lower bounds on SOS1 vars are 0.
There is no consensus definition when lower bounds are nonzero.

Small Model of Type : MIP

Category : GAMS Test library

Main file : sos1a.gms

\$title Test of SOS1 variables with active upper bounds (SOS1A,SEQ=106)

\$onText
*  simple capacitated transportation model
*     source_j   -->    dest_j
*             0<=x_j<=xmax
*
*  upper bounds put a squeeze on x_j
*  when x(J) is SOS1, the MIP and RMIP solutions
*  should be very different.
*
*  N.B. We only test cases where the lower bounds on SOS1 vars are 0.
*  There is no consensus definition when lower bounds are nonzero.
\$offText

\$if not set TESTTOL \$set TESTTOL 1e-6
\$if not set SLOWOK \$set SLOWOK 0
scalar slowOK 'slow solves are OK: just abort.noError in this case' / %SLOWOK% /;
\$eolCom //

set J / 1 * 3 /;

parameters
c(J) /
1       .9,     // less valuable commodity
2       1,
3       1.1     // more valuable commidity
/,
1       .8,
2       .6,
3       .6
/;

sos1 variable
x(J);

variable
obj;

x.lo(J) = 0;
x.up(J) = xmax(J);

equations
xsum        'one unit shipped across source -> destination',
objdef;

objdef .. obj  =e=  sum {J, c(J) * x(J)};
xsum ..   sum {J, x(J)}  =l=  1;

model captrans / objdef, xsum /;
captrans.optcr = 0;

scalar tol / %TESTTOL% /,
mipobj / .72 /,
mipsum / .8 /,
rmipobj / 1.06 /,
rmipsum / 1 /;
parameter xmip(J)  / 1 .8 /,
xrmip(J) / 2 .4
3 .6 /;

solve captrans using mip maximizing obj;
abort.noError\$[slowOK and %solveStat.resourceInterrupt% = captrans.solvestat] 'Solve too slow';
if {(captrans.solvestat = %solveStat.capabilityProblems%),
abort\$(captrans.modelstat <> %modelStat.noSolutionReturned%)
* skip checks if the solver is not SOS1-capable
else
abort\$( captrans.solvestat <> %solveStat.normalCompletion% or captrans.modelstat <> %modelStat.optimal%)
'wrong status codes', captrans.solvestat, captrans.modelstat;
abort\$( abs(captrans.objval - mipobj) > tol) 'Wrong MIP objective';
abort\$( abs(obj.l - mipobj) > tol)           'Wrong MIP obj.l';
abort\$( smax(J,abs(x.l(J) - xmip(J))) > tol) 'Wrong MIP x.l';
abort\$( abs(xsum.l - mipsum) > tol)          'Wrong MIP xsum.l';
};

solve captrans using rmip maximizing obj;
abort.noError\$[slowOK and %solveStat.resourceInterrupt% = captrans.solvestat] 'Solve too slow';
abort\$( captrans.solvestat <> %solveStat.normalCompletion% or captrans.modelstat <> %modelStat.optimal%)
'wrong status codes', captrans.solvestat, captrans.modelstat;
abort\$( abs(captrans.objval - rmipobj) > tol) 'Wrong RMIP objective';
abort\$( abs(obj.l - rmipobj) > tol)           'Wrong RMIP obj.l';
abort\$( smax(J,abs(x.l(J) - xrmip(J))) > tol) 'Wrong RMIP x.l';
abort\$( abs(xsum.l - rmipsum) > tol)          'Wrong RMIP xsum.l';
GAMS Development Corp.
GAMS Software GmbH

General Information and Sales
U.S. (+1) 202 342-0180
Europe: (+49) 221 949-9170
GAMS is a registered trademark of GAMS Software GmbH in the European Union