CCL Home Page
Up Directory CCL pop.f77
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
Modified: Sat Jan 4 06:14:14 2003 GMT
Page accessed 5896 times since Mon Jan 27 06:36:45 2003 GMT