The INTPOINT Procedure |
The following code shows how to save a specific problem's data in data sets and solve the model with PROC INTPOINT.
title 'Production Planning/Inventory/Distribution'; title2 'Minimum Cost Flow problem'; title3; data node0; input _node_ $ _supdem_ ; datalines; fact1_1 1000 fact2_1 850 fact1_2 1000 fact2_2 1500 shop1_1 -900 shop2_1 -900 shop1_2 -900 shop2_2 -1450 ; data arc0; input _tail_ $ _head_ $ _cost_ _capac_ _lo_ diagonal factory key_id $10. mth_made $ _name_&$17. ; datalines; fact1_1 f1_mar_1 127.9 500 50 19 1 production March prod f1 19 mar fact1_1 f1_apr_1 78.6 600 50 19 1 production April prod f1 19 apl fact1_1 f1_may_1 95.1 400 50 19 1 production May . f1_mar_1 f1_apr_1 15 50 . 19 1 storage March . f1_apr_1 f1_may_1 12 50 . 19 1 storage April . f1_apr_1 f1_mar_1 28 20 . 19 1 backorder April back f1 19 apl f1_may_1 f1_apr_1 28 20 . 19 1 backorder May back f1 19 may f1_mar_1 f2_mar_1 11 . . 19 . f1_to_2 March . f1_apr_1 f2_apr_1 11 . . 19 . f1_to_2 April . f1_may_1 f2_may_1 16 . . 19 . f1_to_2 May . f1_mar_1 shop1_1 -327.65 250 . 19 1 sales March . f1_apr_1 shop1_1 -300 250 . 19 1 sales April . f1_may_1 shop1_1 -285 250 . 19 1 sales May . f1_mar_1 shop2_1 -362.74 250 . 19 1 sales March . f1_apr_1 shop2_1 -300 250 . 19 1 sales April . f1_may_1 shop2_1 -245 250 . 19 1 sales May . fact2_1 f2_mar_1 88.0 450 35 19 2 production March prod f2 19 mar fact2_1 f2_apr_1 62.4 480 35 19 2 production April prod f2 19 apl fact2_1 f2_may_1 133.8 250 35 19 2 production May . f2_mar_1 f2_apr_1 18 30 . 19 2 storage March . f2_apr_1 f2_may_1 20 30 . 19 2 storage April . f2_apr_1 f2_mar_1 17 15 . 19 2 backorder April back f2 19 apl f2_may_1 f2_apr_1 25 15 . 19 2 backorder May back f2 19 may f2_mar_1 f1_mar_1 10 40 . 19 . f2_to_1 March . f2_apr_1 f1_apr_1 11 40 . 19 . f2_to_1 April . f2_may_1 f1_may_1 13 40 . 19 . f2_to_1 May . f2_mar_1 shop1_1 -297.4 250 . 19 2 sales March . f2_apr_1 shop1_1 -290 250 . 19 2 sales April . f2_may_1 shop1_1 -292 250 . 19 2 sales May . f2_mar_1 shop2_1 -272.7 250 . 19 2 sales March . f2_apr_1 shop2_1 -312 250 . 19 2 sales April . f2_may_1 shop2_1 -299 250 . 19 2 sales May . fact1_2 f1_mar_2 217.9 400 40 25 1 production March prod f1 25 mar fact1_2 f1_apr_2 174.5 550 50 25 1 production April prod f1 25 apl fact1_2 f1_may_2 133.3 350 40 25 1 production May . f1_mar_2 f1_apr_2 20 40 . 25 1 storage March . f1_apr_2 f1_may_2 18 40 . 25 1 storage April . f1_apr_2 f1_mar_2 32 30 . 25 1 backorder April back f1 25 apl f1_may_2 f1_apr_2 41 15 . 25 1 backorder May back f1 25 may f1_mar_2 f2_mar_2 23 . . 25 . f1_to_2 March . f1_apr_2 f2_apr_2 23 . . 25 . f1_to_2 April . f1_may_2 f2_may_2 26 . . 25 . f1_to_2 May . f1_mar_2 shop1_2 -559.76 . . 25 1 sales March . f1_apr_2 shop1_2 -524.28 . . 25 1 sales April . f1_may_2 shop1_2 -475.02 . . 25 1 sales May . f1_mar_2 shop2_2 -623.89 . . 25 1 sales March . f1_apr_2 shop2_2 -549.68 . . 25 1 sales April . f1_may_2 shop2_2 -460.00 . . 25 1 sales May . fact2_2 f2_mar_2 182.0 650 35 25 2 production March prod f2 25 mar fact2_2 f2_apr_2 196.7 680 35 25 2 production April prod f2 25 apl fact2_2 f2_may_2 201.4 550 35 25 2 production May . f2_mar_2 f2_apr_2 28 50 . 25 2 storage March . f2_apr_2 f2_may_2 38 50 . 25 2 storage April . f2_apr_2 f2_mar_2 31 15 . 25 2 backorder April back f2 25 apl f2_may_2 f2_apr_2 54 15 . 25 2 backorder May back f2 25 may f2_mar_2 f1_mar_2 20 25 . 25 . f2_to_1 March . f2_apr_2 f1_apr_2 21 25 . 25 . f2_to_1 April . f2_may_2 f1_may_2 43 25 . 25 . f2_to_1 May . f2_mar_2 shop1_2 -567.83 500 . 25 2 sales March . f2_apr_2 shop1_2 -542.19 500 . 25 2 sales April . f2_may_2 shop1_2 -461.56 500 . 25 2 sales May . f2_mar_2 shop2_2 -542.83 500 . 25 2 sales March . f2_apr_2 shop2_2 -559.19 500 . 25 2 sales April . f2_may_2 shop2_2 -489.06 500 . 25 2 sales May . ; proc intpoint bytes=1000000 printlevel2=2 nodedata=node0 arcdata=arc0 conout=arc1; run;
proc print data=arc1; var _tail_ _head_ _cost_ _capac_ _lo_ _flow_ _fcost_ diagonal factory key_id mth_made; sum _fcost_; run;
The following notes appear on the SAS log:
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: The following messages relate to the equivalent Linear Programming problem solved by the Interior Point algorithm. NOTE: Number of <= constraints= 0 . NOTE: Number of == constraints= 21 . NOTE: Number of >= constraints= 0 . NOTE: Number of constraint coefficients= 136 . NOTE: Number of variables= 68 . NOTE: After preprocessing, number of <= constraints= 0. 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 elimiated 9 constraint coefficients from the problem. NOTE: 0 columns, 0 rows and 0 coefficients were added to the problem to handle unrestricted variables, variables that are split, and constraint slack or surplus variables. NOTE: There are 48 nonzero elements in A * A transpose. NOTE: Of the 20 rows and columns, 11 are sparse. NOTE: There are 40 nonzero superdiagonal elements in the sparse rows of the factored A * A transpose. This includes fill-in. NOTE: There are 49 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 169009903 0.835362 52835 25664 38005 1 36984291 17566249 0.914108 1649.363089 801.164462 0 2 1982553 866890 0.413012 0 1.461734E-12 0 3 542347 234381 0.153440 0 0 0 4 129900 52560 0.038044 0 0 0 5 25835 18168 0.013343 0 0 0 6 8923.214994 2976.020480 0.002203 0 0 0 7 928.231932 624.792307 0.000463 0 0 0 8 218.771392 74.386900 0.000055131 0 0 0 9 11.639195 2.197862 0.000001629 0 0 0 10 0.089160 0.000399 2.958631E-10 0 0 0 NOTE: The Primal-Dual Predictor-Corrector Interior Point algorithm performed 10 iterations. NOTE: Objective = -1281110.35. NOTE: The data set WORK.ARC1 has 64 observations and 14 variables. NOTE: There were 64 observations read from the data set WORK.ARC0. NOTE: There were 8 observations read from the data set WORK.NODE0.
The solution is given in the CONOUT=arc1 data sets. In the CONOUT= data set, shown in Output 2.1.1, the variables diagonal, factory, key_id, and mth_made form an implicit ID list. The diagonal variable has one of two values, 19 or 25. factory also has one of two values, 1 or 2, to denote the factory where either production or storage occurs, from where TVs are either sold to shops or used to satisfy backorders. production, storage, sales, and backorder are values of the key_id variable.
Other values of this variable, f1_to_2 and f2_to_1, are used when flow through arcs represents the transportation of TVs between factories. The mth_made variable has values March, April, and May, the months when TVs that are modeled as flow through an arc were made (assuming that no televisions are stored for more than one month and none manufactured in May are used to fill March backorders).
These ID variables can be used after the PROC INTPOINT run to produce reports and perform analysis on particular parts of the company's operation. For example, reports can be generated for production numbers for each factory; optimal sales figures for each shop; and how many TVs should be stored, used to fill backorders, sent to the other factory, or any combination of these, for TVs with a particular screen, those produced in a particular month, or both.
Output 2.1.1: CONOUT=ARC1
Copyright © 2008 by SAS Institute Inc., Cary, NC, USA. All rights reserved.