 
               

Consider the problem of diet optimization. There are six different foods: bread, milk, cheese, potato, fish, and yogurt. The cost and nutrition values per unit are displayed in Table 6.5.
Table 6.5: Cost and Nutrition Values
| Bread | Milk | Cheese | Potato | Fish | Yogurt | |
|---|---|---|---|---|---|---|
| Cost | 2.0 | 3.5 | 8.0 | 1.5 | 11.0 | 1.0 | 
| Protein, g | 4.0 | 8.0 | 7.0 | 1.3 | 8.0 | 9.2 | 
| Fat, g | 1.0 | 5.0 | 9.0 | 0.1 | 7.0 | 1.0 | 
| Carbohydrates, g | 15.0 | 11.7 | 0.4 | 22.6 | 0.0 | 17.0 | 
| Calories | 90 | 120 | 106 | 97 | 130 | 180 | 
The following SAS code creates the data set fooddata of Table 6.5: 
         
data fooddata; infile datalines; input name $ cost prot fat carb cal; datalines; Bread 2 4 1 15 90 Milk 3.5 8 5 11.7 120 Cheese 8 7 9 0.4 106 Potato 1.5 1.3 0.1 22.6 97 Fish 11 8 7 0 130 Yogurt 1 9.2 1 17 180 ;
The objective is to find a minimum-cost diet that contains at least 300 calories, not more than 10 grams of protein, not less than 10 grams of carbohydrates, and not less than 8 grams of fat. In addition, the diet should contain at least 0.5 unit of fish and no more than 1 unit of milk.
You can model the problem and solve it by using PROC OPTMODEL as follows:
proc optmodel;
   /* declare index set */
   set<str> FOOD;
   
   /* declare variables */
   var diet{FOOD} >= 0;
   
   /* objective function */
   num cost{FOOD};
   min f=sum{i in FOOD}cost[i]*diet[i];
   
   /* constraints */
   num prot{FOOD};
   num fat{FOOD};
   num carb{FOOD}; 
   num cal{FOOD};
   num min_cal, max_prot, min_carb, min_fat;
   con cal_con: sum{i in FOOD}cal[i]*diet[i] >= 300;
   con prot_con: sum{i in FOOD}prot[i]*diet[i] <= 10;
   con carb_con: sum{i in FOOD}carb[i]*diet[i] >= 10;
   con fat_con: sum{i in FOOD}fat[i]*diet[i] >= 8;
   
   /* read parameters */
   read data fooddata into FOOD=[name] cost prot fat carb cal;
   
   /* bounds on variables */
   diet['Fish'].lb = 0.5;
   diet['Milk'].ub = 1.0;
   
   /* solve and print the optimal solution */
   solve with lp/logfreq=1; /* print each iteration to log */
   print diet;
The optimal solution and the optimal objective value are displayed in Output 6.1.1.
Output 6.1.1: Optimal Solution to the Diet Problem
| Problem Summary | |
|---|---|
| Objective Sense | Minimization | 
| Objective Function | f | 
| Objective Type | Linear | 
| Number of Variables | 6 | 
| Bounded Above | 0 | 
| Bounded Below | 5 | 
| Bounded Below and Above | 1 | 
| Free | 0 | 
| Fixed | 0 | 
| Number of Constraints | 4 | 
| Linear LE (<=) | 1 | 
| Linear EQ (=) | 0 | 
| Linear GE (>=) | 3 | 
| Linear Range | 0 | 
| Constraint Coefficients | 23 | 
| Performance Information | |
|---|---|
| Execution Mode | On Client | 
| Number of Threads | 1 | 
| Solution Summary | |
|---|---|
| Solver | LP | 
| Algorithm | Dual Simplex | 
| Objective Function | f | 
| Solution Status | Optimal | 
| Objective Value | 12.081337881 | 
| Iterations | 7 | 
| Primal Infeasibility | 8.881784E-16 | 
| Dual Infeasibility | 0 | 
| Bound Infeasibility | 0 | 
| [1] | diet | 
|---|---|
| Bread | 0.000000 | 
| Cheese | 0.449499 | 
| Fish | 0.500000 | 
| Milk | 0.053599 | 
| Potato | 1.865168 | 
| Yogurt | 0.000000 |