C PERM11    SOURCE    BP208322  16/06/27    21:16:18     8990           

      SUBROUTINE PERM11(N,C,F,ZMIN)

c     CALCULE TOUTES LES PERMUTATIONS POSSIBLES
c     ET NE RETIENT QUE CELLE DE PLUS BAS COUT
c     BP, 2016-06-24

      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8(A-H,O-Z)

-INC PPARAM
-INC CCOPTIO
      
      INTEGER A(N),F(N),T
      REAL*8  C(N,N),Z,ZMIN

c     INITIALISATION
      Z=0
      DO I=1,N
        A(I)=I
        F(I)=I
        Z=Z+C(I,I)
      ENDDO
      ZMIN=Z
c       IF(IIMPI.GE.1) WRITE(IOIMP,*) '#',1,' COUT=',Z

c     IL Y A NC=N! COMBINAISONS POSSIBLES
      NC=1
      DO I=2,N
         NC = NC * I
      ENDDO
      
c     ON BOUCLE SUR LES COMBINAISONS POSSIBLES      
      DO 1 IC=2,NC
      
        I=N-1
   10   IF(A(I).LT.A(I+1)) GO TO 20
        I=I-1
        IF(I.EQ.0) GO TO 20
        GO TO 10
        
   20   J=I+1
        K=N
        
   30   T=A(J)
        A(J)=A(K)
        A(K)=T
        J=J+1
        K=K-1
        IF(J.LT.K) GO TO 30
        J=I
        IF(J.NE.0) GO TO 40
        GOTO 2
c       FIN DU PROGRAMME
        
   40   J=J+1
        IF(A(J).LT.A(I)) GO TO 40
        T=A(I)
        A(I)=A(J)
        A(J)=T
        
c       CALCUL DU COUT
        Z=0
        DO I=1,N
          Z=Z+C(I,A(I))
        ENDDO
c         IF(IIMPI.GE.1) WRITE(IOIMP,*) '#',IC,' COUT=',Z
        IF(Z.LT.ZMIN) THEN
          ZMIN=Z
          DO I=1,N
            F(I)=A(I)
          ENDDO
        ENDIF
        
   1  CONTINUE 
   
   2  CONTINUE  
      
      RETURN
      END
 
