This example shows how to use PROC LP to solve a linear goal-programming problem. PROC LP has the ability to solve a series of linear programs, each with a new objective function. These objective functions are ordered by priority. The first step is to solve a linear program with the highest priority objective function constrained only by the formal constraints in the model. Then, the problem with the next highest priority objective function is solved, constrained by the formal constraints in the model and by the value that the highest priority objective function realized. That is, the second problem optimizes the second highest priority objective function among the alternate optimal solutions to the first optimization problem. The process continues until a linear program is solved for each of the objectives.
This technique is useful for differentiating among alternate optimal solutions to a linear program. It also fits into the formal paradigm presented in goal programming. In goal programming, the objective functions typically take on the role of driving a linear function of the structural variables to meet a target level as closely as possible. The details of this can be found in many books on the subject, including Ignizio (1976).
Consider the following problem taken from Ignizio (1976). A small paint company manufactures two types of paint, latex and enamel. In production, the company uses 10 hours of labor to produce 100 gallons of latex and 15 hours of labor to produce 100 gallons of enamel. Without hiring outside help or requiring overtime, the company has 40 hours of labor available each week. Furthermore, each paint generates a profit at the rate of $1.00 per gallon. The company has the following objectives listed in decreasing priority:
avoid the use of overtime
achieve a weekly profit of $1000
produce at least 700 gallons of enamel paint each week
The program to solve this problem follows.
data object; input _row_ $ latex enamel n1 n2 n3 p1 p2 p3 _type_ $ _rhs_; datalines; overtime . . . . . 1 . . min 1 profit . . . 1 . . . . min 2 enamel . . . . 1 . . . min 3 overtime 10 15 1 . . -1 . . eq 40 profit 100 100 . 1 . . -1 . eq 1000 enamel . 1 . . 1 . . -1 eq 7 ;
proc lp data=object goalprogram; run;
The data set called OBJECT
contains the model. Its first three observations are the objective rows, and the next three observations are the constraints.
The values in the right-hand-side variable _RHS_
in the objective rows give the priority of the objectives. The objective in the first observation with _ROW_
='OVERTIME' has the highest priority, the objective named PROFIT has the next highest, and the objective named ENAMEL has
the lowest. Note that the value of the right-hand-side variable determines the priority, not the order, in the data set.
Because this example is set in the formal goal-programming scheme, the model has structural variables representing negative
(n1, n2
, and n3
) and positive (p1, p2
, and p3
) deviations from target levels. For example, n1+p1
is the deviation from the objective of avoiding the use of overtime and underusing the normal work time, namely using exactly
40 work hours. The other objectives are handled similarly.
Notice that the PROC LP statement includes the GOALPROGRAM option. Without this option, the procedure would solve three separate problems: one for each of the three objective functions.
In that case, however, the procedure would not constrain the second and third programs using the results of the preceding
programs; also, the values 1, 2, and 3 for _RHS_
in the objective rows would have no effect.
Output 5.7.1 shows the solution of the goal program, apparently as three linear program outputs. However, examination of the constraint summaries in the second and third problems shows that the constraints labeled by the objectives OVERTIME and PROFIT have type FIXEDOBJ. This indicates that these objective rows have become constraints in the subsequent problems.
Output 5.7.1: Goal Programming
Problem Summary | |
---|---|
Objective Function | Min overtime |
Rhs Variable | _rhs_ |
Type Variable | _type_ |
Problem Density (%) | 45.83 |
Variables | Number |
Non-negative | 8 |
Total | 8 |
Constraints | Number |
EQ | 3 |
Objective | 3 |
Total | 6 |
Solution Summary | |
---|---|
Terminated Successfully |
|
Objective Value | 0 |
Phase 1 Iterations | 2 |
Phase 2 Iterations | 0 |
Phase 3 Iterations | 0 |
Integer Iterations | 0 |
Integer Solutions | 0 |
Initial Basic Feasible Variables | 7 |
Time Used (seconds) | 0 |
Number of Inversions | 2 |
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 | latex | ALTER | NON-NEG | 0 | 0 | 0 |
2 | enamel | ALTER | NON-NEG | 0 | 0 | 0 |
3 | n1 | BASIC | NON-NEG | 0 | 40 | 0 |
4 | n2 | BASIC | NON-NEG | 0 | 1000 | 0 |
5 | n3 | BASIC | NON-NEG | 0 | 7 | 0 |
6 | p1 | NON-NEG | 1 | 0 | 1 | |
7 | p2 | ALTER | NON-NEG | 0 | 0 | 0 |
8 | p3 | ALTER | NON-NEG | 0 | 0 | 0 |
Constraint Summary | ||||||
---|---|---|---|---|---|---|
Row | Constraint Name | Type | S/S Col | Rhs | Activity | Dual Activity |
1 | overtime | OBJECTVE | . | 0 | 0 | . |
2 | profit | FREE_OBJ | . | 0 | 1000 | . |
3 | enamel | FREE_OBJ | . | 0 | 7 | . |
4 | overtime | EQ | . | 40 | 40 | 0 |
5 | profit | EQ | . | 1000 | 1000 | 0 |
6 | enamel | EQ | . | 7 | 7 | 0 |
Problem Summary | |
---|---|
Objective Function | Min profit |
Rhs Variable | _rhs_ |
Type Variable | _type_ |
Problem Density (%) | 45.83 |
Variables | Number |
Non-negative | 8 |
Total | 8 |
Constraints | Number |
EQ | 3 |
Objective | 3 |
Total | 6 |
Solution Summary | |
---|---|
Terminated Successfully |
|
Objective Value | 600 |
Phase 1 Iterations | 0 |
Phase 2 Iterations | 3 |
Phase 3 Iterations | 0 |
Integer Iterations | 0 |
Integer Solutions | 0 |
Initial Basic Feasible Variables | 7 |
Time Used (seconds) | 0 |
Number of Inversions | 5 |
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 | latex | BASIC | NON-NEG | 0 | 4 | 0 |
2 | enamel | NON-NEG | 0 | 0 | 50 | |
3 | n1 | NON-NEG | 0 | 0 | 10 | |
4 | n2 | BASIC | NON-NEG | 1 | 600 | 0 |
5 | n3 | BASIC | NON-NEG | 0 | 7 | 0 |
6 | p1 | DEGEN | NON-NEG | 0 | 0 | 0 |
7 | p2 | NON-NEG | 0 | 0 | 1 | |
8 | p3 | ALTER | NON-NEG | 0 | 0 | 0 |
Constraint Summary | ||||||
---|---|---|---|---|---|---|
Row | Constraint Name | Type | S/S Col | Rhs | Activity | Dual Activity |
1 | overtime | FIXEDOBJ | . | 0 | 0 | . |
2 | profit | OBJECTVE | . | 0 | 600 | . |
3 | enamel | FREE_OBJ | . | 0 | 7 | . |
4 | overtime | EQ | . | 40 | 40 | -10 |
5 | profit | EQ | . | 1000 | 1000 | 1 |
6 | enamel | EQ | . | 7 | 7 | 0 |
Problem Summary | |
---|---|
Objective Function | Min enamel |
Rhs Variable | _rhs_ |
Type Variable | _type_ |
Problem Density (%) | 45.83 |
Variables | Number |
Non-negative | 8 |
Total | 8 |
Constraints | Number |
EQ | 3 |
Objective | 3 |
Total | 6 |
Solution Summary | |
---|---|
Terminated Successfully |
|
Objective Value | 7 |
Phase 1 Iterations | 0 |
Phase 2 Iterations | 1 |
Phase 3 Iterations | 0 |
Integer Iterations | 0 |
Integer Solutions | 0 |
Initial Basic Feasible Variables | 7 |
Time Used (seconds) | 0 |
Number of Inversions | 8 |
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 | latex | BASIC | NON-NEG | 0 | 4 | 0 |
2 | enamel | DEGEN | NON-NEG | 0 | 0 | 0 |
3 | n1 | NON-NEG | 0 | 0 | 0.2 | |
4 | n2 | BASIC | NON-NEG | 0 | 600 | 0 |
5 | n3 | BASIC | NON-NEG | 1 | 7 | 0 |
6 | p1 | DEGEN | NON-NEG | 0 | 0 | 0 |
7 | p2 | NON-NEG | 0 | 0 | 0.02 | |
8 | p3 | NON-NEG | 0 | 0 | 1 |
Constraint Summary | ||||||
---|---|---|---|---|---|---|
Row | Constraint Name | Type | S/S Col | Rhs | Activity | Dual Activity |
1 | overtime | FIXEDOBJ | . | 0 | 0 | . |
2 | profit | FIXEDOBJ | . | 0 | 600 | . |
3 | enamel | OBJECTVE | . | 0 | 7 | . |
4 | overtime | EQ | . | 40 | 40 | -0.2 |
5 | profit | EQ | . | 1000 | 1000 | 0.02 |
6 | enamel | EQ | . | 7 | 7 | 1 |
The solution to the last linear program shows a value of 4 for the variable LATEX
and a value of 0 for the variable ENAMEL
. This tells you that the solution to the linear goal program is to produce 400 gallons of latex and no enamel paint.
The values of the objective functions in the three linear programs tell you whether you can achieve the three objectives. The activities of the constraints labeled OVERTIME, PROFIT, and ENAMEL tell you values of the three linear program objectives. Because the first linear programming objective OVERTIME is 0, the highest priority objective, which is to avoid using additional labor, is accomplished. However, because the second and third objectives are nonzero, the second and third priority objectives are not satisfied completely. The PROFIT objective is 600. Because the PROFIT objective is to minimize the negative deviation from the profit constraint, this means that a profit of only 400 = 1000 600 is realized. Similarly, the ENAMEL objective is 7, indicating that there is a negative deviation from the ENAMEL target of 7 units.