C ================================================================= C PROGRAM FOR COMPUTING NEAREST CORRELATION MATRIX BY REPULSIVE C PARTICLE SWARM METHOD OF GLOBAL OPTIMIZATION WRITTEN BY: C PROF. SK MISHRA, DEPARTMENT OF ECONOMICS, NEHU, SHILLONG INDIA C APRIL 2007 : AVAILABLE AT: C http//www.webng.com/economics C AND C http://freewebs.com/nehu_economics C ================================================================= PARAMETER (MX=10)! PRESENTLY SET AT 10. ONE MAY CHANGE IT. C ACCORDINGLY IT HAS TO BE CHANGED IN OTHER SUBROUTINES ALSO. IMPLICIT DOUBLE PRECISION (A-H,O-Z) COMMON /RNDM/IU,IV COMMON /KFF/KF,NFCALL,Q COMMON /EIGENS/VO(MX,MX),WO(MX,MX),WEIGHT(MX,MX),PPROD,PROD,NORM CHARACTER *70 FTIT,INFIL,INWFIL,OUTFIL DIMENSION Q(MX,MX),QQ(MX,MX),V(MX,MX),W(MX,MX),P(MX),R(MX,MX) CALL FSELECT(KF,M,FTIT) C READ THE Q (INVALID CORRELATION MATRIX) FROM INPUT FILE WRITE(*,*)'FILE THAT STORES Q (INVALID CORRELATION MATRIX) ?' READ(*,*) INFIL OPEN(7,FILE=INFIL) DO I=1,M READ(7,*) (Q(I,J),J=1,M) ! Q IS THE INVALID CORRELATION MATRIX DO J=1,M QQ(I,J)=Q(I,J) ! Q IS STORED IN QQ TO PRESERVE THE ORIGINAL MATRIX ENDDO ENDDO CLOSE(7) WRITE(*,*)'ANY WEIGHT MATRIX ? YES (1/ NON-ZERO), NO (0)' READ(*,*) NW IF(NW.NE.0) THEN WRITE(*,*)'FILE IN WHICH WEIGHT MATRIX HAS BEEN STORED ?' READ(*,*) INWFIL OPEN(7, FILE=INWFIL) DO I=1,M READ(7,*)(WEIGHT(I,J),J=1,M) ENDDO CLOSE(7) ELSE DO I=1,M DO J=1,M WEIGHT(I,J)=1.D0 ENDDO ENDDO ENDIF WRITE(*,*)'CHOOSE THE NORM [ABS(1),FROBENIUS(2),CHEBYSHEV(=>99)]?' READ(*,*) NORM WRITE(*,*)'CHOOSE A SMALL(SUGGESTED 0.01)GUARD DETERMINANT[>ZERO]' WRITE(*,*)'[THIS GUARD DOES NOT ALLOW THE RESULTING NEAREST MATRIX & TO BECOME NEARSINGULAR]' READ(*,*) PPROD WRITE(*,*) 'GIVE AN OUTPUT FILE NAME TO STORE RESULTS' READ(*,*) OUTFIL OPEN(11,FILE=OUTFIL)! OPENS OUTPUT FILE C FIND EIGENVALUES AND EIGENVECTORS OF Q MATRIX CALL EIGEN(Q,VO,WO,M) C----------------------------------------------------------------------- WRITE(*,*)'ORIGINAL MATRIX' WRITE(11,*)'ORIGINAL MATRIX' DO I=1,M WRITE(*,1)(Q(I,J),J=1,M) WRITE(11,1)(Q(I,J),J=1,M) ENDDO 1 FORMAT(15F8.4) ! OUTPUT FORMAT. ONE MAY CHANGE IT AS NEEDED. WRITE(*,*)'EIGENVALUES' WRITE(11,*)'EIGENVALUES' DO I=1,M WRITE(*,2)(WO(I,J),J=1,M) WRITE(11,2)(WO(I,J),J=1,M) ENDDO 2 FORMAT(10F12.7)! OUTPUT FORMAT. ONE MAY CHANGE IT AS NEEDED. C----------------------------------------------------------------------- C CHECK IF ANY EIGENVALUE IS NEGATIVE LNEG=0 DO I=1,M IF(WO(I,I).LT.0) LNEG=1 ! IF ANY EIGENVALUE NEGETIVE LNEG=1 ENDDO IF(LNEG.EQ.1) THEN CALL RPS(M,P,FMIN,FTIT)! P IS THE VECTOR OF EIGENVALUES ENDIF CALL EIGEN(QQ,V,W,M) C----------------------------------------------------------------------- LNEG=0 DO I=1,M IF(W(I,I).LT.0) LNEG=1 ENDDO DO I=1,M W(I,I)=P(I) ENDDO DO J=1,M DO JJ=1,M R(J,JJ)=0.0 DO I=1,M R(J,JJ)=R(J,JJ)+V(J,I)*W(I,JJ) ENDDO ENDDO ENDDO DO J=1,M DO JJ=1,M W(J,JJ)=0.0 DO I=1,M W(J,JJ)=W(J,JJ)+R(J,I)*V(JJ,I) ENDDO ENDDO ENDDO DO I=1,M DO J=1,M R(I,J)=W(I,J) ENDDO R(I,I)=1.0 ENDDO CALL EIGEN(R,V,W,M) F=0 DO I=1,M DO J=1,M DIF=DABS(Q(I,J)-R(I,J)) IF(NORM.LT.99) THEN F=F+WEIGHT(I,J)*DIF**NORM ELSE IF(DIF*WEIGHT(I,J).GT.F) F=DIF*WEIGHT(I,J) ENDIF ENDDO ENDDO IF(LNEG.NE.0) THEN WRITE(*,*)' ' WRITE(*,*)'-----------------------------------------------------' WRITE(*,*)'ESTIMATED MATRIX ------------------------------------' WRITE(*,*)' ' WRITE(11,*)' ' WRITE(11,*)'-----------------------------------------------------' WRITE(11,*)'ESTIMATED MATRIX ------------------------------------' WRITE(11,*)' ' DO I=1,M WRITE(*,3)(R(I,J),J=1,M) WRITE(11,3)(R(I,J),J=1,M) ENDDO 3 FORMAT(12F12.8) ! OUTPUT FORMAT. ONE MAY CHANGE IT AS NEEDED. WRITE(*,*)' ' WRITE(*,*)'MIN NORM WITH PENALTIES (NOT TO BE INTERPRETED)=',F WRITE(11,*)' ' WRITE(11,*)'MIN NORM WITH PENALTIES (NOT TO BE INTERPRETED)=',F SUM=0 DET=1.D0 DO I=1,M SUM=SUM+W(I,I) DET=DET*W(I,I) ENDDO WRITE(*,*)' ' WRITE(*,*)'EIGENVALUES' WRITE(*,2)(W(I,I),I=1,M) WRITE(*,*)' ' WRITE(11,*)' ' WRITE(11,*)'EIGENVALUES' WRITE(11,2)(W(I,I),I=1,M) WRITE(11,*)' ' WRITE(*,*)'SUM AND PRODUCT OF EIGENVALUES=',SUM,DET WRITE(11,*)'SUM AND PRODUCT OF EIGENVALUES=',SUM,DET ENDIF IF(LNEG.EQ.0) THEN WRITE(*,*)'THE GIVEN MATRIX IS VALID (POSITIVE SEMI-DEFINITE).' WRITE(11,*)'THE GIVEN MATRIX IS VALID (POSITIVE SEMI-DEFINITE).' ELSE WRITE(*,*)'THE RESULT MATRIX IS VALID (POSITIVE SEMI-DEFINITE).' WRITE(11,*)'THE RESULT MATRIX IS VALID (POSITIVE SEMI-DEFINITE).' ENDIF CLOSE(11) END C ----------------------------------------------------------------- SUBROUTINE FUNC(X,M,F) C FINDING THE NEAREST CORRELATION MATRIX BY DIFFERENTIAL C EVOLUTION METHOD OF GLOBAL OPTIMIZATION WRITTEN BY C PROF. SK MISHRA, DEPARTMENT OF ECONOMICS, NEHU, SHILLONG INDIA PARAMETER (MX=10)! PRESENTLY SET AT 10. ONE MAY CHANGE IT. C ACCORDINGLY IT HAS TO BE CHANGED IN MAIN/OTHER SUBROUTINES ALSO. C THIS SUBROUTNE IS USED BY THE GLOBAL OPTIMIZATION PROGRAM IMPLICIT DOUBLE PRECISION (A-H,O-Z) COMMON /RNDM/IU,IV COMMON /KFF/KF,NFCALL,Q COMMON /EIGENS/VO(MX,MX),WO(MX,MX),WEIGHT(MX,MX),PPROD,PROD,NORM DIMENSION X(*),Q(MX,MX),W(MX,MX),V(MX,MX),R(MX,MX) NFCALL=NFCALL+1 ! INCREMENT TO NUMBER OF FUNCTION CALLS C KF IS THE CODE OF THE TEST FUNCTION C ----------------------------------------------------------------- LNEG=0 DO I=1,M IF(WO(I,I).LT.0) LNEG=1 ENDDO IF(LNEG.EQ.1) THEN SUM=0 PROD=1.D0 DO I=1,M IF(X(I).LT.0) THEN CALL RANDOM(RAND) X(I)=RAND ENDIF SUM=SUM+X(I) PROD=PROD*X(I) ENDDO DO I=1,M X(I)=X(I)*M/SUM ENDDO DO I=1,M W(I,I)=X(I) ENDDO DO J=1,M DO JJ=1,M R(J,JJ)=0.0 DO I=1,M R(J,JJ)=R(J,JJ)+VO(J,I)*W(I,JJ) ENDDO ENDDO ENDDO DO J=1,M DO JJ=1,M W(J,JJ)=0.0 DO I=1,M W(J,JJ)=W(J,JJ)+R(J,I)*VO(JJ,I) ENDDO ENDDO ENDDO DO I=1,M DO J=1,M R(I,J)=W(I,J) ENDDO R(I,I)=1.0 ENDDO CALL EIGEN(R,V,W,M) PF=0 SUM=0 DO I=1,M SUM=SUM+W(I,I) IF(W(I,I).LT.0) PF=PF+100+(100*(1-W(I,I)))**2 ENDDO F=0 DO I=1,M F=F+100*(1.D0-R(I,I))**2 ENDDO FN=0.0 FX=0 DO I=1,M-1 DO J=I+1,M DIF=DABS(Q(I,J)-R(I,J)) WDIF=DIF*WEIGHT(I,J) IF(WDIF.GT.FX) FX=WDIF IF(NORM.LT.99)FN=FN+WEIGHT(I,J)*DIF**NORM ENDDO ENDDO FNN=2*FN FN=0 DO I=1,M DIF=DABS(Q(I,I)-R(I,I)) WDIF=DIF*WEIGHT(I,I) IF(WDIF.GT.FX) FX=WDIF IF(NORM.LT.99)FN=FN+WEIGHT(I,I)*DIF**NORM ENDDO IF(NORM.LT.99) THEN F=F+FNN+FN+PF+DABS(SUM-M)*100 ELSE F=F+FX+PF+DABS(SUM-M)*100 ENDIF ENDIF IF(PROD.LT.PPROD) F=F+(1000*(PPROD-PROD))**2 RETURN END C ================================================================= C ============== REPULSIVE PARTICLE SWARM METHOD ================ SUBROUTINE RPS(M,BST,FMINIM,FTIT) C PROGRAM TO FIND GLOBAL MINIMUM BY REPULSIVE PARTICLE SWARM METHOD C WRITTEN BY SK MISHRA, DEPT. OF ECONOMICS, NEHU, SHILLONG (INDIA) C ----------------------------------------------------------------- PARAMETER (MZ=10)! THIS CORRESPONDS TO MX IN THE MAIN PROGRAM C NOT TO BE CONFUSED WITH THE MX THAT APPEARS IN THE PARAMETER BELOW C PRESENTLY SET AT 10. ONE MAY CHANGE IT. C ACCORDINGLY IT HAS TO BE CHANGED IN MAIN/OTHER SUBROUTINES ALSO. C ----------------------------------------------------------------- PARAMETER (N=100,NN=50,MX=50,NSTEP=11,ITRN=10000,NSIGMA=1,ITOP=3) PARAMETER (NPRN=500) ! ECHOS RESULTS AT EVERY 500 TH ITERATION C PARAMETER(N=50,NN=25,MX=100,NSTEP=9,ITRN=10000,NSIGMA=1,ITOP=3) C PARAMETER (N=100,NN=15,MX=100,NSTEP=9,ITRN=10000,NSIGMA=1,ITOP=3) C IN CERTAIN CASES THE ONE OR THE OTHER SPECIFICATION WORKS BETTER C DIFFERENT SPECIFICATIONS OF PARAMETERS MAY SUIT DIFFERENT TYPES C OF FUNCTIONS OR DIMENSIONS - ONE HAS TO DO SOME TRIAL AND ERROR C ----------------------------------------------------------------- C N = POPULATION SIZE. IN MOST OF THE CASES N=30 IS OK. ITS VALUE C MAY BE INCREASED TO 50 OR 100 TOO. THE PARAMETER NN IS THE SIZE OF C RANDOMLY CHOSEN NEIGHBOURS. 15 TO 25 (BUT SUFFICIENTLY LESS THAN C N) IS A GOOD CHOICE. MX IS THE MAXIMAL SIZE OF DECISION VARIABLES. C IN F(X1, X2,...,XM) M SHOULD BE LESS THAN OR EQUAL TO MX. ITRN IS C THE NO. OF ITERATIONS. IT MAY DEPEND ON THE PROBLEM. 200(AT LEAST) C TO 500 ITERATIONS MAY BE GOOD ENOUGH. BUT FOR FUNCTIONS LIKE C ROSENBROCKOR GRIEWANK OF LARGE SIZE (SAY M=30) IT IS NEEDED THAT C ITRN IS LARGE, SAY 5000 OR EVEN 10000. C SIGMA INTRODUCES PERTURBATION & HELPS THE SEARCH JUMP OUT OF LOCAL C OPTIMA. FOR EXAMPLE : RASTRIGIN FUNCTION OF DMENSION 3O OR LARGER C NSTEP DOES LOCAL SEARCH BY TUNNELLING AND WORKS WELL BETWEEN 5 AND C 15, WHICH IS MUCH ON THE HIGHER SIDE. C ITOP <=1 (RING); ITOP=2 (RING AND RANDOM); ITOP=>3 (RANDOM) C NSIGMA=0 (NO CHAOTIC PERTURBATION);NSIGMA=1 (CHAOTIC PERTURBATION) C NOTE THAT NSIGMA=1 NEED NOT ALWAYS WORK BETTER (OR WORSE) C SUBROUTINE FUNC( ) DEFINES OR CALLS THE FUNCTION TO BE OPTIMIZED. IMPLICIT DOUBLE PRECISION (A-H,O-Z) COMMON /RNDM/IU,IV COMMON /KFF/KF,NFCALL,Q COMMON /EIGENS/VO(MZ,MZ),WO(MZ,MZ),WEIGHT(MZ,MZ),PPROD,PROD,NORM INTEGER IU,IV CHARACTER *70 FTIT DIMENSION X(N,MX),V(N,MX),A(MX),VI(MX),Q(MZ,MZ) DIMENSION XX(N,MX),F(N),V1(MX),V2(MX),V3(MX),V4(MX),BST(MZ) C A1 A2 AND A3 ARE CONSTANTS AND W IS THE INERTIA WEIGHT. C OCCASIONALLY, TINKERING WITH THESE VALUES, ESPECIALLY A3, MAY BE C NEEDED. DATA A1,A2,A3,W,SIGMA,EPSI /.5D0,.5D0,5.D-04,.5D00,1.D-03,1.D-08/ C ----------------------------------------------------------------- C ----------------------------------------------------------------- GGBEST=1.D30 ! TO BE USED FOR TERMINATION CRITERION LCOUNT=0 NFCALL=0 WRITE(*,*)'4-DIGITS SEED FOR RANDOM NUMBER GENERATION' WRITE(*,*)'A FOUR-DIGIT POSITIVE ODD INTEGER, SAY, 1171' READ(*,*) IU FMIN=1.0E30 C GENERATE N-SIZE POPULATION OF M-TUPLE PARAMETERS X(I,J) RANDOMLY DO I=1,N DO J=1,M CALL RANDOM(RAND) X(I,J)=(RAND-0.5D00)*2000 C WE GENERATE RANDOM(-5,5). HERE MULTIPLIER IS 10. TINKERING IN SOME C CASES MAY BE NEEDED ENDDO F(I)=1.0D30 ENDDO C INITIALISE VELOCITIES V(I) FOR EACH INDIVIDUAL IN THE POPULATION DO I=1,N DO J=1,M CALL RANDOM(RAND) V(I,J)=(RAND-0.5D+00) C V(I,J)=RAND ENDDO ENDDO DO 100 ITER=1,ITRN C LET EACH INDIVIDUAL SEARCH FOR THE BEST IN ITS NEIGHBOURHOOD DO I=1,N DO J=1,M A(J)=X(I,J) VI(J)=V(I,J) ENDDO CALL LSRCH(A,M,VI,NSTEP,FI) IF(FI.LT.F(I)) THEN F(I)=FI DO IN=1,M BST(IN)=A(IN) ENDDO C F(I) CONTAINS THE LOCAL BEST VALUE OF FUNCTION FOR ITH INDIVIDUAL C XX(I,J) IS THE M-TUPLE VALUE OF X ASSOCIATED WITH LOCAL BEST F(I) DO J=1,M XX(I,J)=A(J) ENDDO ENDIF ENDDO C NOW LET EVERY INDIVIDUAL RANDOMLY COSULT NN(<