A Nonlinear Optimization Problem (oclpe04)
/***************************************************************/
/* */
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: oclpe04 */
/* TITLE: A Nonlinear Optimization Problem (oclpe04) */
/* PRODUCT: OR */
/* SYSTEM: ALL */
/* KEYS: OR */
/* PROCS: OPTMODEL */
/* DATA: */
/* */
/* SUPPORT: UPDATE: */
/* REF: */
/* MISC: Example 4 from the CLP solver chapter of the */
/* Mathematical Programming book. */
/* */
/***************************************************************/
proc optmodel;
set DOM{1..3} = [ (-5 .. 5) (-5 .. 9 by 2) (1 .. 10) ];
var X{i in 1..3} integer >= min{j in DOM[i]} j <= max{j in DOM[i]} j;
/* map the domain of X[1] and X[2] to 1 .. list size */
var Z {1..2} integer;
/* map nonlinear expressions */
var Y {1..4} integer;
/* Use an element constraint to represent noncontiguous domains */
/* domains with negative numbers, and nonlinear functions. */
/* Z[2] does not appear anywhere else. Its only purpose is
to restrict X[2] to take a value from DOM[2]. */
con MapDomainTo1ToCard{i in 1..2}:
element(Z[i], {k in DOM[i]} k, X[i]);
/* Functional Dependencies on X[1] */
/* Y[1] = X[1]^3 -- Use Z[1] for X[1] for proper indexing */
con Y1:
element(Z[1], {k in DOM[1]} (k^3), Y[1]);
/* Y[4] = mod(X[1], 4) */
con Y4:
element(Z[1], {k in DOM[1]} (mod(k,4)), Y[4]);
/* Functional Dependencies on X[3] */
/* Y[2] = 2^X[3] */
con Y2:
element(X[3], {k in DOM[3]} (2^k), Y[2]);
/* Y[3] = X[3]^2 */
con Y3:
element(X[3], {k in DOM[3]} (k^2), Y[3]);
/* X[1] - 0.5 * X[2] + X[3]^2 <= 50 */
con Con1:
X[1] - 0.5 * X[2] + Y[3] <= 50;
/* mod(X[1],4) + 0.25 * X[2] >= 1.5 */
con Con2:
Y[4] + 0.25 * X[2] >= 1.5;
/* Objective function: X[1]^3 + 5 * X[2] - 2^X[3] */
max Objective = Y[1] + 5 * X[2] - Y[2];
solve;
print X Y Z;
quit;