Simple solution of a linear program is often not enough. A manager needs to evaluate how sensitive the solution is to changing assumptions. The LP procedure provides several tools that are useful for "what if," or sensitivity, analysis. One tool studies the effects of changes in the objective coefficients.
For example, in the oil blending problem, the cost of crude and the selling price of jet fuel can be highly variable. If you want to know the range over which each objective coefficient can vary without changing the variables in the basis, you can use the RANGEPRICE option in the PROC LP statement.
proc lp data=oil sparsedata rangeprice primalout=solution; run;
In addition to the Problem and Solution summaries, the LP procedure produces a Price Range Summary, shown in Output 5.3.1.
For each structural variable, the upper and lower ranges of the price (objective function coefficient) and the objective value are shown. The blocking variables, those variables that would enter the basis if the objective coefficient were perturbed further, are also given. For example, the output shows that if the cost of ARABIAN_LIGHT crude were to increase from 175 to 186.6 per unit (remember that you are maximizing profit so the ARABIAN_LIGHT objective coefficient would decrease from -175 to -186.6), then it would become optimal to use less of this crude for any fractional increase in its cost. Increasing the unit cost to 186.6 would drive its reduced cost to zero. Any additional increase would drive its reduced cost negative and would destroy the optimality conditions; thus, you would want to use less of it in your processing. The output shows that, at the point where the reduced cost is zero, you would only be realizing a profit of 268 = 1544 - (110 11.6) and that ARABIAN_LIGHT enters the basis, that is, leaves its upper bound. On the other hand, if the cost of ARABIAN_HEAVY were to decrease to 143.55, you would want to stop using the formulation of 110 units of ARABIAN_LIGHT and 80 units of BREGA and switch to a production scheme that included ARABIAN_HEAVY, in which case the profit would increase from the 1544 level.
Problem Summary | |
---|---|
Objective Function | Max profit |
Rhs Variable | _rhs_ |
Type Variable | _type_ |
Problem Density (%) | 45.00 |
Variables | Number |
Non-negative | 5 |
Upper Bounded | 3 |
Total | 8 |
Constraints | Number |
EQ | 5 |
Objective | 1 |
Total | 6 |
Solution Summary | |
---|---|
Terminated Successfully |
|
Objective Value | 1544 |
Phase 1 Iterations | 0 |
Phase 2 Iterations | 5 |
Phase 3 Iterations | 0 |
Integer Iterations | 0 |
Integer Solutions | 0 |
Initial Basic Feasible Variables | 5 |
Time Used (seconds) | 0 |
Number of Inversions | 3 |
Epsilon | 1E-8 |
Infinity | 1.797693E308 |
Maximum Phase 1 Iterations | 100 |
Maximum Phase 2 Iterations | 100 |
Maximum Phase 3 Iterations | 99999999 |
Maximum Integer Iterations | 100 |
Time Limit (seconds) | 120 |
Variable Summary | ||||||
---|---|---|---|---|---|---|
Col | Variable Name | Status | Type | Price | Activity | Reduced Cost |
1 | arabian_heavy | UPPERBD | -165 | 0 | -21.45 | |
2 | arabian_light | UPPBD | UPPERBD | -175 | 110 | 11.6 |
3 | brega | UPPBD | UPPERBD | -205 | 80 | 3.35 |
4 | heating_oil | BASIC | NON-NEG | 0 | 77.3 | 0 |
5 | jet_1 | BASIC | NON-NEG | 300 | 60.65 | 0 |
6 | jet_2 | BASIC | NON-NEG | 300 | 63.33 | 0 |
7 | naphtha_inter | BASIC | NON-NEG | 0 | 21.8 | 0 |
8 | naphtha_light | BASIC | NON-NEG | 0 | 7.45 | 0 |
Constraint Summary | ||||||
---|---|---|---|---|---|---|
Row | Constraint Name | Type | S/S Col | Rhs | Activity | Dual Activity |
1 | profit | OBJECTVE | . | 0 | 1544 | . |
2 | napha_l_conv | EQ | . | 0 | 0 | -60 |
3 | napha_i_conv | EQ | . | 0 | 0 | -90 |
4 | heating_oil_conv | EQ | . | 0 | 0 | -450 |
5 | recipe_1 | EQ | . | 0 | 0 | -300 |
6 | recipe_2 | EQ | . | 0 | 0 | -300 |
Price Range Analysis | |||||||
---|---|---|---|---|---|---|---|
Col | Variable Name | Minimum Phi | Maximum Phi | ||||
Price | Entering | Objective | Price | Entering | Objective | ||
1 | arabian_heavy | -INFINITY | . | 1544 | -143.55 | arabian_heavy | 1544 |
2 | arabian_light | -186.6 | arabian_light | 268 | INFINITY | . | INFINITY |
3 | brega | -208.35 | brega | 1276 | INFINITY | . | INFINITY |
4 | heating_oil | -7.790698 | brega | 941.77907 | 71.5 | arabian_heavy | 7070.95 |
5 | jet_1 | 290.19034 | brega | 949.04392 | 392.25806 | arabian_heavy | 7139.4516 |
6 | jet_2 | 290.50992 | brega | 942.99292 | 387.19512 | arabian_heavy | 7066.0671 |
7 | naphtha_inter | -24.81481 | brega | 1003.037 | 286 | arabian_heavy | 7778.8 |
8 | naphtha_light | -74.44444 | brega | 989.38889 | 715 | arabian_heavy | 6870.75 |
Note that in the PROC LP statement, the PRIMALOUT= SOLUTION option was given. This caused the procedure to save the optimal solution in a SAS data set named SOLUTION. This data set can be used to perform further analysis on the problem without having to restart the solution process. Example 5.4 shows how this is done. A display of the data follows in Output 5.3.2.
Obs | _OBJ_ID_ | _RHS_ID_ | _VAR_ | _TYPE_ | _STATUS_ | _LBOUND_ | _VALUE_ | _UBOUND_ | _PRICE_ | _R_COST_ |
---|---|---|---|---|---|---|---|---|---|---|
1 | profit | _rhs_ | arabian_heavy | UPPERBD | 0 | 0.00 | 165 | -165 | -21.45 | |
2 | profit | _rhs_ | arabian_light | UPPERBD | _UPPER_ | 0 | 110.00 | 110 | -175 | 11.60 |
3 | profit | _rhs_ | brega | UPPERBD | _UPPER_ | 0 | 80.00 | 80 | -205 | 3.35 |
4 | profit | _rhs_ | heating_oil | NON-NEG | _BASIC_ | 0 | 77.30 | 1.7977E308 | 0 | 0.00 |
5 | profit | _rhs_ | jet_1 | NON-NEG | _BASIC_ | 0 | 60.65 | 1.7977E308 | 300 | 0.00 |
6 | profit | _rhs_ | jet_2 | NON-NEG | _BASIC_ | 0 | 63.33 | 1.7977E308 | 300 | 0.00 |
7 | profit | _rhs_ | naphtha_inter | NON-NEG | _BASIC_ | 0 | 21.80 | 1.7977E308 | 0 | 0.00 |
8 | profit | _rhs_ | naphtha_light | NON-NEG | _BASIC_ | 0 | 7.45 | 1.7977E308 | 0 | 0.00 |
9 | profit | _rhs_ | PHASE_1_OBJECTIV | OBJECT | _DEGEN_ | 0 | 0.00 | 0 | 0 | 0.00 |
10 | profit | _rhs_ | profit | OBJECT | _BASIC_ | 0 | 1544.00 | 1.7977E308 | 0 | 0.00 |