Introduction to Optimization |
It is desirable to keep data in separate tables, and then to automate model building and reporting. This example illustrates a problem that has elements of both a product mix problem and a blending problem. Suppose four kinds of ties are made: all silk, all polyester, a 50-50 polyester-cotton blend, and a 70-30 cotton-polyester blend.
The data include cost and supplies of raw material, selling price, minimum contract sales, maximum demand of the finished products, and the proportions of raw materials that go into each product. The objective is to find the product mix that maximizes profit.
The data are saved in three SAS data sets. The program that follows demonstrates one way for these data to be saved.
data material; format descpt $20.; input descpt $ cost supply; datalines; silk_material .21 25.8 polyester_material .6 22.0 cotton_material .9 13.6 ; data tie; format descpt $20.; input descpt $ price contract demand; datalines; all_silk 6.70 6.0 7.00 all_polyester 3.55 10.0 14.00 poly_cotton_blend 4.31 13.0 16.00 cotton_poly_blend 4.81 6.0 8.50 ; data manfg; format descpt $20.; input descpt $ silk poly cotton; datalines; all_silk 100 0 0 all_polyester 0 100 0 poly_cotton_blend 0 50 50 cotton_poly_blend 0 30 70 ;
The following program takes the raw data from the three data sets and builds a linear program model in the data set called model. Although it is designed for the three-resource, four-product problem described here, it can easily be extended to include more resources and products. The model-building DATA step remains essentially the same; all that changes are the dimensions of loops and arrays. Of course, the data tables must expand to accommodate the new data.
data model; array raw_mat {3} $ 20 ; array raw_comp {3} silk poly cotton; length _type_ $ 8 _col_ $ 20 _row_ $ 20 _coef_ 8 ; keep _type_ _col_ _row_ _coef_ ; /* define the objective, lower, and upper bound rows */ _row_='profit'; _type_='max'; output; _row_='lower'; _type_='lowerbd'; output; _row_='upper'; _type_='upperbd'; output; _type_=' '; /* the object and upper rows for the raw materials */ do i=1 to 3; set material; raw_mat[i]=descpt; _col_=descpt; _row_='profit'; _coef_=-cost; output; _row_='upper'; _coef_=supply; output; end; /* the object, upper, and lower rows for the products */ do i=1 to 4; set tie; _col_=descpt; _row_='profit'; _coef_=price; output; _row_='lower'; _coef_=contract; output; _row_='upper'; _coef_=demand; output; end; /* the coefficient matrix for manufacturing */ _type_='eq'; do i=1 to 4; /* loop for each raw material */ set manfg; do j=1 to 3; /* loop for each product */ _col_=descpt; /* % of material in product */ _row_ = raw_mat[j]; _coef_ = raw_comp[j]/100; output; _col_ = raw_mat[j]; _coef_ = -1; output; /* the right-hand side */ if i=1 then do; _col_='_RHS_'; _coef_=0; output; end; end; _type_=' '; end; stop; run;
The model is solved using PROC LP, which saves the solution in the PRIMALOUT data set named solution. PROC PRINT displays the solution, shown in Figure 3.6.
proc lp sparsedata primalout=solution; proc print ; id _var_; var _lbound_--_r_cost_; run;
_VAR_ | _LBOUND_ | _VALUE_ | _UBOUND_ | _PRICE_ | _R_COST_ |
---|---|---|---|---|---|
all_polyester | 10 | 11.800 | 14.0 | 3.55 | 0.000 |
all_silk | 6 | 7.000 | 7.0 | 6.70 | 6.490 |
cotton_material | 0 | 13.600 | 13.6 | -0.90 | 4.170 |
cotton_poly_blend | 6 | 8.500 | 8.5 | 4.81 | 0.196 |
polyester_material | 0 | 22.000 | 22.0 | -0.60 | 2.950 |
poly_cotton_blend | 13 | 15.300 | 16.0 | 4.31 | 0.000 |
silk_material | 0 | 7.000 | 25.8 | -0.21 | 0.000 |
PHASE_1_OBJECTIVE | 0 | 0.000 | 0.0 | 0.00 | 0.000 |
profit | 0 | 168.708 | 1.7977E308 | 0.00 | 0.000 |
The solution shows that 11.8 units of polyester ties, 7 units of silk ties, 8.5 units of the cotton-polyester blend, and 15.3 units of the polyester-cotton blend should be produced. It also shows the amounts of raw materials that go into this product mix to generate a total profit of 168.708.
Copyright © SAS Institute, Inc. All Rights Reserved.