Select Your Region
Americas
Europe
Middle East & Africa
Asia Pacific
/*****************************************************************************/ /* S A S S A M P L E L I B R A R Y */ /* */ /* NAME: int8 */ /* TITLE: Migration to OPTMODEL: Production, Inventory, Distribution (int8)*/ /* PRODUCT: OR */ /* SYSTEM: ALL */ /* KEYS: OR */ /* PROCS: OPTMODEL */ /* DATA: */ /* */ /* SUPPORT: UPDATE: */ /* REF: */ /* MISC: Example 8 from the INTPOINT chapter of Mathematical */ /* Programming Legacy Procedures. */ /* */ /*****************************************************************************/ 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 optmodel; set <str> NODES; num _supdem_ {NODES} init 0; read data node0 into NODES=[_node_] _supdem_; set <str,str> ARCS; num _lo_ {ARCS} init 0; num _capac_ {ARCS} init .; num _cost_ {ARCS}; num diagonal {ARCS}; num factory {ARCS}; str key_id {ARCS}; str mth_made {ARCS}; str _name_ {ARCS}; read data arc0 nomiss into ARCS=[_tail_ _head_] _lo_ _capac_ _cost_ diagonal factory key_id mth_made _name_; NODES = NODES union (union {<i,j> in ARCS} {i,j}); var Flow {<i,j> in ARCS} >= _lo_[i,j]; for {<i,j> in ARCS: _capac_[i,j] ne .} Flow[i,j].ub = _capac_[i,j]; min obj = sum {<i,j> in ARCS} _cost_[i,j] * Flow[i,j]; con balance {i in NODES}: sum {<(i),j> in ARCS} Flow[i,j] - sum {<j,(i)> in ARCS} Flow[j,i] = _supdem_[i]; num infinity = min {r in {}} r; num excess = sum {i in NODES} _supdem_[i]; if (excess > 0) then do; /* change equality constraint to le constraint */ for {i in NODES: _supdem_[i] > 0} balance[i].lb = -infinity; end; else if (excess < 0) then do; /* change equality constraint to ge constraint */ for {i in NODES: _supdem_[i] < 0} balance[i].ub = infinity; end; solve; num _supply_ {<i,j> in ARCS} = (if _supdem_[i] ne 0 then _supdem_[i] else .); num _demand_ {<i,j> in ARCS} = (if _supdem_[j] ne 0 then -_supdem_[j] else .); num _fcost_ {<i,j> in ARCS} = _cost_[i,j] * Flow[i,j].sol; create data arc1 from [_tail_ _head_] _cost_ _capac_ _lo_ _name_ _supply_ _demand_ _flow_=Flow _fcost_ diagonal factory key_id mth_made; quit; proc print data=arc1 width=min; var _tail_ _head_ _cost_ _capac_ _lo_ _flow_ _fcost_ diagonal factory key_id mth_made; sum _fcost_; run;