C MAIN PROGRAM : PROVIDES TO USE REPULSIVE PARTICLE SWARM METHOD TO C COMPUTE COMPOSITE INDEX INDICES C BY MAXIMIZING SUM OF (SQUARES, OR ABSOLUTES, OR MINIMUM) OF C CORRELATION OF THE INDEX WITH THE CONSTITUENT VARIABLES. THE MAX C SUM OF SQUARES IS THE PRINCIPAL COMPONENT INDEX. IT ALSO PRIVIDES C TO OBTAIN MAXIMUM ENTROPY ABSOLUTE CORRELATION INDICES. 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 RPSINDEX PARAMETER(NOB=30,MVAR=7)!CHANGE THE PARAMETERS HERE AS NEEDED. C ----------------------------------------------------------------- C NOB=NO. OF CASES AND MVAR=NO. OF VARIABLES 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 /CORDAT/CDAT(NOB,MVAR),QIND(NOB),R(MVAR),ENTROPY,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),FRANK(NOB),RMAT(MVAR+1,MVAR+1) DIMENSION X(50)! X IS THE DECISION VARIABLE X IN F(X) TO MINIMIZE C M IS THE DIMENSION OF THE PROBLEM, KF IS 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 ' NOPT=1 ! OPTIMIZATION BY RPS METHOD WRITE(*,*)'=================================================== ' METHOD(1)=' : REPULSIVE PARTICLE SWARM OPTIMIZATION' C INITIALIZATION. THIS XBAS WILL BE USED TO C INITIALIZE THE POPULATION. WRITE(*,*)' ' WRITE(*,*)'FEED RANDOM NUMBER SEED,NORM,ENTROPY,NCOR' WRITE(*,*)'SEED[ANY 4-DIGIT NUMBER]; NORM[1,2,3]; ENTROPY[0,1]; & &NCOR[0,1]' WRITE(*,*)' ' WRITE(*,*)'NORM(1)=ABSOLUTE;NORM(2)=PCA-EUCLIDEAN;NORM(3)=MAXIMIN' WRITE(*,*)'ENTROPY(0)=MAXIMIZES NORM;ENTROPY(1)=MAXIMIZES ENTROPY' WRITE(*,*)'NCOR(0)=PRODUCT MOMENT; NCOR(1)=ABSOLUTE CORRELATION' READ(*,*) IU,NORM,ENTROPY,NCOR 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 ----------------------------------------------------- WRITE(*,*)' ' WRITE(*,*)'FEED RANDOM NUMBER SEED [4-DIGIT ODD INTEGER] TO BEGIN' READ(*,*) IU 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 ------------------------------------------------------------------ C HOWEVER, THE FIRST ROW OF, THAT IS, XBAS(1,J),J=1,MVAR) MAY BE C SPECIFIED HERE IF THE USER KNOWS IT TO BE OPTIMAL OR NEAR-OPTIMAL C DATA (XBAS(1,J),J=1,MVAR) /DATA1, DATA2, ............, DATAMVAR/ C ------------------------------------------------------------------ WRITE(*,*)' *****************************************************' C ------------------------------------------------------------------ DO I=1,NOPT IF(I.EQ.1) THEN WRITE(*,*)'==== WELCOME TO RPS PROGRAM FOR INDEX CONSTRUCTION' 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,*)'PARTICLE SWARM OPTIMIZATION RESULTS' RSUM1=0.D0 RSUM2=0.D0 DO J=1,MVAR RSUM1=RSUM1+DABS(R(J)) RSUM2=RSUM2+DABS(R(J))**2 ENDDO WRITE(9,*)'CORRELATION OF INDEX WITH CONSTITUENT VARIABLES' WRITE(9,*)(R(J),J=1,MVAR) WRITE(9,*)'SUM OF ABS (R)=',RSUM1,'; SUM OF SQUARE(R)=',RSUM2 WRITE(9,*)'THE INDEX OR SCORE OF DIFFERENT CASES' DO II=1,NOB WRITE(9,*)QIND(II) FRANK(II)=QIND(II) ENDDO ENDIF FMIN=FMINRPS ENDIF C ------------------------------------------------------------------ DO J=1,M XX(I,J)=X(J) ENDDO KKF(I)=KF MM(I)=M FMINN(I)=FMIN ENDDO WRITE(*,*)' ' WRITE(*,*)' ' WRITE(*,*)'---------------------- FINAL RESULTS==================' DO I=1,NOPT WRITE(*,*)'FUNCT CODE=',KKF(I),' FMIN=',FMINN(I),' : DIM=',MM(I) WRITE(*,*)'OPTIMAL DECISION VARIABLES : ',METHOD(I) WRITE(*,*) 'WEIGHTS ARE AS FOLLOWS --------------' WRITE(9,*) 'WEIGHTS ARE AS FOLLOWS --------------' WRITE(9,*)(XX(I,J),J=1,M) WRITE(*,*)(XX(I,J),J=1,M) WRITE(*,*)'/////////////////////////////////////////////////////' ENDDO 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(FRANK,NOB) DO I=1,NOB ZDAT(I,1)=FRANK(I) ENDDO IF(NCOR.EQ.0) THEN CALL CORREL(ZDAT,NOB,MVAR+1,RMAT) ELSE CALL DOCORA(ZDAT,NOB,MVAR+1,RMAT) ENDIF WRITE(9,*)'-------------------- CORRELATION MATRIX --------------' WRITE(*,*)'-------------------- CORRELATION MATRIX --------------' DO I=1,MVAR+1 WRITE(9,1)(RMAT(I,J),J=1,MVAR+1) WRITE(*,1)(RMAT(I,J),J=1,MVAR+1) ENDDO 1 FORMAT(8F10.6) WRITE(9,*)'=================================================== ' WRITE(*,*)'=================================================== ' WRITE(9,*)'VARIABLES: 1ST IS THE INDEX AND 2ND THE RANK OF INDEX' WRITE(*,*)'VARIABLES: 1ST IS THE INDEX AND 2ND THE RANK OF INDEX' WRITE(9,*)'=================================================== ' WRITE(*,*)'=================================================== ' DO I=1,NOB IF(MRNK.EQ.1) THEN QIND(I)=0.D0 DO J=1,MVAR QIND(I)=QIND(I)+ZDAT(I,J+1)*XX(NOPT,J) ENDDO ENDIF WRITE(9,2)I,QIND(I),(ZDAT(I,J),J=1,MVAR+1) WRITE(*,2)I,QIND(I),(ZDAT(I,J),J=1,MVAR+1) ENDDO 2 FORMAT(I4,F12.6,9F7.2) SR2=0.D0 IF(NORM.LE.2) THEN DO J=2,MVAR+1 SR2=SR2+DABS(RMAT(1,J))**NORM ENDDO IF(NORM.EQ.2) THEN WRITE(9,*)'SUM OF SQUARE OF CORRELATION R(RANK(INDEX),VAR)=',SR2 WRITE(*,*)'SUM OF SQUARE OF CORRELATION R(RANK(INDEX),VAR)=',SR2 ENDIF IF(NORM.EQ.1) THEN WRITE(9,*)'SUM OF ABSOLUTE OF CORRELATION R(RANK(INDEX),VAR)=',SR2 WRITE(*,*)'SUM OF ABSOLUTE OF CORRELATION R(RANK(INDEX),VAR)=',SR2 ENDIF ELSE ! GIVES MAXIMAL CORRELATION SR2=1.D0 DO J=2,MVAR+1 IF(SR2.GT.DABS(RMAT(1,J))) SR2=DABS(RMAT(1,J)) ENDDO WRITE(9,*)'MAXIMIN CORRELATION R(RANK(INDEX),VAR)=',SR2 WRITE(*,*)'MAXIMIN CORRELATION R(RANK(INDEX),VAR)=',SR2 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=100,NN=30,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 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(<