Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-09 - 43,50466/sg1rvs.for
There are 2 other files named sg1rvs.for in the archive. Click here to see a list.
C	WESTERN MICHIGAN UNIVERSITY
C	SG1RVS.FOR (FILENAME ON LIBRARY DECTAPE)
C	CALLED BY SUBR. MAIN2 IN RVSLPR.FOR
C	ABOVE COMMENTS AND RIGHT ADJUSTED COMMENTS PUT IN BY WG
C	COMMON /IOB/, /IOD/, /NONDYN/ ARE SHARED BY MAIN PROG.,
C	  SUBR. MAIN1, MAIN2, AND SEGMT2
C	BINIT, ISLACK, AMAT, IBASIS, ITEST, CWOBJ, NART ORIGBA
C	 ARE INPUT.  OTHER ARGS. ARE RETURNED FOR SUBR. SEGMT2.
C	LSTOP RETURNED BY SEGMT1 THRU COMMON /NONDYN/
	SUBROUTINE SEGMT1(BINIT,ISLACK,AMAT,IBASIS,SHADPR,WSHAD,COBJ,
	1ITEST,CWOBJ,NART,RELCOS,BCONST,PRINV,JPRINV,
	2PIVCOL,BSTAR,IMIN,NBASIS,NONBA,DCOS,ORIGBA)
	COMMON/NONDYN/NR,NC,NR2,NCFIN,JTYPE,TABLO,ICOND,ISWST
	1,FIRST1,FIRST2,ITERRI,FLAG1,FLAG2,LSTOP,FLAG,
	2TOL1,TOL2,TOL3,TOL4,TOL5,TOL6,TOL7,TOL8,IPHASE,
	3TOL9,TOL10,TOL11,GREAT,NEQUAL,ITERR
	COMMON/IOD/NDEVO,DEVNAM,IDVO,IFLNMO,IPJ,IPG,IBNK,
	1NDEVI,IDVI,IFLNMI
	COMMON/IOB/LEFBK,IRTBK,IART,MAXPAG,IPAGE,IPAGCT,IDLG
	1,IRSP,ICODE,JDUMMY
	DOUBLE PRECISION LABEL1,LABEL2,NBASIS
	DIMENSION AMAT(1),BINIT(1),IBASIS(1),SHADPR(1),WSHAD(1),
	1COBJ(1),ITEST(1),ISLACK(1),CWOBJ(1),NART(1),RELCOS(1)
	2,BCONST(1),PRINV(1),JPRINV(1),PIVCOL(1),BSTAR(1),
	3IMIN(1),NBASIS(1),NONBA(1),DCOS(1),ORIGBA(1)
1	NCOL=5
	ITER=0
	ITERRI=0
2	GREAT=1.7E+38
	LSTOP=0
C---------------ISWST=1 MEANS POST SOL OPTIONS BVALU AND/OR INEQ
C--------------- AND/OR OBJ. WERE CHOSEN.  ISWST = 0 MEANS WE ARE
C--------------- IN PRE SOLUTION STAGE.
	IF(ISWST.EQ.1)GO TO 20
	IF(ICOND.EQ.0)GO TO 20
C---------------ICOND=1 MEANS MAX, =0 MEANS MIN.
C---------------IF OBJ. FUNCTION IS TO BE MAX., CHANGE TO NEG.,
C--------------- AS PROG. SOLVES FOR MIN.
	DO 10 J=1,NC
	COBJ(J)=-COBJ(J)
10	CONTINUE
20	DO 5007 I=NC+1,NCFIN
5007	COBJ(I)=0
	DO 30 I=1,NR
	IMIN(I)=0
	BSTAR(I)=0
	PIVCOL(I)=0
	WSHAD(I)=0
	SHADPR(I)=0
30	CONTINUE
	DO 40 J=1,NCFIN
	DCOS(J)=0
	NONBA(J)=0
	RELCOS(J)=0
40	CONTINUE
	ZOBJ=0
	WOBJ=0
	WZ=0
85	IF(IPHASE.LT.NR)GO TO 90
	NPHASE=2
	DO 80 J=1,NC
	RELCOS(J)=COBJ(J)
80	CONTINUE
	GO TO 130
90	NPHASE=1
	DO 100 J=1,NCFIN
C---------------ONES (1) AND ZEROS WERE PUT INTO CWOBJ IN SUBR. MAIN 2.
C--------------- SEE ST. 107+2 AND ST. 260+6 IN SUBR. MAIN 2.
	RELCOS(J)=CWOBJ(J)
100	CONTINUE
C---------------IN PHASE 1 SUBTRACT ALL ROWS CORRSP. TO ART. VARS.
C--------------- FROM THE RELCOST COEFFS.
	DO 120 I=1,NR
	IF(NART(I).EQ.0)GO TO 120
	DO 110 J=1,NCFIN
	IJ=(I-1)*NCFIN+J
	RELCOS(J)=RELCOS(J)-AMAT(IJ)
110	CONTINUE
120	CONTINUE
130	ITER=0
	DO 170 I=1,NR
	SHADPR(I)=0
	BCONST(I)=BINIT(I)
	JPRINV(I)=0
C---------------FORM THE IDENTITY MATRIX IN THE LOCATIONS WHERE
C--------------- AT THE END OF PHASE II THERE WILL BE INVERSE OF 
C--------------- BASIS MATRIX.
	DO 150 J=1,NR
	IJ=(I-1)*NR+J
	IF(J.EQ.I)GO TO 140
	PRINV(IJ)=0
	GO TO 150
140	PRINV(IJ)=1.0
150	CONTINUE
	IF(NART(I).EQ.0)GO TO 160
C---------------SEE "INTRO TO LIN PROG" BY W.W. GARVIN
C--------------- PP. 198-202.  WSHAD=-1 WITH ST. 240+1 IS EQUIV.
C--------------- TO ST. 110-1
	WSHAD(I)=-1.0
C---------------CALC. INITIAL VALUE OF OBJ. FUNCTION (INF. FORM)
C--------------- FOR PHASE 1.
	WZ=WZ-BCONST(I)
	GO TO 170
160	WSHAD(I)=0
170	CONTINUE
	ZOBJ=0
	ZZ=0
	WOBJ=-WZ
C---------------ITERR=-1 MEANS USER CHOSE INOUT OPTION
	IF(ITERR.NE.-1)GO TO 175
	IF(NPHASE.NE.1)GO TO 179
	IF(FIRST1.NE.1)GO TO 175
	WRITE(NDEVO,177)
177	FORMAT(1X,50(1H-),/9X,1HI,18X,1HI,14X,1HI/
	11X,'ITER.NO.',1HI,' VALUE OF FUNCTION',1HI
	2' VARIABLE OUT ',1HI,' VAR. IN',/9X,1HI,18X,1HI,14X,
	31HI/1X,8(1H-),1H+,18(1H-),1H+,14(1H-),1H+,7(1H-),/)
	ZZOBJ=WOBJ
	IF(ICOND.EQ.1)ZZOBJ=-WOBJ
	WRITE(NDEVO,181)ZZOBJ
181	FORMAT(1X,/1X,'PHASE 1',4X,G15.8/)
C---------------FIRST1 INITIALIZED TO 1 IN MAIN PROG. NOW FIRST1=2
C--------------- MEANS WE WILL BYPASS PRINTING OF HEADER JUST ABOVE
	FIRST1=2
	GO TO 175
179	IF(FIRST2.NE.1)GO TO 175
	ZZOBJ=ZOBJ
	IF(ICOND.EQ.1)ZZOBJ=-ZOBJ
	WRITE(NDEVO,182)
182	FORMAT(1X,/1X,'PHASE 2'/)
C---------------FIRST2=2 MEANS WE CAN BYPASS PRINTING "PHASE 2"
C--------------- JUST ABOVE
	FIRST2=2
C---------------ITER=NO. OF PIVOTS IN REV. SIMP. PROC.
175	IF(ITER.EQ.0)GO TO 255
176	CONTINUE
C---------------CALCULATE NEXT SET OF REL.COST COEFFS.
C--------------- THIS IS SKIPPED THE FIRST TIME. SEE ST. 175
C--------------- JUST ABOVE AND ST. 110-1.
190	DO 250 J=1,NCFIN
	IF(ITEST(J).EQ.1)GO TO 200
	RELCOS(J)=0
	GO TO 250
200	IF(NPHASE.EQ.1)GO TO 210
	RELCOS(J)=COBJ(J)
	GO TO 220
210	RELCOS(J)=CWOBJ(J)
220	DO 251 I=1,NR
	IF(NPHASE.EQ.1)GO TO 230
	PI=SHADPR(I)
	GO TO 240
230	PI=WSHAD(I)
240	IJ=(I-1)*NCFIN+J
	RELCOS(J)=RELCOS(J)+PI*AMAT(IJ)
242	IF(ABS(RELCOS(J)).LT.TOL11)RELCOS(J)=0
251	CONTINUE
250	CONTINUE
255	CONTINUE
260	SMALL=GREAT
270	NLAST=NCFIN
C---------------LOOK FOR SMALLEST PHASE 2 REL.COST COEFF. AMONG
C--------------- THOSE COLS. WHICH ARE NOT IN THE BASIS AND WHOSE
C--------------- PHASE 1 REL.COST COEFFS. IN ABS. VALUE ARE GREATER
C--------------- THAN TOL 1.
280	DO 290 J=1,NCFIN
	IF(ITEST(J).EQ.0.OR.ABS(DCOS(J)).GT.TOL1)GO TO 290
	IF(RELCOS(J).GE.SMALL)GO TO 290
	SMALL=RELCOS(J)
	JEXCH=J
290	CONTINUE
	IF(SMALL.LT.0)GO TO 300
C---------------GO TO 520 IF HAVE OPTIMAL SOL.
	IF(NPHASE.EQ.2)GO TO 520
C---------------GO TO 295 IF FINISHED PHASE 1
	IF(ABS(WOBJ).LE.TOL2)GO TO 295
	GO TO 515
295	DO 296 I=1,NCFIN
296	DCOS(I)=RELCOS(I)
	NPHASE=2
	GO TO 175
C---------------CALCULATE VALUES IN PIVOTAL CAL.
300	DO 310 I=1,NR
	PIVCOL(I)=0
310	CONTINUE
	DO 340 I=1,NR
	IJ=(I-1)*NR
	DO 340 J=1,NR
	IJ=IJ+1
C---------------JEXCH=COL. WITH SMALLEST REL.COST COEFF.
	JJEXCH=(J-1)*NCFIN+JEXCH
C---------------FIRST TIME ALL JPRINV(J)=0, SO WE MOVE 
C--------------- JEXCH. COL. TO PIVCOL, LATER ONE OR MORE OF
C--------------- JPRINV(J) NE 0 (SEE ST. 412).  THIS IS
C--------------- REALLY MULT. OF INVERSE BY JEXCH COL. BUT
C--------------- USING JPRINV(J) TO SAVE COMPUTATIONS.
	IF(JPRINV(J).EQ.0)GO TO 320
	PIVCOL(I)=PIVCOL(I)+PRINV(IJ)*AMAT(JJEXCH)
	GO TO 335
320	IF(I.EQ.J)GO TO 330
	GO TO 340
330	PIVCOL(I)=PIVCOL(I)+AMAT(JJEXCH)
335	IF(ABS(PIVCOL(I)).GE.TOL3)GO TO 340
	PIVCOL(I)=0
340	CONTINUE
	IF(NPHASE.EQ.1)GO TO 350
C---------------IN PHASE 2 ONLY CSPRIM IS NEEDED TO UPDATE
C--------------- SHADPR.  SEE ST. 435.
	CSPRIM=RELCOS(JEXCH)
	GO TO 365
C---------------IN PHASE 1 WE NEED BOTH DSPRIM AND CSPRIM.
C--------------- SEE ST. 435.
350	DSPRIM=RELCOS(JEXCH)
	CSPRIM=COBJ(JEXCH)
	DO 360 I=1,NR
	IJEXCH=(I-1)*NCFIN+JEXCH
	CSPRIM=CSPRIM+SHADPR(I)*AMAT(IJEXCH)
360	CONTINUE
365	CONTINUE
C---------------DETERMINE EXCHANGE ROW=ROW FOR WHICH
C--------------- BCONST(I)/PIVCOL(I) IS SMALLEST FOR
C--------------- PIVCOL(I) GREATER THAN ZERO.
370	RSMALL=GREAT
	NUM=0
	NMIN=0
	K=0
	DO 372 I=1,NR
	IMIN(I)=0
372	CONTINUE
	DO 400 I=1,NR
	IF(PIVCOL(I))390,390,375
375	RATIO=BCONST(I)/PIVCOL(I)
C---------------ROUND OFF RATIO TO EXACTLY 7 DECIMAL PLACES TO ALLOW
C---------------NUMBERS WHICH ARE CLOSE ENOUGH TOGETHER TO BE 
C--------------- DESIGNATED AS TIES.
373	RAT=RATIO*TOL4+0.5
374	RATIO=AINT(RAT)*TOL5
	IF(RATIO.LT.RSMALL)GO TO 380
	GO TO 385
380	RSMALL=RATIO
	IEXCH=I
	IMIN(I)=I
	NMIN=1
	IX=I-1
	IF(IX.EQ.0)GO TO 400
	DO 381 N=1,IX
	IMIN(N)=0
381	CONTINUE
	GO TO 400
385	IF(RATIO.EQ.RSMALL)GO TO 386
	GO TO 400
386	NMIN=NMIN+1
	IMIN(I)=I
	GO TO 400
C---------------COME HERE FROM ST. 372+2
390	NUM=NUM+1
400	CONTINUE
C---------------COME HERE FROM JUST ABOVE AND/OR ST. 406+1
388	IF(NMIN.GT.1)GO TO 401
	GO TO 407
401	CONTINUE
C---------------ITERATION "ITER" HAS A "NMIN" FOLD DEGENERACY.
C--------------- RESOLVE DEGENERACY.
C---------------SEE "INTRO TO LIN. PROG." BY W.W. GARVIN PP.215-216.
411	K=K+1
403	RSMALL=GREAT
	DO 406 L=1,NR
	IF(IMIN(L).EQ.0)GO TO 406
	IM=IMIN(L)
	IMK=(IM-1)*NR+K
	RATIO=PRINV(IMK)/PIVCOL(IM)
402	RAT=RATIO*TOL4+0.5
409	RATIO=AINT(RAT)*TOL5
	IF(RATIO.LT.RSMALL)GO TO 404
	IF(RATIO.GT.RSMALL)GO TO 405
	NMIN=NMIN+1
	GO TO 406
404	RSMALL=RATIO
	IEXCH=L
	IL=L-1
	NMIN=1
	IF(IL.EQ.0)GO TO 406
	DO 408 I=1,IL
	IMIN(I)=0
408	CONTINUE
	GO TO 406
405	IMIN(L)=0
406	CONTINUE
	GO TO 388
C---------------COME HERE FROM ST. 388+1.  NUM = # OF PIVCOL(I) LE 0
407	IF(NUM.EQ.NR)GO TO 500
C---------------COL. WITH SMALLEST REL.COST COEFF. (JEXCH)
C--------------- DETERMINE THAT A VAR. GOES INTO THE BASIS.
C---------------ROW WITH SMALLEST BCONST/PIVCOL RATIO (IEXCH)
C--------------- DETERMINES THAT A VAR. GOES OUT OF BASIS.
	IB=IBASIS(IEXCH)
	ITEST(IB)=1
	ITEST(JEXCH)=0
	IBASIS(IEXCH)=JEXCH
C---------------ITER=NO. OF PIVOTS IN THE REVISED SIMPLEX PROCEDURE.
	ITER=ITER+1
C---------------CALCULATE VALUES OF BASIS VARS.
	PIVOT=PIVCOL(IEXCH)
	BBASE=BCONST(IEXCH)/PIVOT
	DO 420 I=1,NR
	IF(I.EQ.IEXCH)GO TO 410
	BCONST(I)=BCONST(I)-PIVCOL(I)*BBASE
	GO TO 415
410	BCONST(I)=BBASE
415	IF(BCONST(I).LT.TOL6)BCONST(I)=0
420	CONTINUE
C---------------CALCULATE INVERSE.
412	JPRINV(IEXCH)=IEXCH
	DO 430 J=1,NR
	IF(JPRINV(J).EQ.0)GO TO 430
	IEXCHJ=(IEXCH-1)*NR+J
	PRINV(IEXCHJ)=PRINV(IEXCHJ)/PIVOT
	BSTAR(J)=PRINV(IEXCHJ)
	DO 431 I=1,NR
	IJ=(I-1)*NR+J
	IF(I.EQ.IEXCH)GO TO 425
	PRINV(IJ)=PRINV(IJ)-PIVCOL(I)*BSTAR(J)
425	IF(ABS(PRINV(IJ)).GE.TOL7)GO TO 431
	PRINV(IJ)=0
431	CONTINUE
430	CONTINUE
C---------------CALCULATE SIMPLEX MULTIPLIERS (SHADOW PRICES).
C--------------- IN PHASE 1 UPDATE BOTH SHADPR AND WSHAD.  IN
C--------------- PHASE 2 UPDATE ONLY SHADPR.
435	DO 440 J=1,NR
	IEXCHJ=(IEXCH-1)*NR+J
	SHADPR(J)=SHADPR(J)-CSPRIM*PRINV(IEXCHJ)
	IF(ABS(SHADPR(J)).LT.TOL8)SHADPR(J)=0
	IF(NPHASE.EQ.2)GO TO 440
	WSHAD(J)=WSHAD(J)-DSPRIM*PRINV(IEXCHJ)
	IF(ABS(WSHAD(J)).LT.TOL9)WSHAD(J)=0
440	CONTINUE
C---------------CALCULATE VALS. OF OBJ. FUNCTION.
	ZZ=ZZ-CSPRIM*BBASE
	ZOBJ=-ZZ
	IF(NPHASE.EQ.2)GO TO 4400
	WZ=WZ-DSPRIM*BBASE
	WOBJ=-WZ
442	IF(WOBJ.LT.TOL10)WOBJ=0
4400	CONTINUE
C---------------ITERR=-1 MEANS USER SPEC. INOUT OPTION
	IF(ITERR.NE.-1)GO TO 175
	IF(NPHASE.NE.1)GO TO 517
C---------------IN PHASE 1 WE PRINT WOBJ. IN PHASE 2 WE PRINT ZOBJ.
	ZZOBJ=WOBJ
	IF(ICOND.EQ.1)ZZOBJ=-WOBJ
443	ITERRI=ITERRI+1
	WRITE(NDEVO,444)ITERRI,ZZOBJ,NBASIS(IB),NBASIS(JEXCH)
444	FORMAT(3X,I3,5X,G15.8,5X,A10,5X,A10)
	GO TO 175
C---------------FIRST2=2 MEANS WE ALREADY PRINTED 'PHASE 2'
C--------------- IN ST. 182.
517	IF(FIRST2.NE.2)GO TO 518
C---------------IN PHASE 2 WE PRINT ZOBJ. IN PHASE 1 WE PRINT WOBJ.
	ZZOBJ=ZOBJ
	IF(ICOND.EQ.1)ZZOBJ=-ZOBJ
	GO TO 443
518	WRITE(NDEVO,519)
519	FORMAT(1X,/1X,'PHASE 2'/)
	FIRST2=2
	GO TO 517
C---------------COME HERE FROM ST. 407
500	WRITE(NDEVO,510)
510	FORMAT(1H0,'SOLUTION IS UNBOUNDED.'/)
	LSTOP=1
	RETURN
515	WRITE(NDEVO,516)
516	FORMAT(1H0,'PROBLEM HAS NO FEASIBLE SOLUTION.'/)
	LSTOP=1
	RETURN
520	CONTINUE
	IF(ICOND.EQ.1)ZOBJ=-ZOBJ
	IF(ICOND.EQ.1)GO TO 5001
	LABEL1='MINIMUM'
	LABEL2='MINIMIZE'
	GO TO 5002
5001	LABEL1='MAXIMUM'
	LABEL2='MAXIMIZE'
5002	WRITE(NDEVO,5000)LABEL1,ZOBJ
5000	FORMAT(1X,'THE ',A10,'VALUE OF OBJECTIVE FUNCTION IS '
	1,/,1X,G15.8,/)
	WRITE(NDEVO,5003)LABEL2
5003	FORMAT(//,' THE VARIABLES AND NUMBER OF UNITS THAT
	1 SHOULD BE USED TO ',A10,/,' THE OBJECTIVE FUNCTION
	2 ARE AS FOLLOWS:'/)
	DO 5004 I=1,NR
	WRITE(NDEVO,5005)NBASIS(IBASIS(I)),BCONST(I)
5004	CONTINUE
5005	FORMAT(1X,10X,A10,3X,G15.8)
	WRITE(NDEVO,5006)
5006	FORMAT(//,1X,'ZERO UNITS OF OTHER VARIABLES ARE ',
	1'TO BE USED.'/)
	FLAG=0
	RETURN
	END