C PROGRAM NAME: RODUN08.FOR C ADAPTED FOR THE FREE GNU G77 FORTRAN COMPILER IN DEC 2008 INTEGER TOTPRO,COUNT,DPSEQ COMMON /RIT/ IPSET(20,50) c INDEX NO OF PROJ IN FIXED PROJECT SEQ C COMMON AREA FOR PROGRAMS RODUN,FINPRI 1,SCALE(20) c !SCALE FACTOR FOR EACH OF THE FIXED PR SETS 2,AVAER(20) c !AVERAGE ABSOLUTE ERROR IN HEUR ALG # I 3,AVER(20) c !AVERAGE RELATIVE ERROR IN HEUR ALG # I 4,FAILR(20) c !FAILURE RATE IN HEUR ALG # I CHARACTER*1 ZNAME(60),PIND, IAFLAG, IGFLAG COMMON /DM/ T(100),D(100),NDEDAT,TAR,DMULT,DKON COMMON /RI/ DPCTOT,COUNT c !DISCOUNTED TOTAL COST IN DP SEQ,COUNTER OF SPS 1,DPSEQ(20),PPP,PP C !DYNPRO SEQUENCE,LOGICAL PRINT FLAGS 1,MSEQ(20) c !SCRATCH SEQUENCE 1,IDOM c !dominANCE INDICATOR(IDOM=1:DOMINANCE) 1,ERTO(20) c !ACCUMULATED ERROR IN SEQ ALG 1,ERRMAX(20) c !MAX ERROR IN SEQ ALG 1,NERR(20) c !SP# WHERE MAX ERROR OCCURRED 1,KNT(20) c !ERROR COUNTER FOR EACH SP 1,CT(20) c !TOTAL DISCOUNTED COST FOR EACH ALG 1,ISEQ(20,20) c !INDEX NO OF THE PROJECT IN J-TH PLACE C !INSEQUENCE FOR ALG # I (I,J) 1,ER(20) c !PERC ERROR IN EACH ALG 1,NOALG c !NO OF HEURISTIC ALGORITHMS 1,IBETT(20,20) c !COUNTER FOR SPS WHEN ALG #I IS SUPERIOR TO ALG#J (I,J) 1,IBEST(20) c !COUNTER FOR SPS WHERE ALG #I (EXCEPT DP) IS BEST COMMON /RAN2/LL,MM c !RANDOM NO SEEDS FOR RAND SEQUENCING COMMON /RAN/ II,L,M C !RAND NO SEEDS FOR RAND GEN & SEL OF PROJ COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX LOGICAL PRID,RASEL,P,PP,PPP,PKI,PCI,PSI IAFLAG ='N' OPEN(UNIT=9,FILE='DEM.DAT') OPEN(UNIT=7,FILE='RES.DAT') OPEN(UNIT=11,FILE='ADEBUG.DAT') P=.FALSE. PP=P PPP=P PKI=P PCI=P PSI=P NOALG=7 C ! NO OF HEOURISTIC SEQUENCING ALGORITHMS IGFLAG='N' WRITE(11,990) C CALL GETTIM (IHR,IMIN1,ISEC,IS100) OUTDATED CALL FOR CPU TIME CALL CPU_Time(SEC1) C WRITE(*,1) OLD VERION WITH SCREEN INPUT C1 FORMAT(10X,'THE WATER RESOURCES SEQUENCING PROBLEM; '// C 110X,'ENTER INTEREST RATE IN % ') 990 FORMAT(80('-')) READ(9,2) XINT C READ INTEREST RATE FROM DEM.DAT C WRITE(*,990) 2 FORMAT(F3.0) write(11,*) xint C WRITE(*,376) ' DETAILED WRITEOUT TO A FILE DESIRED ? ' C WRITE(*,376) ' R(I)-SEQ DET.FOR ALL SEQ. PROB :A ' C WRITE(*,376) ' MINIMUM OUTPUT FOR ALL SEQ PROB :B ' C WRITE(*,376) ' OUTPUT ONLY WHEN R(I) IS NONOPT :C ' C WRITE(*,376) ' COMPACT DETAILS FOR ALL SEQ PR. :D ' C WRITE(*,376) ' K(I)SEQ DETAILS FOR ALL SEQ PR. :E ' C WRITE(*,376) ' C/X SEQ DETAILS FOR ALL SEQ PR. :F ' C WRITE(*,371) ' S(I)SEQ DETAILS FOR ALL SEQ PR. :G ' 371 FORMAT(1X,A50,4X) READ(9,372) PIND READ(9,372) READ(9,372) READ(9,372) READ(9,372) READ(9,372) READ(9,372) READ(9,372) C DUMMY READING OF EXPLANATIONS LINES IN DEM.DAT 372 FORMAT(A1) write(11,*) pind 376 FORMAT (1X,A50) IF (PIND.EQ.'A')P=.TRUE. IF (PIND.EQ.'B')PP=.TRUE. IF (PIND.EQ.'C')PPP=.TRUE. IF (PIND.EQ.'E') PKI=.TRUE. IF (PIND.EQ.'F') PCI=.TRUE. IF (PIND.EQ.'G') PSI=.TRUE. PRID=P C WRITE(*,3) C3 FORMAT(2X,'ENTER FIRST AND LAST INDEX FOR REQUIRED DEMAND ', C 1'FUNCTION') READ(9,4) NBEGD,NENDD 4 FORMAT(2I5) write(11,*) nbegd,nendd C WRITE(*,5) OPEN(UNIT=10,FILE='BOUT.DAT') 5 FORMAT(2X,'DO YOU WANT ACTUAL COST DATA?(Y OR N)') C READ(9,6) IAFLAG C YOU ALWAYS WANT ACTUAL COST DATA IAFLAG='Y' 6 FORMAT(A1) write(11,*) IAFLAG IF(IAFLAG.NE.'Y')GO TO 9 OPEN(UNIT=8,FILE='PROCOST.DAT') READ(8,201)TOTPRO,NOFIX,LFIX,SCA 201 FORMAT(3I3,F10.0) WRITE(10,202)TOTPRO,NOFIX,LFIX,SCA C WRITE(*,202) TOTPRO,NOFIX,LFIX,SCA C DONT WRITE THIS ON THE SCREEN 202 FORMAT(1H1,20X,'TOTAL NO OF PROJECTS IN FILE PROCOST=' 1,I3/20X,' NO. OF' 1,' FIXED PROJECT SETS =',I3/20X 1,'LENGTH OF EACH PROJECT SET= ',I3 1,/20X,'SCALE FACTOR FOR ADJUSTING THE SIZE OF ALL PROJECTS=' 1,G10.2) IF(NOFIX.EQ.0)GO TO 228 DO 203 I=1,NOFIX READ(8,204)SCALE(I),(IPSET(I,J),J=1,LFIX) IF(P) WRITE(10,207)I,SCALE(I),(IPSET(I,J),J=1,LFIX) 203 CONTINUE 228 IF(P) WRITE(10,208) IF(P) WRITE(10,910) 204 FORMAT(F10.0,20I3) DO 205 I=1,TOTPRO READ(8,206) CC(I),XX(I),(ZNAME(J),J=1,40) IF(P) WRITE(10,209) I,CC(I),XX(I),(ZNAME(J),J=1,40) 205 CONTINUE 206 FORMAT(2F10.0,40A1) CLOSE(8) 207 FORMAT(3X,' IN FIXED PROJECT SEQUENCE #',I3,' IS SCALE FACTOR:', 1G10.3,' AND THE PROJECTS:',130(I3,',')) 208 FORMAT(//'*****************LIST 1OF ALL ACTUAL PROJECTS*********') WRITE(10,909) 909 FORMAT(80('*')) 910 FORMAT(1X,T5,'PROJECT NO',T16,'COST',T31,'CATACITY',T50 1 ,'NAME OF PROJECT') 209 FORMAT (1X,T5,I10,T16,F10.0,T31,F10.0,T50,60A1) WRITE(10,909) C WRITE(*,7) 7 FORMAT(20X,'ENTER NO OF RANDOMLY SELECTED DATA SETS' 1/25X,' FROM ACTUAL DATA ') READ(9,46) NCCSET 46 FORMAT(I5) C WRITE(*,8) 8 FORMAT(20X,'ENTER NO OF PROJECTS IN EACH SET ') READ(9,46) NPRO C WRITE(*,22) 22 FORMAT(20X,'ENTER INDEX NO`S OF FIRST AND LAST PROJECT TO BE'/ 120X,' INCLUDED IN THE RANGE OF RANDOMLY SELECTED PROJECTS ') READ(9,4) NBEGP,NENDP 9 CONTINUE C WRITE(*,10) write(11,*) NBEGP,NENDP 10 FORMAT(3X,'DO YOU WANT GENERATED COST DATA?(Y OR N) ') C READ(*,6) IGFLAG IGFLAG='Y' IF((IGFLAG.NE.'Y').AND.(IAFLAG.NE.'Y'))STOP 'NO PROCESSING' IF(IGFLAG.NE.'Y')GO TO 47 C WRITE(*,23) 23 FORMAT(20X,'ENTER # OF RANDOMLY GENERATED DATA SETS ') READ(9,46) NCGSET C WRITE(*,24) 24 FORMAT(20X,'ENTER # OF PROJECTS IN EACH SET ') READ(9,46) NPROG 47 IF (NBEGD.LE.1)GO TO 48 DO 14 I=1,NBEGD-1 CALL DEMAND(PRID) C THE SUBROUTINE DEAMND READS IN A NEW DEMAND FUNCTION C FROM THE FILE DEM.DAT 14 CONTINUE C****************************************************************************** 48 DO 15 I=NBEGD,NENDD RASEL=.FALSE. L=245791 M=573 LL=167351 MM=12538 DO 36 IK=1,20 ER(IK)=0 IBEST(IK)=0 ERTO(IK)=0 KNT(IK)=0 NERR(IK)=1 ERRMAX(IK)=0 DO 601 JN=1,20 IBETT(IK,JN)=0 601 CONTINUE 36 CONTINUE KSKR=0 COUNT =0 CALL DEMAND(PRID) IF(IAFLAG.NE.'Y')GO TO 117 DO 16 II=1,NOFIX+NCCSET IF(II-NOFIX)301,301,302 301 RASEL=.FALSE. DO 17 III=1,LFIX C(III)=CC(IPSET(II,III)) X(III)=XX(IPSET(II,III))*SCALE(II) D WRITE(10,801) III,C(III),X(III) D801 FORMAT( ' III=',I5,' C(III)=',F10.0,' X(III)=',F10.0) 17 CONTINUE CCCCCCCCCCCCCCCCCCCC HERE WE HAVE THE NUCLEUS FOR ACTUAL DATACCCCCCCCCCC KK=LFIX 303 COUNT=COUNT+1 IF(PP)WRITE(10,990) IF((.NOT.RASEL).AND.PP)WRITE(10,31) COUNT,I,II IF(RASEL.AND.PP)WRITE(10,80) COUNT,I,II-NOFIX 31 FORMAT(' SEQUENCING PROBLEM #',I3,' DEMAND FUNCTION #',I3, 1' FIXED PROJECT SEQUENCE #',I3) 80 FORMAT(' SEQUENCING PROBLEM #',I3,' DEMAND FUNCTION #',I3, 1' RANDOMLY SELECTED SEQUENCE #',I3) write(11,*) 'DP byrjun' CALL DOMIN(IDOM) C------------------------ DYNAMIC PROGRAMING SEQUENCING----------------- CALL XDPROD(DPCTOT,DPSEQ) C--------------------------K(I) SEQUENCING------------------------------ CALL KISEQ(CT(3),MSEQ,3,PKI) CALL COMPR(DPSEQ,MSEQ,KOMP) DO 86 IK=1,KK ISEQ(3,IK)=MSEQ(IK) 86 CONTINUE CALL SEQNOT(3,KOMP) C--------------------------TMR SEQUENCING-------------------------- CALL KISEQ(CT(2),MSEQ,2,P) DO 87 IK=1,KK ISEQ(2,IK)=MSEQ(IK) 87 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(2,KOMP) KSKR=KOMP C-------------------------- C/X SEQUENGING------------------------- CALL KISEQ(CT(1),MSEQ,1,PCI) DO 41 IK=1,KK ISEQ(1,IK)=MSEQ(IK) 41 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(1,KOMP) C-------------------------- S(I) SEQUENCING------------------------ CALL KISEQ(CT(4),MSEQ,4,PSI) DO 42 IK=1,KK ISEQ(4,IK)=MSEQ(IK) 42 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(4,KOMP) C---------------------------RANDOM SEQUENCING---------------------- CALL KISEQ(CT(5),MSEQ,5,.FALSE.) DO 33 IK=1,KK ISEQ(5,IK)=MSEQ(IK) 33 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(5,KOMP) C---------------------------MAX(K,R) SEQUENCING------------------- CALL MAXALG(3,2,6) CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(6,KOMP) C---------------------------MAX(S,R) SEQUENCING-------------------- CALL MAXALG(4,2,7) CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(7,KOMP) C---------------------------PERFORMANCE EVALUATION------------------- CALL PERFOR IF(PPP.AND.(KSKR.EQ.1))CALL SKRIFT C !WRITE WHEN R(I) NONOPT IF(PIND.EQ.'D')CALL SKRIFT C !COMPACT WRITEOUT GO TO 43 302 CALL RANPAC(PRID) KK=NPRO DO 76 I5=1,KK X(I5)=X(I5)*SCA 76 CONTINUE C !SCALE ALL PROJECTS RASEL=.TRUE. GO TO 303 43 CONTINUE 16 CONTINUE C SEQUENCING STARTS FOR GENERATED DATA 117 IF(IGFLAG.NE.'Y')GO TO 15 WRITE(10,990) WRITE(10,63) DO 61 II=1,NCGSET CALL PROGEN(0,PRID) KK=NPROG DO 75 I5=1,KK C !SCALE ALL PROJECTS X(I5)=X(I5)*SCA 75 CONTINUE COUNT=COUNT+1 IF(PP)WRITE(10,990) IF(PP)WRITE(10,62) COUNT,I,II 63 FORMAT(10X,'*************RANDOMLY GENERATED DATA*************') 62 FORMAT(' SEQUENCING PROBLEM #:',I3, 1 ' DEMAND FUNCTION INDEX NO:', 1 I3,' RANDOMLY GENERATED SEQUENCE NO:',I3) CALL DOMIN(IDOM) C------------------------- DYNAMIC PROGRAMING SEQUENCING--------------------- CALL XDPROD(DPCTOT,DPSEQ) C---------------------------K(I) SEQUENCING--------------------------------- CALL KISEQ(CT(3),MSEQ,3,PKI) DO 88 IK=1,KK ISEQ(3,IK)=MSEQ(IK) 88 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(3,KOMP) C--------------------------TMR SEQUENCING----------------------------------- CALL KISEQ(CT(2),MSEQ,2,P) DO 89 IK=1,KK ISEQ(2,IK)=MSEQ(IK) 89 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(2,KOMP) KSKR=KOMP C-------------------------- C/X SEQUENGING------------------------- CALL KISEQ(CT(1),MSEQ,1,PCI) DO 81 IK=1,KK ISEQ(1,IK)=MSEQ(IK) 81 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(1,KOMP) C-------------------------- S(I) SEQUENCING------------------------ CALL KISEQ(CT(4),MSEQ,4,PSI) DO 82 IK=1,KK ISEQ(4,IK)=MSEQ(IK) 82 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(4,KOMP) C---------------------------RANDOM SEQUENCING---------------------- CALL KISEQ(CT(5),MSEQ,5,.FALSE.) DO 83 IK=1,KK ISEQ(5,IK)=MSEQ(IK) 83 CONTINUE CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(5,KOMP) C---------------------------MAX(K,R) SEQUENCING------------------- CALL MAXALG(3,2,6) CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(6,KOMP) C---------------------------MAX(S,R) SEQUENCING-------------------- CALL MAXALG(4,2,7) CALL COMPR(DPSEQ,MSEQ,KOMP) CALL SEQNOT(7,KOMP) C----------------------------PERFORMANCE EVALUATION-------------------- CALL PERFOR C----------------------------PRINTOUT OF RESULTS --------------------- IF(PPP.AND.(KSKR.EQ.1))CALL SKRIFT C !WRITE WHEN R(I) NONOPT IF(PIND.EQ.'D')CALL SKRIFT C !COMPACT WRITEOUT 61 CONTINUE C---------------------------PREPARE AND PRINT DATA------------------------- XCOUNT=COUNT DO 761 IK=1,NOALG AVAER(IK)=ERTO(IK)/XCOUNT XKNT=KNT(IK) IF(KNT(IK).NE.0)AVER(IK)=ERTO(IK)/XKNT IF(KNT(IK).EQ.0)AVER(IK)=0 FAILR(IK)=XKNT/XCOUNT 761 CONTINUE CALL FINPRI(I) C------------------NEXT DEMAND FUNCTION----------------------------------- 15 CONTINUE C CALL GETTIM (IHR,IMIN2,ISEC,IS100) old version CALL CPU_Time(SEC2) DELTA=(SEC2-SEC1)/60 C DELTA=IMIN2-IMIN1 old version WRITE(10,261) DELTA 261 FORMAT(5X,'RUNNING TIME=',F15.2,' MINUTES') CLOSE(6) CLOSE(7) CLOSE(9) STOP'FINISHED OK!' END SUBROUTINE MAXALG(I1,I2,IOUT) C---------------------------------------------------------------------- C THE SUBROUTINE MAXALG COMBINES ALGORITHM #I1 AND ALGO- C RITHM #I2 AND CREATES A NEW ALGO #IOUT. FOR EACH SP THE C BETTER ALGO OF THE 2 (#I1 & #I2) IS SELQCTED. C---------------------------------------------------------------------- COMMON /RI/ DPCTOT,COUNT c !DISCOUNTED TOTAL COST IN DP SEQ,COUNTER OF SPS 1,DPSEQ(20),PPP,PP C !DYNPRO SEQUENCE,LOGICAL PRINT FLAGS 1,MSEQ(20) c !SCRATCH SEQUENCE 1,IDOM c !DOMINANCE INDICATOR(IDOM=1:DOMINANCE) 1,ERTO(20) c !ACCUMULATED ERROR IN SEQ ALG 1,ERRMAX(20) c !MAX ERROR IN SEQ ALG 1,NERR(20) c !SP# WHERE MAX ERROR OCCURRED 1,KNT(20) c !ERROR COUNTER FOR EACH SP 1,CT(20) c !TOTAL DISCOUNTED COST FOR EACH ALG 1,ISEQ(20,20) c !INDEX NO OF THE PROJECT IN J-TH PLACE C !INSEQUENCE FOR ALG # I (I,J) 1,ER(20) c !PERC ERROR IN EACH ALG 1,NOALG c !NO OF HEURISTIC ALGORITHMS 1,IBETT(20,20) c !COUNTER FOR SPS WHEN ALG #I IS SUPERIOR TO ALG#J (I,J) 1,IBEST(20) c !COUNTER FOR SPS WHERE ALG #I (EXCEPT DP) IS BEST COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX INTEGER DPSEQ,COUNT I=I2 IF(ER(I1).LT.ER(I2))I=I1 CT(IOUT)=CT(I) DO 10 IK=1,KK ISEQ(IOUT,IK)=ISEQ(I,IK) MSEQ(IK)=ISEQ(I,IK) 10 CONTINUE RETURN END SUBROUTINE SKRIFT C------------------------------------------------------------------------- C THIS SUB WRITES COMPACT DETAILS ABOUT ALL SP C------------------------------------------------------------------------- COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX INTEGER DPSEQ,COUNT COMMON /RI/ DPCTOT,COUNT c !DISCOUNTED TOTAL COST IN DP SEQ,COUNTER OF SPS 1,DPSEQ(20),PPP,PP C !DYNPRO SEQUENCE,LOGICAL PRINT FLAGS 1,MSEQ(20) c !SCRATCH SEQUENCE 1,IDOM c !DOMINANCE INDICATOR(IDOM=1:DOMINANCE) 1,ERTO(20) c !ACCUMULATED ERROR IN SEQ ALG 1,ERRMAX(20) c !MAX ERROR IN SEQ ALG 1,NERR(20) c !SP# WHERE MAX ERROR OCCURRED 1,KNT(20) c !ERROR COUNTER FOR EACH SP 1,CT(20) c !TOTAL DISCOUNTED COST FOR EACH ALG 1,ISEQ(20,20) c !INDEX NO OF THE PROJECT IN J-TH PLACE C !INSEQUENCE FOR ALG # I (I,J) 1,ER(20) c !PERC ERROR IN EACH ALG 1,NOALG c !NO OF HEURISTIC ALGORITHMS 1,IBETT(20,20) c !COUNTER FOR SPS WHEN ALG #I IS SUPERIOR TO ALG#J (I,J) 1,IBEST(20) c !COUNTER FOR SPS WHERE ALG #I (EXCEPT DP) IS BEST LOGICAL PPP,PP WRITE(10,10) COUNT,(C(I),I=1,KK) 10 FORMAT(1X,'SP#: ',I4,' C(I): ',20F10.0) WRITE(10,11)(X(I),I=1,KK) 11 FORMAT(10X,' X(I): ',20F10.0) WRITE(10,12) DPCTOT,(DPSEQ(I),I=1,KK) 12 FORMAT(10X,' DPCTOT= ',F10.0,17X,' DPSEQ= ',20(I3,',')) 13 FORMAT(11X,'R(I)SEQ;CT= ',F10.0,' ER= ',F5.2, 1' % RISEQ= ',20(I3,',')) 14 FORMAT(11X,'K(I)SEQ;CT= ',F10.0,' ER= ',F5.2, 1' % KISEQ= ',20(I3,',')) 15 FORMAT(11X,'C/X SEQ;CT= ',F10.0,' ER= ',F6.2, 1' % CXSEQ= ',20(I3,',')) 16 FORMAT(11X,'S(I)SEQ;CT= ',F10.0,' ER= ',F6.2, 1' % SISEQ= ',20(I3,',')) 17 FORMAT(11X,'RAN SEQ;CT= ',F10.0,' ER= ',F6.2, 1' % RANSEQ= ',20(I3,',')) 18 FORMAT(11X,'MAX(K,R)CT= ',F10.0,' ER= ',F6.2, 1' % SEQ= ',20(I3,',')) 19 FORMAT(11X,'MAX(S,R)CT= ',F10.0,' ER= ',F6.2, 1' % SEQ= ',20(I3,',')) WRITE(10,15) CT(1),ER(1),(ISEQ(1,I),I=1,KK) WRITE(10,13)CT(2),ER(2),(ISEQ(2,I),I=1,KK) WRITE(10,14)CT(3),ER(3),(ISEQ(3,I),I=1,KK) WRITE(10,16)CT(4),ER(4),(ISEQ(4,I),I=1,KK) WRITE(10,17)CT(5),ER(5),(ISEQ(5,I),I=1,KK) WRITE(10,18)CT(6),ER(6),(ISEQ(6,I),I=1,KK) WRITE(10,19)CT(7),ER(7),(ISEQ(7,I),I=1,KK) 50 RETURN END SUBROUTINE SEQNOT(JALG,KOMP) C-------------------------------------------------------------------------- C THIS SUBROUTINE PERFORMS PROCESSING OF THE ERROR OCCURRING C IN HEURISTIC ALGORITHM # JALG.THE VARIABLE KOMP IS AN INPUT C TO THE ROUTINE. KOMP=1 IF THE ALGORITHM IS NOT OPTIMAL,BUT C ZERO OTHERWISE. C------------------------------------------------------------------------- COMMON /RI/ DPCTOT,COUNT c !DISCOUNTED TOTAL COST IN DP SEQ,COUNTER OF SPS 1,DPSEQ(20),PPP,PP C !DYNPRO SEQUENCE,LOGICAL PRINT FLAGS 1,MSEQ(20) c !SCRATCH SEQUENCE 1,IDOM c !DOMINANCE INDICATOR(IDOM=1:DOMINANCE) 1,ERTO(20) c !ACCUMULATED ERROR IN SEQ ALG 1,ERRMAX(20) c !MAX ERROR IN SEQ ALG 1,NERR(20) c !SP# WHERE MAX ERROR OCCURRED 1,KNT(20) c !ERROR COUNTER FOR EACH SP 1,CT(20) c !TOTAL DISCOUNTED COST FOR EACH ALG 1,ISEQ(20,20) c !INDEX NO OF THE PROJECT IN J-TH PLACE C !INSEQUENCE FOR ALG # I (I,J) 1,ER(20) c !PERC ERROR IN EACH ALG 1,NOALG c !NO OF HEURISTIC ALGORITHMS 1,IBETT(20,20) c !COUNTER FOR SPS WHEN ALG #I IS SUPERIOR TO ALG#J (I,J) 1,IBEST(20) c !COUNTER FOR SPS WHERE ALG #I (EXCEPT DP) IS BEST INTEGER DPSEQ,COUNT LOGICAL PPP,PP COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX IF(KOMP.EQ.0)GO TO 30 ER(JALG)=(CT(JALG)-DPCTOT)/DPCTOT*100 KNT(JALG)=KNT(JALG)+1 ERTO(JALG)=ERTO(JALG)+ER(JALG) IF(ER(JALG).LE.ERRMAX(JALG))GO TO 20 NERR(JALG)=COUNT ERRMAX(JALG)=ER(JALG) GO TO 20 30 ER(JALG)=0 20 RETURN END SUBROUTINE PERFOR C---------------------------------------------------------------------------- C THE SUBROUTINE PERFOR COMPARES THE PERFORMANCE OF ALL HEURISTIC C ALGORITHMS AGAINST EACH OTHER. C IT INCREMENTS THE COUNTERS IN THE MATRIX IBETT(I,J) FOR AN SP WHEN C ALGORITHM #I IS SUPERIOR TO ALGORITHM #J. C IT INCREMENTS THE VECTOR IBEST, WHEN ALGORITHM # I GIVES THE BEST C SOLUTION OUT OF THE HEURISTIC ALGORITHMS ONLY. C------------------------------------------------------------------------------- COMMON /RI/ DPCTOT,COUNT c !DISCOUNTED TOTAL COST IN DP SEQ,COUNTER OF SPS 1,DPSEQ(20),PPP,PP C !DYNPRO SEQUENCE,LOGICAL PRINT FLAGS 1,MSEQ(20) c !SCRATCH SEQUENCE 1,IDOM c !DOMINANCE INDICATOR(IDOM=1:DOMINANCE) 1,ERTO(20) c !ACCUMULATED ERROR IN SEQ ALG 1,ERRMAX(20) c !MAX ERROR IN SEQ ALG 1,NERR(20) c !SP# WHERE MAX ERROR OCCURRED 1,KNT(20) c !ERROR COUNTER FOR EACH SP 1,CT(20) c !TOTAL DISCOUNTED COST FOR EACH ALG 1,ISEQ(20,20) c !INDEX NO OF THE PROJECT IN J-TH PLACE C !INSEQUENCE FOR ALG # I (I,J) 1,ER(20) c !PERC ERROR IN EACH ALG 1,NOALG c !NO OF HEURISTIC ALGORITHMS 1,IBETT(20,20) c !COUNTER FOR SPS WHEN ALG #I IS SUPERIOR TO ALG#J (I,J) 1,IBEST(20) c !COUNTER FOR SPS WHERE ALG #I (EXCEPT DP) IS BEST INTEGER DPSEQ,COUNT LOGICAL PPP,PP COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX BESS=100 DO 10 I=1,NOALG DO 20 J=1,NOALG IF(ER(I).LT.ER(J))IBETT(I,J)=IBETT(I,J)+1 20 CONTINUE 10 CONTINUE DO 30 I=1,NOALG IF (ER(I).LE.BESS) BESS=ER(I) C !FIND MINIMUM ERROR 30 CONTINUE DO 40 I=1,NOALG IF(ER(I).LE.BESS) IBEST(I)=IBEST(I)+1 C !INCREMENT COUNTER FOR ALL ALG 40 CONTINUE C ! WITH ERROR EQ TO MIN ERROR RETURN END SUBROUTINE FINPRI(ID) C-------------------------------------------------------------------------- C THE SUBROUTINE FINPRI WRITES FINAL RESULTS ONTO FILE 'RES.DAT' C FOR DEMAND FUNCTION # ID C--------------------------------------------------------------------------- COMMON /RIT/ IPSET(20,50) C !INDEX NO OF PROJ IN FIXED PROJECT SEQ C COMMON AREA FOR PROGRAMS RODUN,FINPRI 1,SCALE(20) C !SCALE FACTOR FOR EACH OF THE FIXED PROJECT SETS 2,AVAER(20) C !AVERAGE ABSOLUTE ERROR IN HEUR ALG # I 3,AVER(20) C !AVERAGE RELATIVE ERROR IN HEUR ALG # I 4,FAILR(20) C !FAILURE RATE IN HEUR ALG # I COMMON /RI/ DPCTOT,COUNT c !DISCOUNTED TOTAL COST IN DP SEQ,COUNTER OF SPS 1,DPSEQ(20),PPP,PP C !DYNPRO SEQUENCE,LOGICAL PRINT FLAGS 1,MSEQ(20) c !SCRATCH SEQUENCE 1,IDOM c !DOMINANCE INDICATOR(IDOM=1:DOMINANCE) 1,ERTO(20) c !ACCUMULATED ERROR IN SEQ ALG 1,ERRMAX(20) c !MAX ERROR IN SEQ ALG 1,NERR(20) c !SP# WHERE MAX ERROR OCCURRED 1,KNT(20) c !ERROR COUNTER FOR EACH SP 1,CT(20) c !TOTAL DISCOUNTED COST FOR EACH ALG 1,ISEQ(20,20) c !INDEX NO OF THE PROJECT IN J-TH PLACE C !INSEQUENCE FOR ALG # I (I,J) 1,ER(20) c !PERC ERROR IN EACH ALG 1,NOALG c !NO OF HEURISTIC ALGORITHMS 1,IBETT(20,20) c !COUNTER FOR SPS WHEN ALG #I IS SUPERIOR TO ALG#J (I,J) 1,IBEST(20) c !COUNTER FOR SPS WHERE ALG #I (EXCEPT DP) IS BEST INTEGER DPSEQ,COUNT COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX LOGICAL PPP,PP WRITE(7,3) 3 FORMAT(1H1) WRITE(7,909) 909 FORMAT(132('*')) WRITE(7,2) 2 FORMAT(1X) WRITE(7,1)ID,COUNT,KK,XINT 1 FORMAT(9X,'RESULTS FOR DEMAND FUNCTION # ', 1 I6,' NO OF SEQ PROB.:',I5 1 ,' PROBLEM SIZE:',I3,' INTEREST RATE:',F5.1,' %') WRITE(7,2) WRITE(7,4) 4 FORMAT(2X,'ALGORITHM',6X,' C(I)/X(I)' 1,'TMR K(I) S(' 1,'I) RAND SEQ MAX(K,R) MAX(S,R)') WRITE(7,5)(I,I=1,20) 5 FORMAT(2X,'ALGORITHM NO',11X,20(I10)) WRITE(7,2) WRITE(7,6)(KNT(I),I=1,NOALG) 6 FORMAT(1X,'NO OF SEQ FAILURES',6X,20I10) WRITE(7,7)(FAILR(I),I=1,NOALG) 7 FORMAT(1X,'FAILURE RATE %',10X,20G10.3) WRITE(7,2) 8 FORMAT(1X,'AVE REL FAILURE %',10X,20G10.3) 9 FORMAT(1X,'AVE ABS FAILURE %',10X,20G10.3) 10 FORMAT(1X,' MAX FAILURE %',10X,20G10.3) WRITE(7,8) (AVER(I),I=1,NOALG) WRITE(7,9) (AVAER(I),I=1,NOALG) WRITE(7,10)(ERRMAX(I),I=1,NOALG) WRITE(7,2) WRITE(7,12)(IBEST(I),I=1,NOALG) 12 FORMAT(1X,'NO OF SPS WHEN BEST (EXC DP)',20(I6,4X)) WRITE(7,13) 13 FORMAT(1X,'NO OF SPS WHEN:') 21 FORMAT(1X,'C(I)/X(I) BETTER (',I2,')',3X,20I10) 23 FORMAT(1X,' K(I) BETTER (',I2,')',3X,20I10) 24 FORMAT(1X,' S(I) BETTER (',I2,')',3X,20I10) 22 FORMAT(1X,' TMR BETTER (',I2,')',3X,20I10) 25 FORMAT(1X,' RAN SEQ BETTER (',I2,')',3X,20I10) 26 FORMAT(1X,' MAX(K,R) BETTER (',I2,')',3X,20I10) 27 FORMAT(1X,' MAX(S,R) BETTER (',I2,')',3X,20I10) WRITE(7,21)1,(IBETT(1,I),I=1,NOALG) WRITE(7,22)2,(IBETT(2,I),I=1,NOALG) WRITE(7,23)3,(IBETT(3,I),I=1,NOALG) WRITE(7,24)4,(IBETT(4,I),I=1,NOALG) WRITE(7,25)5,(IBETT(5,I),I=1,NOALG) WRITE(7,26)6,(IBETT(6,I),I=1,NOALG) WRITE(7,27)7,(IBETT(7,I),I=1,NOALG) RETURN END SUBROUTINE DOMIN(IDOM) C---------------------------------------------------------------------------- C THE SUBROUTINE DOMIN CHECKS FOR DOMINANCE AMONG THE KK C PROJECTS IN THE SP. C IF DOMINANCE :IDOM=1 C IF NO DOMINANCE: IDOM=0 C---------------------------------------------------------------------------- COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX IDOM=0 DO 10 I=1,KK DO 20 J=1,KK IF((C(I).LT.C(J)).AND.(X(I).GT.X(J))) IDOM=1 C write(*,*) 'domin loop', i,j 20 CONTINUE 10 CONTINUE C write(*,*) ' £t £r domin', KK RETURN END SUBROUTINE COMPR(OPTSEQ,TSEQ,KOMP) C---------------------------------------------------------------------- C THIS SUBROUTINE COMPARES THE SEQUENCE TSEQ AGAINST C THE OPTIMAL SEQUENCE OPTSEQ. C IF OPTSEQ=TSEQ :KOMP=0 C IF OPTSEQ NOT= TSEQ:KOMP=1 C------------------------------------------------------------------------ COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX INTEGER TSEQ(20),OPTSEQ(20) KOMP=0 DO 10 I=1,KK IF(TSEQ(I).NE.OPTSEQ(I))KOMP=1 10 CONTINUE RETURN END C FUNCTION XRAN(ISEED) C-------------------------------- C RANDOMNUMBER GENERATOR C (In RODUN08 this generator XRAN(ISEED) has in G77 c FOR NUMBERS BETWEEN 0 AND 1 C (been replaced by G77 intrinsic function RAND(0) C----------------------------- C ISEED=IRAND(ISEED) C IRN =ISEED/100 C XRAN = FLOAT(IRN)/1000000 C RETURN C END C INTEGER FUNCTION IRAND(ISEED) C INTEGER ISEED1, ISEED2, M1,M2, MULT1,MULT2, I C MULT1= 3141 C MULT2 = 5821 C M1 = 100000000 C M2 = 10000 C ISEED1 = ISEED / M2 C ISEED2 = MOD( ISEED, M2 ) C I = MOD( ( ( MOD( (ISEED2*MULT1 + ISEED1*MULT2), M2) C 1 * M2 ) + (ISEED2*MULT2) ), M1) C IRAND = MOD(I+1,M1) C RETURN C END C SUBROUTINE XDPROD(CTOT,DPSEQ) C------------------------------------------------------------------ C THIS SUBROUTINE SEQUENCES KK PROJECTS INTO AN OPTIMAL C SEQUENCE USING DYNAMIC PROGRAMING. C OPTIMAL COST: CTOT C OPTIMAL SEQUENCE DPSEQ C------------------------------------------------------------------- COMMON /DM/ T(100),D(100),NDEDAT,TAR,DMULT,DKON COMMON /DP/ CO(3003,2) COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX DIMENSION CI(3003,2) C COST AND CAPACITY FOR I-STAGE INTEGER DPSEQ(20) INTEGER*2 STI(3003,20) C PARTIAL SEQUENCE FOR I STAGE INTEGER*2 STO(3003,20) C --------------- FOR O-STAGE INTEGER*2 NSTO(20) C SCRATCH PARTIAL SEQUENCE CHARACTER*1 CH DO 10 I=1,3003 DO 20 J=1,KK STI(I,J)=0 20 CONTINUE 10 CONTINUE DO 30 I=1,KK CI(I,1)=C(I) C ESTABLISH THE FIRST COST, CI(I,2)=X(I) c AND CAPACITY VECTORS. STI(I,1)=I c ESTABLISH THE FIRST STAGE 30 CONTINUE c VECTOR DO 100 IST=1,KK-1 c GO THRU THE STAGES DO 13 I=1,3003 DO 12 J=1,KK STO(I,J)=0 CO(I,1)=0 CO(I,2)=0 12 CONTINUE 13 CONTINUE CALL COMB(KK,IST,NCOM) CALL COMB(KK,IST+1,NCO) c CALCULATE # OF COMBINATIONS DO 40 I=1,NCOM C GO DOWN THE STAGE VECTOR DO 50 IP=1,KK c CHECK ALL PROJECTS CH='N' c LOWER 'ALREADY IN PSEQ-FLAG' DO 60 IX=1,IST IF (STI(I,IX).EQ.IP)CH='Y' c THE FLAG IS RAISED 60 CONTINUE IF(CH.EQ.'Y') GO TO 50 c PROJECT HAS ALREADY BEEN SELECTED DO 70 IX=1,IST c MOVE PARTIAL SEQUENCE NSTO(IX)=STI(I,IX) c TO NSTO AND ADD PROJECT # IP 70 CONTINUE CALL INVDMD(CI(I,2),TCH) CR=CI(I,1)+C(IP)/(1.+XINT/100)**TCH XR=CI(I,2)+X(IP) NSTO(IST+1)=IP D WRITE(11,320) NSTO,I,IST,NCO,NCOM,IP,CR,XR D320 FORMAT(' NSTO=',20I2,' I=',I2,' IST=',I2,' NCO=',I5, D 1' NCOM=',I5,' IP=',I2/' CR=',F10.1,' XR=',F10.1) CALL NEWST(STO,NSTO,IST,NCO,CR,XR) C------- MATCH WITH NEXT STAGE VECTOR AND ADJUST THE VECTOR 50 CONTINUE c NEW UNSELECTED PROJECT 40 CONTINUE c STAGE VECTOR FINISHED DO 80 I=1,NCO IF(STO(I,1).EQ.0)GO TO 11 c CHECK # OF ELEMENTS IN STAGE 80 CONTINUE c VECTOR STO I=NCO 11 IF(I.NE.NCO) STOP'XDPROD 11' DO 200 I=1,NCO DO 201 J=1,IST+1 c MOVE STO TO STI AS WELL AS COST STI(I,J)=STO(I,J) c AND CAPACITY VECTORS 201 CONTINUE CI(I,1)=CO(I,1) CI(I,2)=CO(I,2) 200 CONTINUE 100 CONTINUE c NEXT STAGE DO 300 I=1,KK DPSEQ(I)=STO(1,I) 300 CONTINUE CTOT=CO(1,1) c SET UP THE RESULTS RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC SUBROUTINE NEWST(STO,NSTO,IST,NC,CR,XR) C--------------------------------------------------------- C C THIS SUBROUTINE TRIES TO MATCH THE PARTIAL SEQUENCE C NSTO TO ANY PARTIAL SEQUENCE(ROW) IN THE OUT-STAGE VECTOR C STO. C IF A MATCH IS FOUND, A CHECK IS PERFORMED TO COMPARE THE C TOTAL DISCOUNTED COST OF NSTO AGAINST THE APPROPRIATE ROW IN C STO. SHOULD NSTO HAVE A LOWER COST, IT REPLACES THAT ROW C IF NO MATCH IS FOUND, NSTO IS ADDED AS A NEW ROW TO THE C STAGE VECTOR STO C----------------------------------------------------------------------- C CR= TOTAL DISCOUNTED COST OF NSTO C XR= ACCUMULATED CAPACITY OF NSTO C IST= STAGE # OF INPUT STAGE C NC= # OF ROWS IN STO C COMMON/DM/ T(100),D(100),NDEDAT,TAR,DMULT,DKON COMMON/DP/ CO(3003,2) COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX INTEGER*2 STO(3003,20),NSTO(20) DO 10 I=1,NC c GO DOWN STO IF(STO(I,1).EQ.0)GO TO 100 DO 20 J=1,IST+1 NCH=0 DO 30 K=1,IST+1 c CHECK FOR A COMPLETE MATCH IF(STO(I,J).EQ.NSTO(K)) NCH=1 30 CONTINUE IF(NCH.EQ.0) GO TO 10 20 CONTINUE IF(CR.GT.CO(I,1))GO TO 70 c COMPARE DISCOUNTED COST CO(I,1)=CR CO(I,2)=XR DO 50 L=1,IST+1 STO(I,L)=NSTO(L) 50 CONTINUE D WRITE(11,310) I,(STO(I,JA),JA=1,IST+1) D310 FORMAT (' C STO(',I1,')= ',20I2) RETURN 10 CONTINUE 8888 STOP' NEWST 8888' 100 CO(I,1)=CR CO(I,2)=XR DO 60 J=1,IST+1 STO(I,J)=NSTO(J) 60 CONTINUE D WRITE(11,320) I,(STO(I,JA),JA=1,IST+1) D320 FORMAT (' A STO(',I1,')= ',20I2) RETURN 70 CONTINUE D WRITE(11,330) I,(STO(I,JA),JA=1,IST+1) D330 FORMAT (' B STO(',I1,')= ',20I2) RETURN END SUBROUTINE SINDX(XA,L,SIND) C-------------------------------------------------------------- C 0OOTHIS SUBROUTINE CALCULATES THE INDEX SIND, THAT c RESULTS C FROM ADDING PROJECT # L TO THE DEMAND FUNCTION c WHEN C ACCUMULATED CAPACITY OF PREVIOUSLY CONSTRUCTED C PROJECTS C EQUALS XA.THE INDEX SIND IS PROPORTIONAL TO THE RATIO C OF C CAPITAL COST TO PRESENT VALUE OF THE ACTUAL OUTPUT C FROM THE PROJECT C--------------------------------------------------------- COMMON /DM/ T(100),D(100),NDEDAT,TAR,DMULT,DKON COMMON /RI/ DPCTOT,COUNT c !DISCOUNTED TOTAL COST IN DP SEQ,COUNTER OF SPS 1,DPSEQ(20),PPP,PP C !DYNPRO SEQUENCE,LOGICAL PRINT FLAGS 1,MSEQ(20) c !SCRATCH SEQUENCE 1,IDOM c !dominANCE INDICATOR(IDOM=1:DOMINANCE) 1,ERTO(20) c !ACCUMULATED ERROR IN SEQ ALG 1,ERRMAX(20) c !MAX ERROR IN SEQ ALG 1,NERR(20) c !SP# WHERE MAX ERROR OCCURRED 1,KNT(20) c !ERROR COUNTER FOR EACH SP 1,CT(20) c !TOTAL DISCOUNTED COST FOR EACH ALG 1,ISEQ(20,20) c !INDEX NO OF THE PROJECT IN J-TH PLACE C !INSEQUENCE FOR ALG # I (I,J) 1,ER(20) c !PERC ERROR IN EACH ALG 1,NOALG c !NO OF HEURISTIC ALGORITHMS 1,IBETT(20,20) c !COUNTER FOR SPS WHEN ALG #I IS SUPERIOR TO ALG#J (I,J) 1,IBEST(20) c !COUNTER FOR SPS WHERE ALG #I (EXCEPT DP) IS BEST COMMON /RAN2/ LL,MM C 'RANDOM NO SEEDS FOR RAND ' C SEQUENCING COMMON /RAN/ II,L1,M C 'RAND NO SEEDS FOR RAND GEN and SEQ OF ' C PROJ INTEGER DPSEQ,SEQ,RICNT,COUNT COMMON C(20),X(20),CC(100),XX(100),KK, 1N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX REAL KICTOT G=0 CALL INVDMD (XA,TA) CALL INVDMD (XA+X(L),TOA) C 'CALC. TIMING FOR PROJ L' DO 10 I=1,NDEDAT IF(XA.LT.D(I)) GO TO 11 C 'IN WHAT LINEAR SEGM OF D(T) IS PROJ L started up' 10 CONTINUE GO TO 12 C ' STARTED LATER THAN POINT no NDEDAT' 11 IR = I C ' FIRST POINT IN D(I) AFTER STARTUP' DO 20 I=1,NDEDAT IF (XA+X(L).LT.D(I)) GO TO 13 C 'IN WHAT LINEaR SEGM IS P no L EXHAUSTED' 20 CONTINUE G=ENU(T(NDEDAT),TOA,D(NDEDAT),XA+X(L)) IS=NDEDAT GO TO 14 13 IS=I-1 IF(IS.LT.IR) GO TO 12 G=ENU(T(IS),TOA,D(IS),XA+X(L)) 14 G=G+ENU(TA,T(IR),XA,D(IR)) IF(IS.EQ.IR) GO TO 31 DO 30 I=IR,IS-1 G=G+ENU(T(I),T(I+1),D(I),D(I+1)) 30 CONTINUE 31 GO TO 32 12 G=ENU(TA,TOA,XA,XA+X(L)) 32 SIND=C(L)/G RETURN END FUNCTION ENU(T1,T2,D1,D2) C------------------------------------------------------- C THIS FUNCTION CALCULATES THE DISCOUNTED 'AREA' C BELOW A LINEAR S EGMENT OF THE DEMAND CURVE. C------------------------------------------------------- COMMON /DM/ T(100),D(100),NDEDAT,TAR,DMULT,DKON COMMON C(20),X(20),CC(100), 1XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX IF (T2.EQ.T1) GO TO 10 ENU=(D2-D1)/(T2-T1)*((1+XINT/100)**(-T1)-(1+XINT/100) 1**(-T2)) 10 IF(T2.EQ.T1)ENU = 0 RETURN END SUBROUTINE COMB(N,K,NCO) C-------------------------------------------------------------------------- C THIS SUBROUTINE CALCULATES THR NUMBER OF COMBINATIONS C EQUAL TO N!/(K!*(N-K)!)=NCO C--------------------------------------------------------------------------- IF(K.EQ.N)GO TO 21 NK=N/2 K1=K IF(K.GT.NK)K1=N-K FNC=1 FNCO=1 DO 10 I=1,K1 FNC=FNC*I FNCO=FNCO*(N-I+1) 10 CONTINUE NCO=FNCO/FNC+0.01 GO TO 22 21 NCO=1 22 RETURN END C SUBROUTINE PROGEN(ISEL,PRI) C----------------------------------------------------------------------- C THIS SUBROUTINE GENERATES FROM A RANDOM DISTRIBUTION, C COST AND CAPACITY DATA FOR WATER RESOURCES PROJECTS. C IF ISEL=0 NORMAL DISTRIB. & C=A*X**B C---------------------------------------------------------------------- COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX COMMON/RAN/II,L,M LOGICAL PRI REAL NORM IF (ISEL) 2,3,4 3 XSD=1950 XMED=2050 A=89 B=.82 DO 10 I=1,NPROG 5 X(I)=NORM(XMED,XSD) IF(X(I).LE.0)GO TO 5 CMED=A*X(I)**B C(I)=NORM(CMED,CMED*.5) IF(PRI) WRITE(10,1) I,C(I),I,X(I) 1 FORMAT(' PROGEN: C(',I2,')=',F10.2,' X(',I2,')=',F10.2) 10 CONTINUE 2 CONTINUE 4 RETURN END C SUBROUTINE RANPAC(PRI) LOGICAL PRI C----------------------------------------------------------------- C THIS SUBROUTINE RANDOMLY SELSCTS A SUBSET OF "NPRO" C PROJECTS OUT OF A SUPERSET OF"NENDP-NBEGP" ACTUAL PROJECTS C--------------------------------------------------------------------- COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX COMMON/RAN/II,L,M INTEGER*1 IE(100) IF(PRI)WRITE(11,2) II-NOFIX DO 20 I=NBEGP,NENDP 20 IE(I)=0 DO 10 I=1,NPRO IGEN=0 40 J=RAND(0)*(NENDP-NBEGP+1)+NBEGP IGEN=IGEN+1 IF(IGEN.GT.15700)STOP'PROJECT SELECTION NOT SUCCESSFUL' IF(IE(J).EQ.1)GO TO 40 C(I)=CC(J) X(I)=XX(J) IE(J)=1 IF(PRI)WRITE(11,1)J 1 FORMAT(' PROJECT NO',I3,' SELECTED') 10 CONTINUE 2 FORMAT(' RANDOMLY SELECTED SET #',I3) write(11,*) 'OUT OF ransel NEW NEW' RETURN END C SUBROUTINE KISEQ(CTOT,NSEQ,IND,P) C------------------------------------------------------------------------------ C THIS PROGRAM SEQUENCES KK PROJECTS ACCORDING TO A INDEX C OR BY RANDOM SELECTION IN THE SUBROUTINE RANSEL. C THE INDEX IS CHOSEN AS FOLLOWS: C IF IND=1 C(I)/X(I) IS THE INDEX C IND=2 R(I) IS THE INDEX(TMR ALGORITHM) C IND=3 K(I) IS THE INDEX C IND=4 S(I) IS THE INDEX C IND=5 RANDOM SELECTION IS PERFORMED C TOTAL DISCOUNTED COST OF THE MINIMUM SEQUENCE IS RETURNED C IN THE VARIABLE "CTOT" C THE OPTIMAL SEQUENCE IS RETURNED IN THE ARRAY "NSEQ". C IF THE LOGICAL VARIABLE P=.TRUE. DETAILED PRINTING IS C PERFORMED. C ------------------------------------------------------------------------------ DIMENSION TIMING(20),NSEQ(20) COMMON /RAN2/ LL,MM COMMON/DM/ T(100),D(100),NDEDAT,TAR,DMULT,DKON COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX REAL K(20,4) c !INDEX FOR EACH PROJ AND EACH ALG. LOGICAL P IF((IND.EQ.1).AND.P) WRITE(10,24)' C(I)/X(I) SEQUENCING' IF((IND.EQ.2).AND.P) WRITE(10,24)' R(I) SEQUENCING' IF((IND.EQ.3).AND.P) WRITE(10,24)' K(I) SEQUENCING' IF((IND.EQ.4).AND.P) WRITE(10,24)' S(I) SEQUENCING' IF((IND.EQ.5).AND.P) WRITE(10,24)' RANDOM SEQUENCING ' 24 FORMAT(15X,5('-'),A25,5('-')) IF(P) WRITE(10,5) 5 FORMAT(1X,'PROJ.NO.,I |COST,C(I)|CAPACITY' 1 ,' | K(I) | KF(I) |' 1 ,' R(I) | S(I) |') CTOT=0. DO 30 JJ=1,KK N(JJ)=0 30 CONTINUE XACCUM=0. DO 20 J=1,KK XKMIN=1E10 IF(IND.EQ.5) CALL RANSEL(J,NMIN) IF(IND.EQ.5) GO TO 15 DO 10 I=1,KK IF(N(I).EQ.1) GO TO 10 K(I,1)=XINT*C(I)/(X(I)*100) CALL INVDMD(XACCUM,T1) CALL INVDMD(XACCUM+X(I),T2) DELT=T2-T1 K(I,2)=C(I)/(1-(1+XINT/100)**(-DELT)) K(I,3)=K(I,2)*DELT/X(I) IF(IND.EQ.4) CALL SINDX(XACCUM,I,SIND) IF(IND.EQ.4) K(I,4)=SIND IF(IND.NE.4) K(I,4)=1E12 IF(P) WRITE(10,6)I,C(I),X(I),K(I,3),K(I,1),K(I,2),K(I,4) 6 FORMAT (2X,I10,20F10.2) IF(K(I,IND).GE.XKMIN)GO TO 10 XKMIN=K(I,IND) NMIN=I 10 CONTINUE 15 N(NMIN)=1 CALL INVDMD(XACCUM,TIMING(J)) XACCUM=XACCUM +X(NMIN) NSEQ(J)=NMIN CTOT=CTOT+C(NMIN)/(1+XINT/100)**TIMING(J) 20 CONTINUE IF(P) WRITE(10,21)(NSEQ(J),J=1,KK) 21 FORMAT(' PROJECT SEQUENCE:',20I6) IF(P) WRITE(10,23)(TIMING(J),J=1,KK) 23 FORMAT(' TIMING OF PROJECTS',20F6.2) IF(P) WRITE(10,22)CTOT 22 FORMAT(' DISCOUNTED TOTAL COST:',F15.2) RETURN END SUBROUTINE RANSEL(JPRO,NSEL) C---------------------------------------------------------------- C THIS SUBROUTINE RANDOMLY SELECTS A PROJECT TO THE JPRO-TH C PLACE IN THE SEQUENCE OF KK PROJECTS. THE INDEX NO OF THE C SELECTED PROJECT IS RETURNED AS NSEL. C----------------------------------------------------------------- COMMON /RAN2/ LL,MM COMMON C(20),X(20),CC(100),XX(100),KK,N(20),NPRO,XINT,NPROG 1,NENDP,NBEGP,NOFIX 1 IRAN=INT(RAND(0)*(KK-JPRO+1)) IF(IRAN.EQ.(KK-JPRO+1)) GO TO 1 IRAN=IRAN+1 ICO=1 DO 10 I=1,KK c ! MATCH IRAN TO UNSELECTED PROJ IF(N(I).EQ.1)GO TO 10 c !THIS PROJ ALREADY SELECTED IF(ICO .EQ. IRAN) GO TO 11 c ! MATCH FOUND ICO=ICO+1 10 CONTINUE STOP ' ERROR IN RANSEL' 11 NSEL=I RETURN END C REAL FUNCTION NORM(X,S) COMMON/RAN/II,L,M C------------------------------------------------------------------------- C THIS ROUTINE GENERATES C NORMALLY DISTRIBUTED RANDOM NUMBERS. C------------------------------------------------------------------------ ASNI =RAND(0) NORM=2.*S*ASNI + X-S C--------------TEMPORARY SQUARE DISTRIBUTION--------------------- RETURN END SUBROUTINE INVDMD(XACC,TACC) COMMON/DM/T(100),D(100),NDEDAT,TAR,DMULT,DKON C C THIS ROUTINE CALCULATES THE INVERSE DEMAND FUNCTION C DO 1 I=1,NDEDAT-1 IF((XACC.GE.D(I)).AND.(XACC.LT.D(I+1))) GO TO 20 1 CONTINUE I=NDEDAT-1 20 TACC=T(I)+ (XACC-D(I))/(D(I+1)-D(I))*(T(I+1)-T(I)) D WRITE(10,2)D(I+1),D(I),XACC,TACC,I D2 FORMAT(' INVDMD: ',4F12.2,I5) RETURN END C SUBROUTINE DEMAND(PRI) C C------------------------------------------------------------------ C THIS SUBROUTINE READS IN A NEW DEMAND FUNCTION C FROM THE FILE DEM.DAT C LOGICAL PRI COMMON/DM/ T(100),D(100),NDEDAT,TAR,DMULT,DKON READ(9,1,END=20) TAR,NDEDAT,DMULT,DKON IF(PRI)WRITE(10,4)TAR,NDEDAT,DMULT,DKON DO 10 I = 1,NDEDAT READ(9,2,END=30)T(I),D(I) D(I)=D(I)*DMULT+DKON IF (PRI) WRITE(11,3) I,T(I),D(I) 10 CONTINUE GO TO 20 1 FORMAT(F5.0,I5,2F5.0) 2 FORMAT(2F10.0) 3 FORMAT(1X,'DEM. POINT # (I)=',I3,' T(I)=',F10.0,'D(I)=',F10.0) 4 FORMAT(20X,' NEW DEMAND FUNCTION '/ ' TIME HORIZON=',F10.0 1/' NO OF DEMAND POINTS', 2I3,' MULTIPLICATION FACTOR=',F10.2,' ADDING CONSTANT=',F10.2) 30 PAUSE ' ERROR IN FILE DEM.DAT' 20 CONTINUE RETURN END