mmasub
C MMASUB SOURCE FD218221 26/10/07 21:15:08 12662 SUBROUTINE MMASUB(M,N,ITER,XVAL,XMIN,XMAX,XOLD1,XOLD2, & DF0DX,FVAL,DFDX,MOVE,ALBEFA,RAA0, & ASYINIT,ASYINCR,ASYDECR,ASYMIN,ASYMAX, & LOW,UPP,ALFA,BETA,P0,Q0,P,Q,B) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C ---------------------------------------------------------------------- C Ce code est une adaptation en FORTRAN/ESOPE de l'algorithme de la MMA C (Methode des Asymptotes Mobiles) propose initialement en langage C Matlab par K. Svarberg (sources : https://www.smoptit.se/) C ---------------------------------------------------------------------- C Cette subroutine definit un sous-probleme d'optimisation convexe C selon la methode des asymptotes mobiles (MMA) C C Le probleme d'optimisation initial est le suivant : C Minimiser : f_0(x) + a_0*z + SUM[ c_i*y_i + 0.5*d_i*(y_i)^2 ] C soumis a : f_i(x) - a_i*z - y_i <= 0, i = 1,...,m C xmin_j <= x_j <= xmax_j, j = 1,...,n C z >= 0, y_i >= 0, i = 1,...,m C C Le probleme est transforme en une suite de sous-problemes convexes : C Minimiser : SUM[ p0_j/(upp_j-x_j) + q0_j/(x_j-low_j) ] + a_0*z + C + SUM[ c_i*y_i + 0.5*d_i*(y_i)^2 ] C Soumis a : SUM[ p_ij/(upp_j-x_j) + q_ij/(x_j-low_j) ] - a_i*z - y_i <= b_i, i = 1,...,m C alfa_j <= x_j <= beta_j, j = 1,...,n C z >= 0, y_i >= 0, i = 1,...,m C C Cette subroutine calcule les matrices/vecteurs decrivant un sous-probleme C Elle necessite d'etre iteree pour approcher la solution du probleme initial C C Entrees : C --------- C M = Nombre de contraintes C N = Nombre de variables x_j C ITER = Numero de l'iteration courante (=1 la premiere fois que mmasub est appellee) C XVAL = Vecteur (N) des variables x_j C XMIN/XMAX = Vecteurs (N) des bornes inferieures/superieures pour les variables x_j C XOLD1 = XVAL, a 1 iteration precedente (a condition que iter>1) C XOLD2 = XVAL, a 2 iterations precedentes (a condition que iter>2) C DF0DX = Vecteur (N) des valeurs du gradient de la fonction objectif f_0, C par rapport aux variables x_j, calcules en XVAL C FVAL = Vecteur (M) des valeurs des fonctions contraintes f_i, calculees en XVAL C DFDX = Matrice (M x N) des valeurs du gradient des fonctions contraintes f_i, C par rapport aux variables x_j, calcules en XVAL C DFDX(i,j) = gradient de f_i par rapport a x_j C MOVE = Taille maximale de l'increment des variables C ALBEFA = Pourcentage d'ecart par rapport aux asymptotes alfa et beta C RAA0 = Parametre de conservatisme / courbure de l'objectif C ASYINIT = Facteur d'initialisation des asymptotes LOW et UPP C ASYINCR = Facteur d'eloignement des asymptotes LOW et UPP C ASYDECR = Facteur de rapprochement des asymptotes LOW et UPP C ASYMIN = Limite inferieure de la distance entre les asymptotes LOW et UPP C ASYMAX = Limite superieure de la distance entre les asymptotes LOW et UPP C LOW/UPP = Vecteurs (N) des asymptotes inferieures/superieures du sous-probleme C ALFA/BETA = Vecteurs (N) des bornes inferieures/superieures du sous-probleme C C Sorties : C --------- C LOW/UPP = Vecteurs (N) des asymptotes inferieures/superieures mises a jour C ALFA/BETA = Vecteurs (N) des bornes inferieures/superieures mises a jour C P0/Q0 = Vecteurs (N) des coefficients des asymptotes superieure/inferieure C dans la fonction objectif C P/Q = Matrices (M x N) des coefficients des asymptotes superieure/inferieure C des contraintes C B = Vecteur (M) des seconds membres des contraintes C ---------------------------------------------------------------------- C Arguments INTEGER M,N,ITER REAL*8 MOVE,ALBEFA,RAA0,ASYINIT,ASYINCR,ASYDECR,ASYMIN,ASYMAX REAL*8 XVAL(N),XMIN(N),XMAX(N),XOLD1(N),XOLD2(N) REAL*8 DF0DX(N),FVAL(M),DFDX(M,N) REAL*8 LOW(N),UPP(N),ALFA(N),BETA(N) REAL*8 P0(N),Q0(N),P(M,N),Q(M,N),B(M) C Variables locales INTEGER I,J REAL*8 ASYMP,FACT,DF0,DFJ,LOWMIN,LOWMAX,UPMIN,UPMAX,XMAMI C Mise a jour des asymptotes low et upp DO 10 I = 1, N XMAMI = XMAX(I) - XMIN(I) IF (ITER .LE. 2) THEN LOW(I) = XVAL(I) - ASYINIT * XMAMI UPP(I) = XVAL(I) + ASYINIT * XMAMI ELSE FACT = (XVAL(I) - XOLD1(I)) * (XOLD1(I) - XOLD2(I)) IF (FACT .GT. 0.0D0) THEN ASYMP = ASYINCR ELSEIF (FACT .LT. 0.0D0) THEN ASYMP = ASYDECR ELSE ASYMP = 1.0D0 ENDIF LOW(I) = XVAL(I) - ASYMP * (XOLD1(I) - LOW(I)) UPP(I) = XVAL(I) + ASYMP * (UPP(I) - XOLD1(I)) LOWMIN = XVAL(I) - ASYMAX * XMAMI LOWMAX = XVAL(I) - ASYMIN * XMAMI UPMIN = XVAL(I) + ASYMIN * XMAMI UPMAX = XVAL(I) + ASYMAX * XMAMI LOW(I) = MAX(LOW(I),LOWMIN) LOW(I) = MIN(LOW(I),LOWMAX) UPP(I) = MAX(UPP(I),UPMIN) UPP(I) = MIN(UPP(I),UPMAX) ENDIF 10 CONTINUE C Mise a jour des bornes alfa et beta DO 20 I = 1, N ALFA(I) = MAX(LOW(I) + ALBEFA * (XVAL(I) - LOW(I)), & XVAL(I) - MOVE * (XMAX(I) - XMIN(I)), & XMIN(I)) BETA(I) = MIN(UPP(I) - ALBEFA * (UPP(I) - XVAL(I)), & XVAL(I) + MOVE * (XMAX(I) - XMIN(I)), & XMAX(I)) 20 CONTINUE C Calcul de p0 et q0 DO 30 I = 1, N DF0 = DF0DX(I) XMAMI = MAX(XMAX(I)-XMIN(I), 0.00001D0) P0(I) = MAX( DF0,0.D0) + 0.001D0*ABS(DF0) + RAA0/XMAMI Q0(I) = MAX(-DF0,0.D0) + 0.001D0*ABS(DF0) + RAA0/XMAMI P0(I) = P0(I) * ((UPP(I) - XVAL(I))**2) Q0(I) = Q0(I) * ((XVAL(I) - LOW(I))**2) 30 CONTINUE C Calcul de p, q et b DO 40 J = 1, M B(J) = -FVAL(J) DO 50 I = 1, N DFJ = DFDX(J,I) XMAMI = MAX(XMAX(I)-XMIN(I), 0.00001D0) P(J,I) = MAX( DFJ,0.D0) + 0.001D0*ABS(DFJ) + RAA0/XMAMI Q(J,I) = MAX(-DFJ,0.D0) + 0.001D0*ABS(DFJ) + RAA0/XMAMI P(J,I) = P(J,I) * ((UPP(I)-XVAL(I))**2) Q(J,I) = Q(J,I) * ((XVAL(I)-LOW(I))**2) B(J) = B(J) + P(J,I) / (UPP(I) - XVAL(I)) & + Q(J,I) / (XVAL(I) - LOW(I)) 50 CONTINUE 40 CONTINUE RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales