Introduction to Optimization example (intmp0)

/***************************************************************/
/*                                                             */
/*          S A S   S A M P L E   L I B R A R Y                */
/*                                                             */
/*    NAME: intmp0                                             */
/*   TITLE: Introduction to Optimization example (intmp0)      */
/* PRODUCT: OR, GRAPH                                          */
/*  SYSTEM: ALL                                                */
/*    KEYS: OR                                                 */
/*   PROCS: OPTMODEL                                           */
/*    DATA:                                                    */
/*                                                             */
/* SUPPORT:                             UPDATE:                */
/*     REF:                                                    */
/*    MISC: Example from the Introduction to Optimization      */
/*          chapter of Mathematical Programming.               */
/*                                                             */
/***************************************************************/

/***************************************************************

                  Model Building: PROC OPTMODEL

 ***************************************************************/

proc optmodel;
   /* declare variables */
   var choco >= 0, toffee >= 0;

   /* maximize objective function (profit) */
   maximize profit = 0.25*choco + 0.75*toffee;

   /* subject to constraints */
   con process1:    15*choco +    40*toffee <= 27000;
   con process2:               56.25*toffee <= 27000;
   con process3: 18.75*choco                <= 27000;
   con process4:    12*choco +    50*toffee <= 27000;

   /* solve LP using primal simplex solver */
   solve with lp / solver = primal_spx;

   /* display solution */
   print choco toffee;
quit;

data Products;
   length Name $10.;
   input Name $ Profit;
datalines;
Chocolate  0.25
Toffee     0.75
;

data Processes;
   length Name $15.;
   input Name $ Available_time Chocolate Toffee;
datalines;
Cooking            27000           15          40
Color/Flavor       27000            0          56.25
Condiments         27000          18.75         0
Packaging          27000           12          50
;


proc optmodel;
   /* declare sets and data indexed by sets */
   set <string> Products;
   set <string> Processes;
   num Profit{Products};
   num AvailableTime{Processes};
   num RequiredTime{Products,Processes};

   /* declare the variable */
   var Amount{Products};

   /* maximize objective function (profit) */
   maximize TotalProfit = sum{p in Products} Profit[p]*Amount[p];
   /* subject to constraints */
   con Availability{r in Processes}:
      sum{p in Products} RequiredTime[p,r]*Amount[p] <= AvailableTime[r];

   /* abstract algebraic model that captures the structure of the */
   /*    optimization problem has been defined without referring  */
   /*    to a single data constant                                */

   /* populate model by reading in the specific data instance */
   read data Products into Products=[name] Profit;
   read data Processes into Processes=[name] AvailableTime=Available_time
      {p in Products} <RequiredTime[p,name]= col(p)>;

   /* solve LP using primal simplex solver */
   solve with lp / solver = primal_spx;

   /* display solution */
   print Amount;
quit;