C !----------------- MAIN PROGRAM : ORDCANON ---------------------- C PROVIDES TO USE REPULSIVE PARTICLE SWARM METHOD TO C OBTAIN THE LARGEST CANONICAL CORRELATION & COMPOSITE VARIATE RANKS C PRODUCT MOMENT AS WELL AS ABSOLUTE CORRELATION (BRADLEY, 1985) MAY C BE USED. PROGRAM BY SK MISHRA, DEPT. OF ECONOMICS, NORTH-EASTERN C HILL UNIVERSITY, SHILLONG (INDIA) C ----------------------------------------------------------------- C ADJUST THE PARAMETERS SUITABLY IN SUBROUTINES RPS C WHEN THE PROGRAM ASKS FOR PARAMETERS, FEED THEM SUITABLY C ----------------------------------------------------------------- PROGRAM ORDCANON PARAMETER(NOB=30,MVAR=9)!CHANGE THE PARAMETERS HERE AS NEEDED. C ----------------------------------------------------------------- C NOB=NO. OF CASES AND MVAR=NO. OF VARIABLES IN ALL M= (M1+M2) C TO BE ADJUSTED IN SUBROUTINE CORD(M,X,F) ALSO: STATEMENT 931 IMPLICIT DOUBLE PRECISION (A-H, O-Z) COMMON /KFF/KF,NFCALL,FTIT ! FUNCTION CODE, NO. OF CALLS & TITLE CHARACTER *30 METHOD(1) CHARACTER *70 FTIT CHARACTER *40 INFILE,OUTFILE COMMON /CANON/MONE,MTWO COMMON /CORDAT/CDAT(NOB,MVAR),QIND1(NOB),QIND2(NOB),R(1),NORM,NCOR COMMON /XBASE/XBAS COMMON /RNDM/IU,IV ! RANDOM NUMBER GENERATION (IU = 4-DIGIT SEED) COMMON /GETRANK/MRNK INTEGER IU,IV DIMENSION XX(3,50),KKF(3),MM(3),FMINN(3),XBAS(1000,50) DIMENSION ZDAT(NOB,MVAR+1),FRANK1(NOB),FRANK2(NOB),RMAT(2,2) DIMENSION X(50)! X IS THE DECISION VARIABLE X IN F(X) TO MINIMIZE C M = DIMENSION OF THE PROBLEM, KF(=1) = TEST FUNCTION CODE AND C FMIN IS THE MIN VALUE OF F(X) OBTAINED FROM RPS WRITE(*,*)'==================== WARNING =============== ' WRITE(*,*)'ADJUST PARAMETERS IN SUBROUTINES RPS IF NEEDED ' C ------------------ OPTIMIZATION BY RPS METHOD ------------------- NORM=2!WORKS WITH THE EUCLIDEAN NORM (IDENTICAL RESULTS IF NORM=1) NOPT=1 ! ONLY ONE FUNCTION IS OPTIMIZED WRITE(*,*)'=================================================== ' METHOD(1)=' : REPULSIVE PARTICLE SWARM OPTIMIZATION' C INITIALIZE. THIS XBAS WILL BE USED TO INITIALIZE THE POPULATION. WRITE(*,*)' ' WRITE(*,*)'---------- FEED RANDOM NUMBER SEED, AND NCOR ---------' WRITE(*,*)' ' WRITE(*,*)'FEED SEED [ANY 4-DIGIT NUMBER] AND NCOR[0,1]' WRITE(*,*)'NCOR(0)=PRODUCT MOMENT; NCOR(1)=ABSOLUTE CORRELATION' WRITE(*,*)' ' 1 READ(*,*) IU,NCOR IF(NCOR.LT.0.OR.NCOR.GT.1) THEN WRITE(*,*)'SORRY. NCOR TAKES ON[0,1] ONLY. FEED SEED & NCOR AGAIN' GOTO 1 ENDIF WRITE(*,*)'WANT RANK SCORE OPTIMIZATION? YES(1); NO(OTHER THAN 1)' READ(*,*) MRNK WRITE(*,*)'INPUT FILE TO READ DATA:YOUR DATA MUST BE IN THIS FILE' WRITE(*,*)'CASES (NOB) IN ROWS ; VARIABLES (MVAR) IN COLUMNS' READ(*,*) INFILE WRITE(*,*)'SPECIFY THE OUTPUT FILE TO STORE THE RESULTS' READ(*,*) OUTFILE OPEN(9, FILE=OUTFILE) OPEN(7,FILE=INFILE) DO I=1,NOB READ(7,*),CDA,(CDAT(I,J),J=1,MVAR) ENDDO CLOSE(7) DO I=1,NOB DO J=1,MVAR ZDAT(I,J+1)=CDAT(I,J) ENDDO ENDDO WRITE(*,*)'DATA HAS BEEN READ. WOULD YOU UNITIZE VARIABLES? [YES=1 & ELSE NO UNITIZATION]' WRITE(*,*)'UNITIZE MEANS TRANSFORMATION FROM X(I,J) TO UNITIZED X' WRITE(*,*)'[X(I,J)-MIN(X(.,J))]/[MAX(X(.,J))-MIN(X(.,J))]' READ(*,*) NUN IF(NUN.EQ.1) THEN DO J=1,MVAR CMIN=CDAT(1,J) CMAX=CDAT(1,J) DO I=2,NOB IF(CMIN.GT.CDAT(I,J)) CMIN=CDAT(I,J) IF(CMAX.LT.CDAT(I,J)) CMAX=CDAT(I,J) ENDDO DO I=1,NOB CDAT(I,J)=(CDAT(I,J)-CMIN)/(CMAX-CMIN) ENDDO ENDDO ENDIF C ------------------------------------------------------------------ C THIS XBAS WILL BE USED AS INITIAL X DO I=1,1000 DO J=1,50 CALL RANDOM(RAND) XBAS(I,J)=RAND ! RANDOM NUMBER BETWEEN (0, 1) ENDDO ENDDO C ------------------------------------------------------------------ WRITE(*,*)' *****************************************************' C ------------------------------------------------------------------ K=1 WRITE(*,*)'PARTICLE SWARM PROGRAM TO OBTAIN CANONICAL CORRELATION' CALL RPS(M,X,FMINRPS,Q1) !CALLS RPS AND RETURNS OPTIMAL X AND FMIN WRITE(*,*)'RPS BRINGS THE FOLLOWING VALUES TO THE MAIN PROGRAM' WRITE(*,*)(X(JOPT),JOPT=1,M),' OPTIMUM FUNCTION=',FMINRPS IF(KF.EQ.1) THEN WRITE(9,*)'REPULSIVE PARTICLE SWARM OPTIMIZATION RESULTS' WRITE(9,*)'THE LARGEST CANONICAL R BETWEEN THE SETS OF VARIABLES' WRITE(9,*)' ABS(R)=',DABS(R(1)),'; SQUARE(R)=',R(1)**2 IF(NCOR.EQ.0) THEN WRITE(*,*)'NOTE: THESE ARE KARL PEARSON TYPE CORRELATION (NCOR=0)' WRITE(9,*)'NOTE: THESE ARE KARL PEARSON TYPE CORRELATION (NCOR=0)' ELSE WRITE(*,*)'NOTE: THESE ARE BRADLEY TYPE CORRELATION (NCOR=1)' WRITE(9,*)'NOTE: THESE ARE BRADLEY TYPE CORRELATION (NCOR=1)' ENDIF WRITE(*,*)'______________________________________________________' WRITE(9,*)'______________________________________________________' DO II=1,NOB FRANK1(II)=QIND1(II) FRANK2(II)=QIND2(II) ENDDO ENDIF FMIN=FMINRPS C ------------------------------------------------------------------ DO J=1,M XX(K,J)=X(J) ENDDO KKF(K)=KF MM(K)=M FMINN(K)=FMIN WRITE(*,*)' ' WRITE(*,*)' ' WRITE(*,*)'---------------------- FINAL RESULTS==================' WRITE(*,*)'FUNCT CODE=',KKF(K),' FMIN=',FMINN(K),' : DIM=',MM(K) WRITE(*,*)'OPTIMAL DECISION VARIABLES : ',METHOD(K) WRITE(*,*)'FOR THE FIRST SET OF VARIABLES WEIGHTS ARE AS FOLLOWS' WRITE(9,*)'FOR THE FIRST SET OF VARIABLES WEIGHTS ARE AS FOLLOWS' WRITE(9,*)(XX(K,J),J=1,MONE) WRITE(*,*)(XX(K,J),J=1,MONE) WRITE(*,*)'FOR THE SECOND SET OF VARIABLES WEIGHTS ARE AS FOLLOWS' WRITE(9,*)'FOR THE SECOND SET OF VARIABLES WEIGHTS ARE AS FOLLOWS' WRITE(9,*)(XX(K,J),J=MONE+1,M) WRITE(*,*)(XX(K,J),J=MONE+1,M) WRITE(*,*)'/////////////////////////////////////////////////////' WRITE(*,*)'OPTIMIZATION PROGRAM ENDED' WRITE(*,*)'******************************************************' WRITE(*,*)'MEASURE OF EQUALITY/INEQUALITY' WRITE(*,*)'RPS: BEFORE AND AFTER OPTIMIZATION = ',Q0,Q1 WRITE(*,*)' ' WRITE(*,*)'RESULTS STORED IN FILE= ',OUTFILE WRITE(*,*)'OPEN BY MSWORD OR EDIT OR ANY OTHER EDITOR' WRITE(*,*)' ' WRITE(*,*)'NOTE:VECTORS OF CORRELATIONS & INDEX(BOTH TOGETHER) ARE & IDETERMINATE FOR SIGN & MAY BE MULTIPLED BY (-1) IF NEEDED' WRITE(*,*)'THAT IS IF R(J) IS TRANSFORMED TO -R(J) FOR ALL J THEN &THE INDEX(I) TOO IS TRANSFORMED TO -INDEX(I) FOR ALL I' WRITE(9,*)' ' WRITE(9,*)'NOTE: VECTORS OF CORRELATIONS AND INDEX (BOTH TOGETHER) & ARE IDETERMINATE FOR SIGN AND MAY BE MULTIPLED BY (-1) IF NEEDED' WRITE(9,*)'THAT IS IF R(J) IS TRANSFORMED TO -R(J) FOR ALL J THEN &THE INDEX(I) TOO IS TRANSFORMED TO -INDEX(I) FOR ALL I' CALL DORANK(FRANK1,NOB) CALL DORANK(FRANK2,NOB) DO I=1,NOB ZDAT(I,1)=FRANK1(I) ZDAT(I,2)=FRANK2(I) ENDDO IF(NCOR.EQ.0) THEN CALL CORREL(ZDAT,NOB,2,RMAT) ELSE CALL DOCORA(ZDAT,NOB,2,RMAT) ENDIF WRITE(9,*)'=================================================== ' WRITE(*,*)'=================================================== ' WRITE(9,*)'1ST 2 ARE CANONICAL SCORES AND LAST 2 ARE THEIR RANK' WRITE(*,*)'1ST 2 ARE CANONICAL SCORES AND LAST 2 ARE THEIR RANK' WRITE(9,*)'=================================================== ' WRITE(*,*)'=================================================== ' DO I=1,NOB IF(MRNK.EQ.1) THEN QIND1(I)=0.D0 QIND2(I)=0.D0 DO J=1,MONE QIND1(I)=QIND1(I)+ZDAT(I,J+1)*XX(NOPT,J) ENDDO DO J=MONE+1,MVAR QIND2(I)=QIND2(I)+ZDAT(I,J+1)*XX(NOPT,J) ENDDO ENDIF WRITE(9,2)I,QIND1(I),QIND2(I),(ZDAT(I,J),J=1,2) WRITE(*,2)I,QIND1(I),QIND2(I),(ZDAT(I,J),J=1,2) ENDDO 2 FORMAT(I5,2F15.6,2F10.3) WRITE(9,*)'SQUARE OF CANONICAL CORRELATION =',RMAT(1,2)**2 WRITE(*,*)'SQUARE OF CANONICAL CORRELATION =',RMAT(1,2)**2 WRITE(9,*)'ABSOLUTE OF CANONICAL CORRELATION =',DABS(RMAT(1,2)) WRITE(*,*)'ABSOLUTE OF CANONICAL CORRELATION =',DABS(RMAT(1,2)) IF(NCOR.EQ.0) THEN WRITE(*,*)'NOTE: THESE ARE KARL PEARSON TYPE CORRELATION (NCOR=0)' WRITE(9,*)'NOTE: THESE ARE KARL PEARSON TYPE CORRELATION (NCOR=0)' ELSE WRITE(*,*)'NOTE: THESE ARE BRADLEY TYPE CORRELATION (NCOR=1)' WRITE(9,*)'NOTE: THESE ARE BRADLEY TYPE CORRELATION (NCOR=1)' ENDIF CLOSE(9) WRITE(*,*) 'THE JOB IS OVER' END C ----------------------------------------------------------------- SUBROUTINE RPS(M,ABEST,FBEST,G1) C PROGRAM TO FIND GLOBAL MINIMUM BY REPULSIVE PARTICLE SWARM METHOD C WRITTEN BY SK MISHRA, DEPT. OF ECONOMICS, NEHU, SHILLONG (INDIA) C ----------------------------------------------------------------- PARAMETER (N=50,NN=10,MX=100,NSTEP=7,ITRN=10000,NSIGMA=1,ITOP=1) PARAMETER (NPRN=50) ! DISPLAYS 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,FTIT INTEGER IU,IV CHARACTER *70 FTIT DIMENSION X(N,MX),V(N,MX),A(MX),VI(MX),TIT(50),ABEST(*) DIMENSION XX(N,MX),F(N),V1(MX),V2(MX),V3(MX),V4(MX),BST(MX) 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 /.5D00,.5D00,.0005D00,.5D00,1.D-03/ EPSILON=1.D-12 ! ACCURACY NEEDED FOR TERMINATON C --------------------CHOOSING THE TEST FUNCTION ------------------' CALL FSELECT(KF,M,FTIT) C ----------------------------------------------------------------- FFMIN=1.D30 LCOUNT=0 NFCALL=0 WRITE(*,*)'4-DIGITS SEED FOR RANDOM NUMBER GENERATION' READ(*,*) IU DATA 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 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 WRITE(*,*)'ITERATION=',ITER 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(<