1  REM ****  HP BASIC PROGRAM LIBRARY  ******************************
2  REM
3  REM       GNETFL: NETWORK FLOW DETERMINATION (MAX/MIN)
4  REM
5  REM       36529 REV A
6  REM
7  REM ****  CONTRIBUTED PROGRAM  ***********************************
9  REM  ****  CONVERSION DONE BY  * JOHN H. BARLOW * 
11  DIM F[200],T[200],C[200],U[200],B[200],X[200]
12  DIM P[100],L[100],Z[100]
13  REM --------------------------------------------------
14  LET M=100
15  REM -- N IS THE NUMBER OF ARCS
16  REM -- FOR ARC J
17  REM    F(J) IS THE 'FROM' NODE
18  REM    T(J) IS THE 'TO' NODE
19  REM    C(J) IS THE UNIT COST
20  REM    U(J) IS THE UPPER BOUND
21  REM    B(J) IS THE LOWER BOUND
22  REM    X(J) IS THE FLOW
23  REM -- FOR NODE I
24  REM    P(I) IS THE PRICE
25  REM    L(I) IS THE LABEL
26  REM   Z(I) = 1 IF NODE IS USED, ZERO OTHERWISE
27  REM --------------------------------------------------
28  REM -- SET Z VALUES TO ZERO (NODE NOT USED)
29  FOR I=1 TO 100
30  LET Z[I]=0
31  NEXT I
32  REM -- READ DATA
33  REM -- FORMAT IS --
34  REM   F(H),T(J),C(J),U(J),B(J)
35  REM (FROM, TO, COST, UPPER, LOWER )
36  REM -- LAST ENTRY IS '999'
37  N=0
38  PRINT "ARCS"
39  PRINT "----"
40  PRINT 
41  PRINT "FROM   TO   COST  UPPER  LOWER"
42  PRINT "----  ----  ----  -----  -----"
43  READ F9
44  IF F9>100 THEN 53
45  N=N+1
46  F[N]=F9
47  READ T[N],C[N],U[N],B[N]
48  PRINT F[N];T[N];C[N];U[N];B[N]
49  LET X[N]=0
50  LET Z[F[N]]=1
51  LET Z[T[N]]=1
52  GOTO 43
53  REM -- ALL ARCS INPUT
54  REM -- ZERO NODE PRICES
55  FOR I9=1 TO 100
56  P[I9]=0
57  NEXT I9
58  REM -- INITIALIZE LABELS
59  FOR I9=1 TO 100
60  L[I9]=0
61  NEXT I9
62  REM -- PROBLEM IS READY TO GO
63  PRINT 
64  PRINT "DO YOU WANT TO MAXIMIZE OR MINIMIZE";
65  DIM P$[15]
66  INPUT P$
67  IF P$[2,2]="I" THEN 71
68  FOR I=1 TO N
69  C[I]=-C[I]
70  NEXT I
71  REM -- SUBROUTINE TO DO ALGORITHM
72  FOR J=1 TO N
73  IF U[J] >= B[J] THEN 78
74  PRINT "***** ERROR FOR ARC FROM ";F[J];"TO";T[J]
75  PRINT "UPPER BOUND IS LESS THAN LOWER BOUND"
76  PRINT "  PROGRAM STOPPED"
77  STOP 
78  NEXT J
79  REM -- I9 IS INFINITY
80  I9=999999.
81  A1=0
82  FOR A8=1 TO N
83  N1=F[A8]
84  N2=T[A8]
85  C9=C[A8]+P[N1]-P[N2]
86  IF (X[A8]<B[A8]) OR (C9<0 AND X[A8]<U[A8]) THEN 91
87  IF (X[A8]>U[A8]) OR (C9>0 AND X[A8]>B[A8]) THEN 96
88  NEXT A8
89  REM -- NO OUT OF KILTER ARCS LEFT, FEASIBLE SOLUTION
90  GOTO 213
91  REM -- OUT OF KILTER ARC FOUND FROM T TO F
92  S1=T[A8]
93  S2=F[A8]
94  L9=+A8
95  GOTO 100
96  REM -- OUT OF KILTER ARC FOUND FROM F TO T
97  S1=F[A8]
98  S2=T[A8]
99  L9=-A8
100  REM -- SAVE LABELS IF LAST OPERATION WAS INCREASING PRICES ON ARC
101  IF A8=A1 AND L[S1] <> 0 THEN 106
102  FOR N5=1 TO M
103  L[N5]=0
104  NEXT N5
105  A1=A8
106  C1=C9
107  L[S1]=L9
108  REM -- LABEL
109  L9=0
110  FOR A9=1 TO N
111  N1=F[A9]
112  IF N1<0 THEN 127
113  N2=T[A9]
114  IF L[N1]=0 AND L[N2]=0 THEN 127
115  IF L[N1] <> 0 AND L[N2] <> 0 THEN 126
116  C9=C[A9]+P[N1]-P[N2]
117  IF L[N1]=0 THEN 121
118  IF (X[A9] >= U[A9]) OR (X[A9] >= B[A9] AND C9>0) THEN 126
119  L[N2]=A9
120  GOTO 123
121  IF (X[A9] <= B[A9]) OR (X[A9] <= U[A9] AND C9<0) THEN 126
122  L[N1]=-A9
123  L9=1
124  REM -- NODE LABELLED, TEST FOR BREAKTHRU
125  IF L[S2] <> 0 THEN 130
126  F[A9]=-N1
127  NEXT A9
128  REM -- GO BACK AND DO MORE LABELLING IF SOME NODE LABELLED
129  IF L9 <> 0 THEN 108
130  REM -- RESTORE POSITIVE SIGNS TO FIRST NODE LIST
131  FOR A9=1 TO N
132  IF F[A9] >= 0 THEN 134
133  F[A9]=-F[A9]
134  NEXT A9
135  REM -- IF NO LABELLING DONE ON LAST PASS, INCREASE PRICE
136  IF L9=0 THEN 178
137  REM -- BREAKTHRU, FIND THE INCREMENT
138  I5=I9
139  REM -- FOLLOW PATH BACK FROM SOURCE
140  N5=S1
141  A9=L[N5]
142  IF A9 >= 0 THEN 144
143  A9=-A9
144  IF L[N5]<0 THEN 154
145  N2=F[A9]
146  C9=C[A9]-P[N5]+P[N2]
147  IF C9>0 THEN 151
148  IF I5<(U[A9]-X[A9]) THEN 162
149  I5=U[A9]-X[A9]
150  GOTO 162
151  IF I5<B[A9]-X[A9] THEN 162
152  I5=B[A9]-X[A9]
153  GOTO 162
154  N2=T[A9]
155  C9=C[A9]+P[N5]-P[N2]
156  IF C9<0 THEN 160
157  IF I5<(X[A9]-B[A9]) THEN 162
158  I5=X[A9]-B[A9]
159  GOTO 162
160  IF I5<(X[A9]-U[A9]) THEN 162
161  I5=X[A9]-U[A9]
162  N5=N2
163  IF N5 <> S1 THEN 141
164  REM -- INCREMENT ARCS
165  A9=L[N5]
166  IF A9 >= 0 THEN 168
167  A9=-A9
168  IF L[N5]<0 THEN 172
169  X[A9]=X[A9]+I5
170  N5=F[A9]
171  GOTO 174
172  X[A9]=X[A9]-I5
173  N5=T[A9]
174  IF N5 <> S1 THEN 164
175  REM -- FLOW INCREMENTED, RETURN TO KILTER TEST
176  L[N5]=0
177  GOTO 83
178  REM -- CHANGE PRICE
179  D9=I9
180  REM -- FIND INCREMENT
181  FOR A9=1 TO N
182  N1=F[A9]
183  N2=T[A9]
184  IF L[N1]=0 AND L[N2]=0 THEN 195
185  IF L[N1] <> 0 AND L[N2] <> 0 THEN 195
186  C9=C[A9]+P[N1]-P[N2]
187  IF L[N2]=0 AND X[A9]<U[A9] THEN 190
188  IF L[N2] <> 0 AND X[A9]>B[A9] THEN 193
189  GOTO 195
190  IF D9<C9 THEN 195
191  D9=C9
192  GOTO 195
193  IF D9<(-C9) THEN 195
194  D9=-C9
195  NEXT A9
196  IF D9 <> I9 THEN 206
197  IF X[A8]=B[A8] OR X[A8]=U[A8] THEN 202
198  REM -- INFEASIBLE SOLUTION
199  PRINT 
200  PRINT "SORRY -- THERE IS NO FEASIBLE SOLUTION"
201  STOP 
202  REM -- INCREASE PRICE
203  D9=C1
204  IF D9 >= 0 THEN 206
205  D9=-D9
206  FOR N5=1 TO M
207  IF L[N5] <> 0 THEN 209
208  P[N5]=P[N5]+D9
209  NEXT N5
210  REM -- GO BACK TO KILTER TEST
211  GOTO 83
212  REM -- END OF ALGORITHM
213  REM -- PRINT SOLUTION
214  PRINT 
215  PRINT "SOLUTION"
216  PRINT "--------"
217  PRINT 
218  PRINT "FROM   TO   FLOW"
219  PRINT "----  ----  ----"
220  FOR J=1 TO N
221  PRINT F[J];T[J];X[J]
222  NEXT J
223  PRINT 
224  PRINT "NON-ZERO NODE PRICES"
225  PRINT "--------------------"
226  PRINT 
227  PRINT "NODE  PRICE"
228  PRINT "----  -----"
229  FOR I=1 TO 100
230  IF (Z[I]=0) OR (P[I]=0) THEN 232
231  PRINT I;P[I]
232  NEXT I
233  PRINT 
234  S9=0
235  FOR J=1 TO N
236  S9=S9+X[J]*C[J]
237  NEXT J
238  IF P$[2,2]="I" THEN 242
239  PRINT "MAXIMUM TOTAL COST = ";-S9
240  PRINT 
241  STOP 
242  PRINT "MINIMUM TOTAL COST = ";S9
243  PRINT "------------------------------------"
244  PRINT 
9998  DATA 999
9999  END 
