C======================================================================C C C C CLASSIFICATION ASCENDANTE HIERARCHIQUE C C -------------------------------------- C C C C EN ENTREE : C C N : DIMENSION DE SNN ET DE Y C C SNN ( N , N ) : MATRICE DES SIMILARITES SYMETRIQUE C C ( MODIFIEE , PUIS RESTAUREE ) C C C C EN SORTIE : C C Y ( N , N ) : PARTITION DES INDIVIDUS C C K : NOMBRE DE CLASSES ( 1 A N ) C C Z : DEMI-COUT DE LA PARTITION C C BORNTH : BORNE SUPERIEURE THEORIQUE DE Z C C C C ATTENTION : C C LA DIAGONALE DE Y CONTIENDRA LES NUMEROS DES CLASSES C C LA DIAGONALE DE SNN N'INTERVIENT JAMAIS DANS LE COUT C C C C======================================================================C C SUBROUTINE PNKCAH ( N , SNN , Y , K , Z , BORNTH ) C IMPLICIT INTEGER ( A - Z ) C C REAL SNN ( N , N ) , DSUP , DIJ , Z , BORNTH REAL SNN ( * ) , DSUP , DIJ , Z , BORNTH C C INTEGER Y ( N , N ) INTEGER Y ( * ) C C C INITIALISATION DE LA PARTITION : 1 CLASSE PAR INDIVIDU C CHAQUE CLASSE EST NUMEROTEE DE 1 A N SUR LA DIAGONALE . C ------------------------------------------------------ C DO I = 1 , N DO J = 1 , I-1 Y ( I + (J-1)*N ) = 0 END DO Y ( I + (I-1)*N ) = I END DO C K = N C C C CLASSIFICATION ASCENDANTE HIERARCHIQUE ( COUT < (N*N*N-N)/6 ) C REGROUPEMENT DES 2 CLASSES AYANT LA PLUS GRANDE SIMILARITE ; C ON S'ARRETE LORSQUE TOUTES LES SIMILARITES SNN(I,J) SONT < 0. C -------------------------------------------------------------- C 20 DSUP = -1. I1 = 0 I2 = 0 C DO I = 1 , N C C ON N'EXAMINE QUE LES CLASSES "ACTIVES" : LES AUTRES C LIGNES CORRESPONDENT AUX CLASSES DEJA REGROUPEES C IF ( Y(I+(I-1)*N) .GT. 0 ) THEN C DO J = I+1 , N C C ON N'EXAMINE QUE LES CLASSES "ACTIVES" : LES AUTRES C COLONNES CORRESPONDENT AUX CLASSES DEJA REGROUPEES C IF ( Y(J+(J-1)*N) .GT. 0 ) THEN C DIJ = SNN ( I + (J-1)*N ) C IF ( DIJ.GE.0. .AND. DIJ.GT.DSUP ) THEN C --------- -- C ON REGROUPE EGALEMENT SI DIJ = 0. C I1 = I I2 = J DSUP = DIJ C ENDIF C ENDIF C END DO C ENDIF C END DO C C C TOUTES LES SIMILARITES SONT NEGATIVES : FIN DE L'ALGORITHME C LES NUMEROS DES CLASSES SUR LA DIAGONALE SERONT CONSECUTIFS C ( AVEC CALCUL DU DEMI-COUT HORS DIAGONALE DE LA PARTITION ) C ( MISE A JOUR DES TRIANGULAIRES SUPERIEURES DE Y ET SNN ) C ----------------------------------------------------------- C IF ( I1 .EQ. 0 ) THEN C DO I = 1 , N II = I + (I-1)*N Y(II) = IABS ( Y(II) ) END DO C K0 = 1 DO NCL = 1 , N EFF = 0 DO I = 1 , N II = I + (I-1)*N IF ( Y(II) .EQ. NCL ) THEN Y(II) = K0 EFF = EFF + 1 ENDIF END DO IF ( EFF .NE. 0 ) K0 = K0 + 1 END DO C Z = 0. BORNTH = 0. DO I = 1 , N DO J = 1 , I-1 IJ = I + (J-1) * N JI = J + (I-1) * N SNN (JI) = SNN (IJ) Y (JI) = Y (IJ) Z = Z + Y(IJ) * SNN(IJ) IF ( SNN(IJ) .GT. 0. ) BORNTH = BORNTH + SNN(IJ) END DO END DO C RETURN C ENDIF C C C I1 ET I2 ( I2 > I1 ) SONT LES PLUS PROCHES : ON LES REGROUPE C ------------------------------------------------------------ C LE NOMBRE DE CLASSES DIMINUE DE 1 . C C LE NUMERO DE LA CLASSE DE I1 EST AFFECTE EN NEGATIF A I2 , C AINSI QU'AUX INDIVIDUS DE LA CLASSE DE I2 . C C L'ELEMENT ( I1 , I2 ) DE LA MATRICE DE PARTITION VAUT 1 , C AINSI QUE LES ELEMENTS ( E , I1 ) ET ( E , I2 ) TELS QUE C E SOIT CLASSE , SOIT AVEC I1 , SOIT AVEC I2 . C C K = K - 1 C NEWCLA = - Y ( I1 + (I1-1)*N ) ANCCLA = Y ( I2 + (I2-1)*N ) C DO I = 1 , N II = I + (I-1)*N IF ( Y(II) .EQ. ANCCLA .OR. . Y(II) .EQ. -ANCCLA ) Y(II) = NEWCLA END DO C DO I = 1 , N II = I + (I-1)*N IF ( Y(II) .EQ. NEWCLA .OR. . Y(II) .EQ. -NEWCLA ) THEN DO J = 1 , I-1 JJ = J + (J-1)*N IF ( Y(JJ) .EQ. NEWCLA .OR. . Y(JJ) .EQ. -NEWCLA ) Y ( I + (J-1)*N ) = 1 END DO ENDIF END DO C C C LES SIMILARITES DES AUTRES GROUPES AVEC I1 SONT RECALCULEES C DANS CE CAS PARTICULIER , LES SIMILARITES VERIFIENT : C SNN ( E , I1 U I2 ) = SNN ( E , I1 ) + SNN ( E , I2 ) C ----------------------------------------------------------- C DO E = 1 , I1-1 SNN ( E+(I1-1)*N ) = SNN ( E+(I1-1)*N ) + SNN ( E+(I2-1)*N ) END DO C DO E = I1+1 , I2-1 SNN ( I1+(E-1)*N ) = SNN ( I1+(E-1)*N ) + SNN ( E+(I2-1)*N ) END DO C DO E = I2+1 , N SNN ( I1+(E-1)*N ) = SNN ( I1+(E-1)*N ) + SNN ( I2+(E-1)*N ) END DO C C C ON RELANCE L'ALGORITHME C ----------------------- GOTO 20 C END C======================================================================C C C C ALGORITHME DE CLASSIFICATION : FAURE ET MALGRANGE BOOLEEN C C --------------------------------------------------------- C C C C EN ENTREE : C C UECR : UNITE D'ECRITURE DES RESULTATS C C FMBVR : = .TRUE. POUR LA SOLUTION EXACTE C C = .FALSE. POUR S'ARRETER A LA CAH C C TRIABS : = .TRUE. : TRI INITIAL VAL. ABSOLUE C C = .FALSE. : TRI INITIAL ALGEBRIQUE C C ALLSOL : = .TRUE. POUR TOUTES LES SOLUTIONS C C = .FALSE. POUR UNE SEULE SOLUTION C C N : NOMBRE D'INDIVIDUS C C COUTS (N,N) : MATRICE DES COUTS ( SIGNES ) C C C C EN SORTIE : C C YSAVE (N,N) : SAUVEGARDE DE LA SOLUTION C C Y (N,N) : MATRICE DE PARTITION FINALE C C RENUM (N,N) : ADRESSE DES COUTS DES VARIABLES C C BORNTH : MAJORANT DU COUT DES PARTITIONS C C NBCL0 : NOMBRE DE CLASSES INITIAL C C Z0 : COUT DE LA PARTITION INITIALE C C NBCL : NOMBRE DE CLASSES FINAL C C Z : COUT DE LA PARTITION FINALE C C NBEMP : NOMBRE D'EMPILEMENTS C C NBDEP : NOMBRE DE DEPILEMENTS C C NBSOL : NOMBRE DE SOLUTIONS OPTIMALES C C SAUVEGARDEES APRES LA CAH C C C C ATTENTION : C C LA TRIANGULAIRE INFERIEURE DE RENUM CONTIENT LES C C ADRESSES DES COUTS DES M=N*(N-1)/2 VARIABLES DANS C C LA MATRICE DES COUTS C C C C LA TRIANGULAIRE SUPERIEURE DE RENUM CONTIENT LES C C ADRESSES RECIPROQUES DE CELLES DE LA TRIANGULAIRE C C INFERIEURE . C C C C LA TRIANGULAIRE INFERIEURE DE Y CONTIENT LES C C VALEURS 0 OU 1 CHOISIES POUR CHACUNE DES M C C VARIABLES , OU -1 SI LA VARIABLE N'EST PAS FIXEE . C C C C LA TRIANGULAIRE SUPERIEURE DE Y CONTIENT L' C C ADRESSE DE LA VARIABLE PRECEDEMMENT FIXEE , OU 0 C C POUR LA 1-ERE CHOISIE ; CE NUMERO EST NEGATIF SI C C LA VARIABLE EST CHOISIE PAR IMPLICATION . C C C C LA DIAGONALE DE Y CONTIENDRA LES NUMEROS DES CLASSES C C LA DIAGONALE DE YSAVE AUSSI C C C C LES ARGUMENTS COUTS ET YSAVE PEUVENT AVOIR LA MEME C C ADRESSE , A CONDITION QUE LES DECLARATIONS "REAL" C C ET "INTEGER" SUPPOSENT LE MEME NOMBRE DE MOTS : C C LES COUTS SONT DANS LA TRIANGULAIRE SUPERIEURE , C C LA SAUVEGARDE DANS LA TRIANGULAIRE INFERIEURE . C C C C======================================================================C C C FONCTION D'ADRESSAGE : C ---------------------------------------------------------------- C $ , 1 , 2 , 3 , . . . . . , N-1 C 1 , $ , N , N+1 , , 2*N-3 C 2 , 3 , $ , . C . . C . . C . $ , N*(N-1)/2 C N-1 , 2*N-3 , N*(N-1)/2 , $ C ---------------------------------------------------------------- C ADRSUP(I,J,N) = N*I - (I*(I+1))/2 + J - N C ADRINF(I,J,N) = N*J - (J*(J+1))/2 + I - N C C C ALGORITHME C ---------- C ON ATTRIBUE PROGRESSIVEMENT LA VALEUR Y("K") = 1 , OU Y("K") = 0 C POUR CHAQUE VARIABLE K , AFIN DE DEGRADER LE MOINS POSSIBLE LA C FONCTION ECONOMIQUE Z : Y("K") = 1 SI SON COEFFICIENT DANS Z C EST POSITIF ( OU NUL ) , Y("K") = 0 SINON . C A CHAQUE ATTRIBUTION D'UNE VALEUR A LA VARIABLE K , ON EXAMINE C LES CONTRAINTES : C * SI LA VALEUR ATTRIBUEE EST REFUSEE , ON ATTRIBUE L'AUTRE VALEUR C * SI L'AUTRE VALEUR EST REFUSEE , ON REMET EN QUESTION LE DERNIER C CHOIX EFFECTUE . C * SI LA FONCTION ECONOMIQUE TOMBE EN DESSOUS DU COUT DE LA C SOLUTION SAUVEGARDEE , ON REMET EN QUESTION LE DERNIER CHOIX C EFFECTUE . C * SI ON EST AMENE A REMETTRE EN QUESTION TOUS LES CHOIX JUSQU'A C LA 1-ERE VARIABLE , ET QUE CELLE-CI EST ELLE MEME REFUSEE , C L'ALGORITHME S'ARRETE : LA SOLUTION SAUVEGARDEE EST OPTIMALE . C C ON STOCKE POUR CHAQUE VARIABLE , L'ADRESSE DU DERNIER CHOIX C EFFECTUE , AVEC UN SIGNE NEGATIF LORSQUE CELUI-CI A DEJA ETE C MODIFIE . C C======================================================================C C SUBROUTINE PNKFMB ( UECR , FMBVR , TRIABS , ALLSOL , N , , COUTS , YSAVE , Y , RENUM , , BORNTH , NBCL0 , Z0 , NBCL , Z , , NBEMP , NBDEP , NBSOL ) C IMPLICIT INTEGER ( A - Z ) C INTEGER YSAVE (N*N) , Y (N*N) , RENUM (N*N) C REAL COUTS (N*N) , , BORNTH , Z0 , Z , DELTAZ , ZSAVE , ZNEW , , FLOAT , ABS C LOGICAL FMBVR , TRIABS , ALLSOL , REFUS , CINTEG C C C----------------------------------------------------------------------C C C C DETERMINATION DU TYPE DE COUTS : REELS OU ENTIERS C CINTEG N'EST UTILISE QU'A L'EDITION DES RESULTATS C ------------------------------------------------- CINTEG = .TRUE. DO I = 1 , N*N ICOUTS = IFIX ( COUTS(I) ) CINTEG = CINTEG .AND. COUTS(I) .EQ. FLOAT(ICOUTS) END DO C C C OBTENTION D'UNE PARTITION INITIALE PAR CAH C ------------------------------------------ CALL PNKCAH ( N , COUTS , Y , NBCL0 , Z0 , BORNTH ) C C C ECRITURE DE LA PARTITION INITIALE ET ARRET EVENTUEL C --------------------------------------------------- IF ( UECR .GT. 0 ) THEN IF ( CINTEG ) THEN WRITE (UECR,4001) IFIX (BORNTH) , IFIX (Z0) , NBCL0 ELSE WRITE (UECR,4002) BORNTH , Z0 , NBCL0 ENDIF DO I = 1 , N WRITE (UECR,5000) I , Y ( I + (I-1)*N ) END DO ENDIF IF ( .NOT. FMBVR ) RETURN C DO I = 1 , N DO J = 1 , I-1 IJ = I + (J-1)*N YSAVE (IJ) = Y (IJ) END DO END DO ZSAVE = Z0 C C C TRI QUADRATIQUE DES COUTS : ARITHMETIQUE OU ALGEBRIQUE C EX-AEQUOS : ON TESTE LES ADRESSES DES ELEMENTS C -------------------------------------------------------------- C LA VARIABLE K (K-EME PLUS GRAND COUT) ASSOCIEE AU COUT (I1,J1) C AURA COMME ADRESSE (IK,JK) DANS LA TRIANGULAIRE INFERIEURE C -------------------------------------------------------------- C DO J1 = 1 , N DO I1 = 1 , J1-1 C I1J1 = I1 + (J1-1) * N J1I1 = J1 + (I1-1) * N RANG = 1 C DO 50 J2 = 1 , N DO 50 I2 = 1 , J2-1 I2J2 = I2 + (J2-1) * N IF ( TRIABS ) THEN CDIF = ABS(COUTS(I2J2)) - ABS(COUTS(I1J1)) ELSE CDIF = COUTS(I2J2) - COUTS(I1J1) ENDIF IF ( CDIF ) 50 , 30 , 40 30 IF ( I1J1 .GE. I2J2 ) GOTO 50 40 RANG = RANG + 1 50 CONTINUE C JK = 1 60 FINJ = N*JK - (JK*(JK+1))/2 IF ( RANG .GT. FINJ ) THEN JK = JK + 1 GOTO 60 ENDIF IK = RANG + N - FINJ IKJK = IK + (JK-1)*N RENUM(IKJK) = I1J1 RENUM(I1J1) = IKJK C END DO END DO C C C INITIALISATIONS DIVERSES ; Z EST LE MAJORANT , SAUF POUR K=M C ------------------------------------------------------------ M = ( N * (N-1) ) / 2 C DO I = 1 , N DO J = 1 , I-1 Y ( I + (J-1)*N ) = -1 Y ( J + (I-1)*N ) = 0 END DO Y ( I + (I-1)*N ) = - 1 END DO C NBEMP = 0 NBDEP = 0 NAP = 0 NBSOL = 0 KIJPRE = 1 I = 1 J = 1 K = 0 Z = BORNTH REFUS = .FALSE. C C C EMPILEMENT DE L'ADRESSE SUIVANTE : (I,J)+1 C ------------------------------------------ 1000 IF ( K .GE. M ) GOTO 1500 NBEMP = NBEMP + 1 I = I + 1 IF ( I .GT. N ) THEN J = J + 1 I = J + 1 ENDIF IJ = I + (J-1)*N JI = J + (I-1)*N K = K + 1 C C C COUT ZNEW = Z +/- DELTAZ ASSOCIE A LA VARIABLE (I,J) , I > J C ------------------------------------------------------------ DELTAZ = COUTS ( RENUM (IJ) ) IF ( DELTAZ .GE. 0. ) THEN VAL01 = 1 ELSE VAL01 = 0 ENDIF C C C CONTROLE DE VALIDITE DU CHOIX INITIAL , PUIS DU CHOIX INVERSE C ON N'INSISTE PAS SI LE MAJORANT Z EST INFERIEUR A ZSAVE C SI REFUS = .TRUE. AVANT CONTROLE , ON VIENT DE DEPILER . C ------------------------------------------------------------- CALL PNKTSY ( N , I , J , VAL01 , Y , RENUM , NAP , REFUS ) IF ( REFUS ) THEN VAL01 = 1 - VAL01 KIJPRE = - KIJPRE CALL PNKTSY ( N , I , J , VAL01 , Y , RENUM , NAP , REFUS ) IF ( REFUS ) GOTO 1200 ENDIF 1100 ZNEW = Z IF ( VAL01 .EQ. 0 ) THEN IF ( DELTAZ .GT. 0. ) ZNEW = Z - DELTAZ ELSE IF ( DELTAZ .LT. 0. ) ZNEW = Z + DELTAZ ENDIF IF ( ALLSOL ) THEN IF ( ZNEW .LT. ZSAVE ) GOTO 1200 ELSE IF ( ZNEW .LE. ZSAVE ) GOTO 1200 ENDIF C C C ACCEPTATION DE LA K-EME VARIABLE : ECRITURE DE (I,J) C ---------------------------------------------------- Y(IJ) = VAL01 Y(JI) = KIJPRE KIJPRE = IJ Z = ZNEW GOTO 1000 C C C DEPILEMENT : ANNULATION DE (I,J) C -------------------------------- 1200 NBDEP = NBDEP + 1 IF ( K .LE. 1 ) GOTO 2000 K = K - 1 I = I - 1 IF ( I .LE. J ) THEN J = J - 1 I = N ENDIF IJ = I + (J-1)*N JI = J + (I-1)*N VAL01 = Y(IJ) KIJPRE = Y(JI) Y(IJ) = - 1 Y(JI) = 0 DELTAZ = COUTS ( RENUM (IJ) ) IF ( VAL01 .EQ. 0 ) THEN IF ( DELTAZ .GT. 0. ) Z = Z + DELTAZ ELSE IF ( DELTAZ .LT. 0. ) Z = Z - DELTAZ ENDIF IF ( KIJPRE .LT. 0 ) GOTO 1200 C C C ON ESSAIE L'AUTRE VALEUR C ------------------------ VAL01 = 1 - VAL01 KIJPRE = - KIJPRE CALL PNKTSY ( N , I , J , VAL01 , Y , RENUM , NAP , REFUS ) IF ( REFUS ) GOTO 1200 GOTO 1100 C C C NOUVELLE SOLUTION C ----------------- 1500 DO II = 1 , N DO JJ = 1 , II-1 IJ = II + (JJ-1)*N ISJS = RENUM (IJ) JS = ISJS / N IS = ISJS - JS * N JS = 1 + JS JSIS = JS + (IS-1)*N YSAVE (JSIS) = Y (IJ) END DO END DO ZSAVE = Z NBSOL = NBSOL + 1 C C C CALCUL DU NOMBRE DE CLASSES A PARTIR DE YSAVE C --------------------------------------------- DO IS = 1 , N YSAVE ( IS + (IS-1)*N ) = - 1 END DO NBCL = 0 DO IS = 1 , N ISIS = IS + (IS-1)*N IF ( YSAVE(ISIS) .LT. 0 ) THEN NBCL = NBCL + 1 DO JS = IS+1 , N JSIS = JS + (IS-1)*N JSJS = JS + (JS-1)*N IF ( YSAVE(JSIS) .EQ. 1 ) YSAVE(JSJS) = NBCL END DO YSAVE(ISIS) = NBCL ENDIF END DO C C C ECRITURE DE LA PARTITION PROVISOIREMENT OPTIMALE C ------------------------------------------------ IF ( UECR .GT. 0 ) THEN IF ( CINTEG ) THEN WRITE (UECR,6001) IFIX (BORNTH) , IFIX (Z) , NBCL , , NBEMP , NBDEP , NAP ELSE WRITE (UECR,6002) BORNTH , Z , NBCL , , NBEMP , NBDEP , NAP ENDIF DO IS = 1 , N WRITE (UECR,5000) IS , YSAVE ( IS + (IS-1)*N ) END DO ENDIF C C C AU MIEUX , ON REEXAMINE K = M : SIMULATION DU REFUS DE K = M+1 C -------------------------------------------------------------- NBDEP = NBDEP - 1 K = M + 1 C I = N J = N GOTO 1200 C C C RECUPERATION DE LA PARTITION OPTIMALE C ------------------------------------- 2000 DO I = 1 , N DO J = 1 , I-1 IJ = I + (J-1)*N JI = J + (I-1)*N Y (IJ) = YSAVE (IJ) Y (JI) = Y (IJ) END DO END DO Z = ZSAVE C C C CALCUL DU NOMBRE DE CLASSES A PARTIR DE Y C ----------------------------------------- NBCL = 0 DO I = 1 , N II = I + (I-1)*N IF ( Y(II) .LT. 0 ) THEN NBCL = NBCL + 1 DO J = I+1 , N IJ = I + (J-1)*N JJ = J + (J-1)*N IF ( Y(IJ) .EQ. 1 ) Y(JJ) = NBCL END DO Y(II) = NBCL ENDIF END DO C C C ECRITURE DE LA PARTITION FINALE ET DES STATISTIQUES C --------------------------------------------------- IF ( UECR .GT. 0 ) THEN IF ( CINTEG ) THEN WRITE (UECR,7001) IFIX (BORNTH) , IFIX (Z) , NBCL , , NBEMP , NBDEP , NAP , NBSOL ELSE WRITE (UECR,7002) BORNTH , Z , NBCL , , NBEMP , NBDEP , NAP , NBSOL ENDIF DO I = 1 , N WRITE (UECR,5000) I , Y ( I + (I-1)*N ) END DO ENDIF C RETURN C C C FORMATS D'ECRITURE DES RESULTATS C -------------------------------- C 4001 FORMAT ( // ' ---------------------------------------------' , / ' MAXIMUM THEORIQUE : DEMI-COUT =' , I13 , / ' PARTITION INITIALE : DEMI-COUT =' , I13 , / ' NOMBRE DE CLASSES : ' , I13 , / ' ---------------------------------------------' , // ' -------- ------' , / ' INDIVIDU CLASSE' , / ' -------- ------' ) C 4002 FORMAT ( // ' ---------------------------------------------' , / ' MAXIMUM THEORIQUE : DEMI-COUT =' , E13.6 , / ' PARTITION INITIALE : DEMI-COUT =' , E13.6 , / ' NOMBRE DE CLASSES : ' , I13 , / ' ---------------------------------------------' , // ' -------- ------' , / ' INDIVIDU CLASSE' , / ' -------- ------' ) C 5000 FORMAT ( I13 , I12 ) C 6001 FORMAT ( // ' ---------------------------------------------' , / ' MAXIMUM THEORIQUE : DEMI-COUT =' , I13 , / ' PARTITION LOCALE : DEMI-COUT =' , I13 , / ' NOMBRE DE CLASSES : ' , I13 , / ' EMPILEMENTS : ' , I13 , / ' DEPILEMENTS : ' , I13 , / ' TESTS CONTRAINTES : ' , I13 , / ' ---------------------------------------------' , // ' -------- ------' , / ' INDIVIDU CLASSE' , / ' -------- ------' ) C 6002 FORMAT ( // ' ---------------------------------------------' , / ' MAXIMUM THEORIQUE : DEMI-COUT =' , E13.6 , / ' PARTITION LOCALE : DEMI-COUT =' , E13.6 , / ' NOMBRE DE CLASSES : ' , I13 , / ' EMPILEMENTS : ' , I13 , / ' DEPILEMENTS : ' , I13 , / ' TESTS CONTRAINTES : ' , I13 , / ' ---------------------------------------------' , // ' -------- ------' , / ' INDIVIDU CLASSE' , / ' -------- ------' ) C 7001 FORMAT ( // ' ---------------------------------------------' , / ' MAXIMUM THEORIQUE : DEMI-COUT =' , I13 , / ' PARTITION FINALE : DEMI-COUT =' , I13 , / ' NOMBRE DE CLASSES : ' , I13 , / ' EMPILEMENTS : ' , I13 , / ' DEPILEMENTS : ' , I13 , / ' TESTS CONTRAINTES : ' , I13 , / ' OPTIMUMS LOCAUX : ' , I13 , / ' ---------------------------------------------' , // ' -------- ------' , / ' INDIVIDU CLASSE' , / ' -------- ------' ) C 7002 FORMAT ( // ' ---------------------------------------------' , / ' MAXIMUM THEORIQUE : DEMI-COUT =' , E13.6 , / ' PARTITION FINALE : DEMI-COUT =' , E13.6 , / ' NOMBRE DE CLASSES : ' , I13 , / ' EMPILEMENTS : ' , I13 , / ' DEPILEMENTS : ' , I13 , / ' TESTS CONTRAINTES : ' , I13 , / ' OPTIMUMS LOCAUX : ' , I13 , / ' ---------------------------------------------' , // ' -------- ------' , / ' INDIVIDU CLASSE' , / ' -------- ------' ) C END C======================================================================C C C C CONTROLE DE VALIDITE D'UNE NOUVELLE AFFECTATION DANS Y C C ( VOIR PNKFMB ) C C ------------------------------------------------------ C C C C EN ENTREE : C C N : DIMENSION DE Y ET DE RENUM C C I : INDICE DE LIGNE DU NOUVEL Y(I,J) C C J : INDICE DE COLONNE DE Y(I,J) C C VAL01 : VALEUR PROPOSEE POUR Y(I,J) C C Y ( N , N ) : MATRICE DE PARTITION ( DANS LA C C TRIANGULAIRE INFERIEURE ) C C RENUM ( N , N ) : MATRICE DES ADRESSES DES COUTS C C NAP : NOMBRE D'APPELS C C C C EN SORTIE : C C NAP : NOMBRE D'APPELS + 1 C C REFUS : .TRUE. SI ON REFUSE C C .FALSE. SI ON ACCEPTE C C C C ATTENTION : C C LA TRIANGULAIRE INFERIEURE DE RENUM CONTIENT LE C C COUPLE (II,JJ) , ANCIENNE ADRESSE DE LA VARIABLE C C DANS LA TRIANGULAIRE SUPERIEURE , CORRESPONDANT C C AUX COUTS INITIAUX . C C C C LA TRIANGULAIRE SUPERIEURE DE RENUM CONTIENT LE C C COUPLE (I ,J ) , NOUVELLE ADRESSE DE LA VARIABLE C C DANS LA TRIANGULAIRE INFERIEURE , APRES CLASSEMENT C C PAR ORDRE DECROISSANT : VOIR CALREN . C C C C======================================================================C C SUBROUTINE PNKTSY ( N , I , J , VAL01 , Y , RENUM , NAP , REFUS ) C IMPLICIT INTEGER ( A - Z ) C LOGICAL REFUS C C INTEGER Y ( N , N ) , RENUM ( N , N ) INTEGER Y ( * ) , RENUM ( * ) C C NAP = NAP + 1 REFUS = .FALSE. C C C EXTRACTION DES INDICES II ET JJ > II , ASSOCIES A YIJ INITIAL C ------------------------------------------------------------- JJII = RENUM ( I + (J-1)*N ) IIM1 = (JJII-1) / N II = IIM1 + 1 JJ = JJII - N * IIM1 C Y(II,JJ) = VAL01 C C C BOUCLE SUR LES INDICES INITIAUX COHERENTS AVEC YIJ , YIK , YJK C -------------------------------------------------------------- DO 100 KK = 1 , N C IF ( II - KK ) 10 , 100 , 20 10 YIK = Y ( RENUM ( II + (KK-1)*N ) ) GOTO 30 20 YIK = Y ( RENUM ( KK + (II-1)*N ) ) 30 IF ( JJ - KK ) 40 , 100 , 50 40 YJK = Y ( RENUM ( JJ + (KK-1)*N ) ) GOTO 60 50 YJK = Y ( RENUM ( KK + (JJ-1)*N ) ) C C CONTRAIREMENT A LA PROGRAMMATION LINEAIRE , ON TESTE C TROIS PAR TROIS LES CONTRAINTES YIJ + YIK - YJK < 2 C ---------------------------------------------------- C REFUS : YIJ , YIK , YJK ( VALEURS POSSIBLES -1 , 0 , +1 ) C 1 1 0 C 1 0 1 C 0 1 1 C 60 REFUS = VAL01+YIK+YJK .EQ. 2 C IF ( REFUS ) RETURN C 100 CONTINUE C RETURN C END