The INTPOINT Procedure

Example 2.3: Adding Side Constraints

The manufacturer of Gizmo chips, which are parts needed to make televisions, can supply only 2,600 chips to factory 1 and 3,750 chips to factory 2 in time for production in each of the months of March and April. However, Gizmo chips will not be in short supply in May. Three chips are required to make each 19-inch TV while the 25-inch TVs require four chips each. To limit the production of televisions produced at factory 1 in March so that the TVs have the correct number of chips, a side constraint called FACT1 MAR GIZMO is used. The form of this constraint is

  
    3 * prod f1 19 mar   +   4 * prod f1 25 mar   <=   2600
 

prod f1 19 mar is the name of the arc directed from the node fact1_1 toward node f1_mar_1 and, in the previous constraint, designates the flow assigned to this arc. The ARCDATA= and CONOUT= data sets have arc names in a variable called _name_.

The other side constraints (shown below) are called FACT2 MAR GIZMO, FACT1 APL GIZMO, and FACT2 APL GIZMO.

  
    3 * prod f2 19 mar   +   4 * prod f2 25 mar   <=   3750 
    3 * prod f1 19 apl   +   4 * prod f1 25 apl   <=   2600 
    3 * prod f2 19 apl   +   4 * prod f2 25 apl   <=   3750
 

To maintain customer goodwill, the total number of backorders is not to exceed 50 sets. The side constraint TOTAL BACKORDER that models this restriction is

  
    back f1 19 apl  +  back f1 25 apl  + 
    back f2 19 apl  +  back f2 25 apl  + 
    back f1 19 may  +  back f1 25 may  + 
    back f2 19 may  +  back f2 25 may   <=   50
 

The sparse CONDATA= data set format is used. All side constraints are of less than or equal type. Because this is the default type value for the DEFCONTYPE= option, type information is not necessary in the following CONDATA=con3. Also, DEFCONTYPE= <= does not have to be specified in the PROC INTPOINT statement that follows. Notice that the _column_ variable value CHIP/BO LIMIT indicates that an observation of the con3 data set contains rhs information. Therefore, specify RHSOBS='CHIP/BO LIMIT'.

  
    title2 'Adding Side Constraints'; 
    data con3; 
       input _column_ &$14. _row_ &$15. _coef_ ; 
       datalines; 
    prod f1 19 mar  FACT1 MAR GIZMO  3 
    prod f1 25 mar  FACT1 MAR GIZMO  4 
    CHIP/BO LIMIT   FACT1 MAR GIZMO  2600 
    prod f2 19 mar  FACT2 MAR GIZMO  3 
    prod f2 25 mar  FACT2 MAR GIZMO  4 
    CHIP/BO LIMIT   FACT2 MAR GIZMO  3750 
    prod f1 19 apl  FACT1 APL GIZMO  3 
    prod f1 25 apl  FACT1 APL GIZMO  4 
    CHIP/BO LIMIT   FACT1 APL GIZMO  2600 
    prod f2 19 apl  FACT2 APL GIZMO  3 
    prod f2 25 apl  FACT2 APL GIZMO  4 
    CHIP/BO LIMIT   FACT2 APL GIZMO  3750 
    back f1 19 apl  TOTAL BACKORDER  1 
    back f1 25 apl  TOTAL BACKORDER  1 
    back f2 19 apl  TOTAL BACKORDER  1 
    back f2 25 apl  TOTAL BACKORDER  1 
    back f1 19 may  TOTAL BACKORDER  1 
    back f1 25 may  TOTAL BACKORDER  1 
    back f2 19 may  TOTAL BACKORDER  1 
    back f2 25 may  TOTAL BACKORDER  1 
    CHIP/BO LIMIT   TOTAL BACKORDER  50 
    ;
 

The four pairs of data sets that follow can be used as ARCDATA= and NODEDATA= data sets in the following PROC INTPOINT run. The set used depends on which cost information the arcs are to have.

  
    ARCDATA=arc0    NODEDATA=node0 
    ARCDATA=arc1    NODEDATA=node0 
    ARCDATA=arc2    NODEDATA=node0 
    ARCDATA=arc3    NODEDATA=node0
 

arc0, node0, and arc1 were created in Example 2.1. The first two data sets are the original input data sets.

In the previous example, arc2 was created by modifying arc1 to reflect different arc costs. arc2 and node0 can also be used as the ARCDATA= and NODEDATA= data sets in a PROC INTPOINT run.

If you are going to continue optimization using the changed arc costs, it is probably best to use arc3 and node0 as the ARCDATA= and NODEDATA= data sets.

PROC INTPOINT is used to find the changed cost network solution that obeys the chip limit and backorder side constraints. An explicit ID list has also been specified so that the variables oldcost, oldfc, and oldflow do not appear in the subsequent output data sets:

  
    proc intpoint 
       bytes=1000000 
       printlevel2=2 
       nodedata=node0 arcdata=arc3 
       condata=con3 sparsecondata rhsobs='CHIP/BO LIMIT' 
       conout=arc4; 
       id diagonal factory key_id mth_made; 
       run;
 

  
    proc print data=arc4; 
       var _tail_ _head_ _cost_ _capac_ _lo_ _flow_ _fcost_; 
           /* to get this variable order */ 
       sum _fcost_; 
       run;
 

The following messages appear on the SAS log:

  
    NOTE: The following variables in ARCDATA do not belong to any 
          SAS variable list. These will be ignored. 
          _FLOW_ 
          _FCOST_ 
          oldcost 
          oldfc 
          oldflow 
    NOTE: Number of nodes= 20 . 
    NOTE: Number of supply nodes= 4 . 
    NOTE: Number of demand nodes= 4 . 
    NOTE: Total supply= 4350 , total demand= 4150 . 
    NOTE: Number of arcs= 64 . 
    NOTE: Number of <= side constraints= 5 . 
    NOTE: Number of == side constraints= 0 . 
    NOTE: Number of >= side constraints= 0 . 
    NOTE: Number of side constraint coefficients= 16 . 
    NOTE: The following messages relate to the equivalent 
          Linear Programming problem solved by the Interior 
          Point algorithm. 
    NOTE: Number of <= constraints= 5 . 
    NOTE: Number of == constraints= 21 . 
    NOTE: Number of >= constraints= 0 . 
    NOTE: Number of constraint coefficients= 152 . 
    NOTE: Number of variables= 68 . 
    NOTE: After preprocessing, number of <= constraints= 5. 
    NOTE: After preprocessing, number of == constraints= 20. 
    NOTE: After preprocessing, number of >= constraints= 0. 
    NOTE: The preprocessor eliminated 1 constraints from the 
          problem. 
    NOTE: The preprocessor eliminated 9 constraint coefficients 
          from the problem. 
    NOTE: 5 columns, 0 rows and 5 coefficients were added to 
          the problem to handle unrestricted variables, 
          variables that are split, and constraint slack or 
          surplus variables. 
    NOTE: There are 74 nonzero elements in A * A transpose. 
    NOTE: Of the 25 rows and columns, 14 are sparse. 
    NOTE: There are 74 nonzero superdiagonal elements in the 
          sparse rows of the factored A * A transpose. This 
          includes fill-in. 
    NOTE: There are 65 operations of the form 
          u[i,j]=u[i,j]-u[q,j]*u[q,i]/u[q,q] to factorize the 
          sparse rows of A * A transpose. 
 Iter Complem_aff Complem-ity  Duality_gap Tot_infeasb  Tot_infeasc Tot_infeasd 
    0   -1.000000   176663849     0.834344       52835        39643       49140 
    1    51289701    21890177     0.912033 2958.813395  2220.091192 2621.647223 
    2     4297808     1359558     0.517260           0  7.06244E-11   42.614836 
    3      341918      246210     0.159762           0            0    7.723054 
    4      124303       68295     0.049237           0            0    1.115512 
    5       46970       29876     0.021786           0            0    0.482224 
    6 9976.439552 6294.587840     0.004647           0            0    0.094764 
    7 3266.423958 1984.437170     0.001468           0            0    0.022740 
    8  472.139836  257.075141     0.000190           0            0    0.003062 
    9   24.953361    6.458585  0.000004781           0            0    0.000114 
   10    0.007991    0.000361 2.671196E-10           0            0           0 
    NOTE: The Primal-Dual Predictor-Corrector Interior Point algorithm 
          performed 10 iterations. 
    NOTE: Objective = -1282708.625. 
    NOTE: The data set WORK.ARC4 has 64 observations and 14 
          variables. 
    NOTE: There were 64 observations read from the data set 
          WORK.ARC3. 
    NOTE: There were 8 observations read from the data set 
          WORK.NODE0. 
    NOTE: There were 21 observations read from the data set 
          WORK.CON3.
 

Output 2.3.1: CONOUT=ARC4
Adding Side Constraints

Obs _tail_ _head_ _cost_ _capac_ _lo_ _FLOW_ _FCOST_
1 fact1_1 f1_apr_1 78.60 600 50 533.333 41920.00
2 f1_mar_1 f1_apr_1 15.00 50 0 0.000 0.00
3 f1_may_1 f1_apr_1 33.60 20 0 0.000 0.00
4 f2_apr_1 f1_apr_1 11.00 40 0 0.000 0.00
5 fact1_2 f1_apr_2 174.50 550 50 250.000 43625.00
6 f1_mar_2 f1_apr_2 20.00 40 0 0.000 0.00
7 f1_may_2 f1_apr_2 49.20 15 0 0.000 0.00
8 f2_apr_2 f1_apr_2 21.00 25 0 0.000 0.00
9 fact1_1 f1_mar_1 127.90 500 50 333.333 42633.33
10 f1_apr_1 f1_mar_1 33.60 20 0 20.000 672.00
11 f2_mar_1 f1_mar_1 10.00 40 0 40.000 400.00
12 fact1_2 f1_mar_2 217.90 400 40 400.000 87160.00
13 f1_apr_2 f1_mar_2 38.40 30 0 30.000 1152.00
14 f2_mar_2 f1_mar_2 20.00 25 0 25.000 500.00
15 fact1_1 f1_may_1 90.10 400 50 128.333 11562.83
16 f1_apr_1 f1_may_1 12.00 50 0 0.000 0.00
17 f2_may_1 f1_may_1 13.00 40 0 0.000 0.00
18 fact1_2 f1_may_2 113.30 350 40 350.000 39655.00
19 f1_apr_2 f1_may_2 18.00 40 0 0.000 0.00
20 f2_may_2 f1_may_2 13.00 25 0 0.000 0.00
21 f1_apr_1 f2_apr_1 11.00 99999999 0 13.333 146.67
22 fact2_1 f2_apr_1 62.40 480 35 480.000 29952.00
23 f2_mar_1 f2_apr_1 18.00 30 0 0.000 0.00
24 f2_may_1 f2_apr_1 30.00 15 0 0.000 0.00
25 f1_apr_2 f2_apr_2 23.00 99999999 0 0.000 0.00
26 fact2_2 f2_apr_2 196.70 680 35 577.500 113594.25
27 f2_mar_2 f2_apr_2 28.00 50 0 0.000 0.00
28 f2_may_2 f2_apr_2 64.80 15 0 0.000 0.00
29 f1_mar_1 f2_mar_1 11.00 99999999 0 0.000 0.00
30 fact2_1 f2_mar_1 88.00 450 35 290.000 25520.00
31 f2_apr_1 f2_mar_1 20.40 15 0 0.000 0.00
32 f1_mar_2 f2_mar_2 23.00 99999999 0 0.000 0.00
33 fact2_2 f2_mar_2 182.00 650 35 650.000 118300.00
34 f2_apr_2 f2_mar_2 37.20 15 0 0.000 0.00
35 f1_may_1 f2_may_1 16.00 99999999 0 115.000 1840.00
36 fact2_1 f2_may_1 128.80 250 35 35.000 4508.00
37 f2_apr_1 f2_may_1 20.00 30 0 0.000 0.00
38 f1_may_2 f2_may_2 26.00 99999999 0 350.000 9100.00
39 fact2_2 f2_may_2 181.40 550 35 122.500 22221.50
40 f2_apr_2 f2_may_2 38.00 50 0 0.000 0.00
41 f1_mar_1 shop1_1 -327.65 250 0 143.333 -46963.17
42 f1_apr_1 shop1_1 -300.00 250 0 250.000 -75000.00
43 f1_may_1 shop1_1 -285.00 250 0 13.333 -3800.00
44 f2_mar_1 shop1_1 -297.40 250 0 250.000 -74350.00
45 f2_apr_1 shop1_1 -290.00 250 0 243.333 -70566.67
46 f2_may_1 shop1_1 -292.00 250 0 0.000 0.00
47 f1_mar_2 shop1_2 -559.76 99999999 0 0.000 0.00
48 f1_apr_2 shop1_2 -524.28 99999999 0 0.000 0.00
49 f1_may_2 shop1_2 -475.02 99999999 0 0.000 0.00
50 f2_mar_2 shop1_2 -567.83 500 0 500.000 -283915.00
51 f2_apr_2 shop1_2 -542.19 500 0 400.000 -216876.00
52 f2_may_2 shop1_2 -491.56 500 0 0.000 0.00
53 f1_mar_1 shop2_1 -362.74 250 0 250.000 -90685.00
54 f1_apr_1 shop2_1 -300.00 250 0 250.000 -75000.00
55 f1_may_1 shop2_1 -245.00 250 0 0.000 0.00
56 f2_mar_1 shop2_1 -272.70 250 0 0.000 0.00
57 f2_apr_1 shop2_1 -312.00 250 0 250.000 -78000.00
58 f2_may_1 shop2_1 -299.00 250 0 150.000 -44850.00
59 f1_mar_2 shop2_2 -623.89 99999999 0 455.000 -283869.95
60 f1_apr_2 shop2_2 -549.68 99999999 0 220.000 -120929.60
61 f1_may_2 shop2_2 -460.00 99999999 0 0.000 0.00
62 f2_mar_2 shop2_2 -542.83 500 0 125.000 -67853.75
63 f2_apr_2 shop2_2 -559.19 500 0 177.500 -99256.23
64 f2_may_2 shop2_2 -519.06 500 0 472.500 -245255.85
              -1282708.62




Previous Page | Next Page | Top of Page