PROGRAM DYNAMIC IMPLICIT INTEGER(A-Z) DOUBLE PRECISION TIMEA,TIMEB,TIMTOT,A(30,30),U(3500000),SUM, 1 B(30),TEMP INTEGER V(3500000),S(30),SCOMP(30),IPERM(30) C C ##################################################################### C DYNAMIC PROGRAMMING ALGORITHM C OBJECTIVE: MAXIMIZE THE DEFAYS CRITERION C ##################################################################### C OPEN(1,FILE='SYM.DAT') OPEN(2,FILE='SYM.OUT') READ(1,*) N ! Read number of objects C DO J = 2,N C READ(1,*) (A(I,J),I=1,J-1) ! Read proximity matrix C END DO C DO J = 2,N C DO I = 1,J-1 C A(J,I) = A(I,J) C END DO C END DO READ(1,*) ((A(I,J),J=1,N),I=1,N) DO I = 1,N DO J = 1,N IF(I.NE.J) B(I) = B(I) + A(I,J) END DO END DO CALL GETTIM (IHR, IMIN, ISEC, I100) CALL GETDAT (IYR, IMON, IDAY) TIMEA=DFLOAT(86400*IDAY+3600*IHR+60*IMIN+ISEC)+DFLOAT(I100)/100. C NSUM = 2**N - 1 DO I = 1,NSUM U(I) = -9.9D+12 END DO DO I = 1,N INDEX = 2**(I-1) V(INDEX) = I U(INDEX) = B(I)**2 END DO C MTC = 0 DO 70 K = 1,N-1 NFIRST = 0 IF(MTC.EQ.0) THEN M2 = 0 DO J = 1,K S(J) = M2 + J END DO IF(S(1).NE.N-K+1) MTC = 1 END IF 75 IF(MTC.EQ.0) GO TO 70 IF(NFIRST.EQ.1) THEN IF(M2.LT.N-NH) NH = 0 NH = NH + 1 M2 = S(K+1-NH) DO J = 1,NH S(K+J-NH) = M2 + J END DO MTC = 1 IF(S(1).EQ.N-K+1) MTC = 0 END IF IF(NFIRST.EQ.0) NFIRST = 1 INDEX = 0 DO I = 1,K INDEX = INDEX + 2**(S(I)-1) END DO C JJ = 1 DO I = 1,N SCOMP(I) = 0 END DO IDX = 0 DO 76 I = 1,N DO J = 1,K IF(I.EQ.S(J)) GO TO 76 END DO IDX = IDX + 1 SCOMP(IDX) = I 76 CONTINUE C NK = N - K DO JJ = 1,NK J1 = SCOMP(JJ) SUM = 0.0D0 DO I = 1,K I1 = S(I) SUM = SUM + A(J1,I1) END DO TEMP = (B(J1)-2*SUM)**2 TEMP = TEMP + U(INDEX) IDXTMP = INDEX + 2**(J1-1) IF(TEMP.GT.U(IDXTMP)) THEN U(IDXTMP) = TEMP V(IDXTMP) = J1 END IF END DO GO TO 75 70 CONTINUE C IPERM(N) = V(NSUM) INDEX = NSUM LASTIN = IPERM(N) DO I = 1,N-1 INDEX = INDEX - (2**(LASTIN-1)) LASTIN = V(INDEX) IPERM(N-I) = LASTIN END DO C CALL GETTIM (IHR, IMIN, ISEC, I100) CALL GETDAT (IYR, IMON, IDAY) TIMEB=DFLOAT(86400*IDAY+3600*IHR+60*IMIN+ISEC)+DFLOAT(I100)/100. TIMTOT = TIMEB - TIMEA WRITE(*,80) U(NSUM) WRITE(*,81) TIMTOT WRITE(*,82) (IPERM(I),I=1,N) WRITE(2,80) U(NSUM) WRITE(2,81) TIMTOT WRITE(2,82) (IPERM(I),I=1,N) 80 FORMAT(' OPTIMAL DOMINANCE INDEX ',F15.5) 81 FORMAT(' TOTAL CPU TIME (SECONDS) ',7X,F8.2) 82 FORMAT(30I3) END