The NETFLOW Procedure

How to Specify Data for Arc Multipliers

If you are familiar with using the NETFLOW procedure to solve pure network problems, then solving generalized network problems is fairly simple. You just need to provide the additional data for the arc multipliers. Arcs by default have a multiplier of 1.0, so you only need to provide arc multipliers that are not equal to 1.0. You can specify the arc multiplier data in either or both of the ARCDATA= and CONDATA= data sets. The procedure scans the SAS variables in the ARCDATA= data set, and if it finds a name _MULT_ (or a similar name with letters of different case), then it assumes that the SAS variable contains data for arc multipliers. CONDATA= is scanned for special type values that indicates data are arc multipliers.

The rest of this section describes the various ways in which you can specify data for the arc multipliers. The network in Figure 5.26 is used for illustration.

All Arc Multiplier Data in the ARCDATA= Data Set

You can specify all the arc multiplier data in the ARCDATA= data set. The following code creates the input SAS data sets:

 data nodes;
    input _node_ $ _sd_ ;
 datalines;
 N1  22
 N4 -30
 N5 -10
 ;
 
 data arcs;
    input _from_ $ _to_ $  _cost_ _mult_;
 datalines;
 N1 N2   2   4
 N1 N3  10 0.5
 N2 N4   0   1
 N2 N5   7   3
 N3 N2  12   2
 N3 N5  10   2
 N5 N4  55 0.9 
 ;
 

Let us first look at the data for this problem. There is a variable named _mult_ in the ARCDATA= data set, so PROC NETFLOW assumes it represents the arc multipliers. The SAS variable _sd_ represents the supdem value of a node. A positive or missing S value indicates supply, and a negative or missing D value indicates demand.

The optimal solution can be obtained from the CONOUT= data set. Note that you need to specify the CONOUT= data set even if the network has no side constraints; you cannot use the ARCOUT= data set.

You can use the following SAS code to run PROC NETFLOW:

    title1 'The NETFLOW Procedure';
    proc netflow 
       bytes    = 100000
       nodedata = nodes 
       arcdata  = arcs 
       conout   = solution;
    run;
 

The optimal solution is displayed in Output 5.27.

The NETFLOW Procedure

Obs _from_ _to_ _cost_ Arc capacity
or Nonarc upper
bound.
Arc (Nonarc)
lower
flow (value)
bound.
_mult_ Supply
of tail
node.
Demand
of head
node.
Arc flow or Nonarc
value.
Arc flow*cost,
Nonarc value*objfn
coef.
1 N1 N2 2 99999999 0 4.0 22 . 6.0000 12.000
2 N3 N2 12 99999999 0 2.0 . . 3.0000 36.000
3 N1 N3 10 99999999 0 0.5 22 . 16.0000 160.000
4 N2 N4 0 99999999 0 1.0 . 30 30.0000 0.000
5 N5 N4 55 99999999 0 0.9 . 30 -0.0000 -0.000
6 N2 N5 7 99999999 0 3.0 . 10 0.0000 0.000
7 N3 N5 10 99999999 0 2.0 . 10 5.0000 50.000


Figure 5.27: Output of the Example Problem

All Arc Multiplier Data in CONDATA= Data Set

Let us now solve the same problem, but with all the arc multipliers specified in the CONDATA= data set. The CONDATA= data set can have either a sparse format or a dense format. The following code illustrates the dense format representation:

 data arcs1b;
    input _from_ $ _to_ $  _cost_;
 datalines;
 N1 N2   2 
 N1 N3  10 
 N2 N4   0 
 N2 N5   7 
 N3 N2  12 
 N3 N5  10 
 N5 N4  55 
 ;
 
 data MUdense;
    input _type_ $ N1_N2 N1_N3 N2_N4 N2_N5 N3_N2 N3_N5 N5_N4;
 datalines;
 mult 4.0  0.5  1.0  0.3  2.0  2.0  0.9
 ;
 

You can use the following SAS code to obtain the solution:

  
    proc netflow 
       gennet 
       nodedata = nodes 
       arcdata  = arcs1b 
       condata  = MUdense 
       conout   = soln1b; 
    run;
 

Note that a new option, GENNET, has been specified in the call to PROC NETFLOW. This option is necessary when the network is generalized and there are no arc multiplier data in the ARCDATA= data set. If this option is not specified, then the procedure assumes that the network is pure (without arc multipliers) and sets up the excess supply node and the excess arcs.

The sparse format representation is as follows:

 data MUsparse;
    input _type_ $ _col_ $ _coef_;
 datalines;
 mult N1_N2 4.0 
 mult N1_N3 0.5 
 mult N2_N4 1.0 
 mult N2_N5 0.3
 mult N3_N2 2.0
 mult N3_N5 2.0
 mult N5_N4 0.9 
 ;
 


You can use the following SAS code to obtain the solution:

  
    proc netflow 
       gennet   sparsecondata 
       nodedata = nodes 
       arcdata  = arcs1b 
       condata  = MUsparse 
       conout   = soln1c; 
    run;
 

Note that you need to specify the SPARSECONDATA option in the call to PROC NETFLOW.

Arc Multiplier Data in Both ARCDATA= and CONDATA= Data Sets

You can also provide some multiplier data in the ARCDATA= data set, and the rest in the CONDATA= data set as follows:

  
    data arcs1c; 
       input _from_ $ _to_ $  _cost_ _mult_; 
    datalines; 
    N1 N2   2   4 
    N1 N3  10  .5 
    N2 N4   0   . 
    N2 N5   7   . 
    N3 N2  12   . 
    N3 N5  10   . 
    N5 N4  55   . 
    ; 
  
    data MUdense1; 
       input _type_ $ N2_N4 N2_N5 N3_N2 N3_N5 N5_N4; 
    datalines; 
    mult 1.0  0.3  2.0  2.0  0.9 
    ;
 
The procedure merges the data when all the input data sets have been read.

Specifying Arc Multiplier Data Using a List Statement

You can also specify the name of the multiplier variable in the list statement MULT, or MULTIPLIER. For example, if the name of the variable is lossrate, then use the following:
  
    proc netflow 
    ... 
    ; 
    mult lossrate; 
    run;
 
You may also use MULT, GAIN, or LOSS (or similar names with letters of different case) as a value of the TYPE list SAS variable.

Previous Page | Next Page | Top of Page