Details Examples (omod0e)
/***************************************************************/
/* */
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: omod0e */
/* TITLE: Details Examples (omod0e) */
/* PRODUCT: OR */
/* SYSTEM: ALL */
/* KEYS: OR */
/* PROCS: OPTMODEL */
/* DATA: */
/* */
/* SUPPORT: UPDATE: */
/* REF: */
/* MISC: Examples from the Details section of the OPTMODEL */
/* chapter of Mathematical Programming. */
/* */
/***************************************************************/
/* Data Set Input/Output */
proc optmodel;
set LOCS = {'New York', 'Washington', 'Boston'}; /* locations */
set DOW = 1..7; /* day of week */
var s{LOCS, DOW} init 1;
create data soldata from [location day_of_week]={LOCS, DOW} sale=s;
quit;
data abcd;
input letter $ @@;
datalines;
a b c d
;
proc optmodel;
set<num> subscripts=1..4;
string letter{subscripts};
read data abcd into [_N_] letter[5-_N_];
print letter;
quit;
data revdata;
input month rev @@;
datalines;
1 200 2 345 3 362 4 958
5 659 6 804 7 487 8 146
9 683 10 732 11 652 12 469
;
proc optmodel;
set m = 1..3;
var revenue{1..12};
read data revdata into [_N_] revenue=rev;
create data qtr1 from [month]=m revenue[month];
create data qtr2 from [month]=m revenue[month+3];
create data qtr3 from [month]=m revenue[month+6];
create data qtr4 from [month]=m revenue[month+9];
/* Formatted Output */
proc optmodel;
number a=1.7, b=2.8;
set s={a,b};
put a b; /* list output */
put a= b=; /* named output */
put 'Value A: ' a 8.1 @30 'Value B: ' b 8.; /* formatted */
string str='Ratio (A/B) is:';
put str (a/b); /* strings and expressions */
put s=; /* named set output */
quit;
proc optmodel;
number square{i in 0..5} = i*i;
number recip{i in 1..5} = 1/i;
print square recip;
proc optmodel;
set R=1..6;
set C=1..4;
number a{i in R, j in C} = 10*i+j;
print a;
quit;
/* ODS Table and Variable Names */
proc optmodel printlevel=2;
ods output PrintTable=expt ProblemSummary=exps DerivMethods=exdm
SolverOptions=exso SolutionSummary=exss OptStatistics=exos;
var x{1..2} >= 0;
min z = 2*x[1] + 3 * x[2] + x[1]**2 + 10*x[2]**2
+ 2.5*x[1]*x[2] + x[1]**3;
con c1: x[1] - x[2] <= 1;
con c2: x[1] + 2*x[2] >= 100;
solve;
print x;
quit;
title2 'PrintTable';
proc print data=expt;
run;
title2 'ProblemSummary';
proc print data=exps;
run;
title2 'SolverOptions';
proc print data=exso;
run;
title2 'DerivMethods';
proc print data=exdm;
run;
title2 'SolutionSummary';
proc print data=exss;
run;
title2 'OptStatistics';
proc print data=exos;
run;
title2;
/* Constraints */
proc optmodel;
var x, y;
min r = x**2 + y**2;
con c: x+y >= 1;
solve;
print x y;
quit;
proc optmodel;
var x{1..3};
con b: sum{i in 1..3}(x[i] - i) = 0;
expand b;
quit;
proc optmodel;
var x init 1;
con c1: x**2 <= 5;
con c2: 5 >= x**2;
con c3: -x**2 >= -5;
con c4: -5 <= -x**2;
expand;
print c1.body c2.body c3.body c4.body;
quit;
/* Suffixes */
proc optmodel;
var x, y;
min z = x + y;
con c: x + 2*y <= 3;
solve;
print x.lb x.ub x.init x.sol;
print y.lb y.ub y.init y.sol;
print c.lb c.ub c.body c.dual;
x.lb=0;
y.lb=0;
c.lb=1;
solve;
print x.lb x.ub x.init x.sol;
print y.lb y.ub y.init y.sol;
print c.lb c.ub c.body c.dual;
quit;
/* Dual Value */
proc optmodel;
var x, y;
min z = 6*x + 7*y;
con
4*x + y >= 5,
-x - 3*y <= -4,
x + y <= 4;
solve;
print x y;
expand _ACON_ ;
print _ACON_.dual _ACON_.body;
_ACON_[1].lb = _ACON_[1].lb - 1;
solve;
_ACON_[2].ub = _ACON_[2].ub + 1;
solve;
quit;
/* Reduced Costs */
proc optmodel;
var x >= 0, y >= 0, z >= 0;
max cost = 4*x + 3*y - 5*z;
con
-x + y + 5*z <= 15,
3*x - 2*y - z <= 12,
2*x + 4*y + 2*z <= 16;
solve;
print x y z;
print x.rc y.rc z.rc;
quit;
/* Model Update */
proc optmodel;
var x, y;
min r = x**2 + y**2;
con c: x+y >= 1;
solve;
print x y;
drop c;
solve;
print x y;
restore c;
fix x=0.3;
solve;
print x y c.dual;
unfix x;
solve;
print x y c.dual;
quit;
proc optmodel printlevel=0;
var x1 >= 0, x2 >= 0, x3 >= 0, x4 >= 0, x5 >= 0;
minimize z = x1 + x2 + x3 + x4;
con a1: x1 + x2 + x3 <= 4;
con a2: x4 + x5 <= 6;
con a3: x1 + x4 >= 5;
con a4: x2 + x5 >= 2;
con a5: x3 >= 3;
solve with lp;
print _var_.name _var_ _var_.rc _var_.status;
print _con_.name _con_.lb _con_.body _con_.ub _con_.dual _con_.status;
/* OPTMODEL Options */
proc optmodel;
number n = 1/7;
for {i in 1..9 by 4}
do;
reset options pdigits=(i);
print n;
end;
reset options pdigits; /* reset to default */
quit;
/* More on Index Sets */
proc optmodel;
put (setof {i in 1..3, j in 1..3 : j >= i} <i, j>);
quit;
proc optmodel;
put ({i in 1..3, i..3});
quit;
proc optmodel;
number N = 3;
set<num,str> S = {<1,'a'>,<2,'b'>,<3,'a'>,<4,'b'>};
put ({i in 1..N, <(i),j> in S});
put ({i in 1..N, j in slice(<i,*>, S)});
quit;