Télécharger mmasub.eso

Retour à la liste

Numérotation des lignes :

mmasub
  1. C MMASUB SOURCE FD218221 25/09/03 21:15:04 12351
  2. SUBROUTINE MMASUB(M,N,ITER,XVAL,XMIN,XMAX,XOLD1,XOLD2,
  3. & F0VAL,DF0DX,FVAL,DFDX,A0,A,C,D,MOVE,
  4. & XMMA,YMMA,ZMMA,LAM,XSI,ETA,MU,ZET,S,LOW,UPP)
  5.  
  6. C Typages implicites habituels
  7. IMPLICIT INTEGER(I-N)
  8. IMPLICIT REAL*8 (A-H,O-Z)
  9.  
  10. C ------------------------------------------------------------------------------------------------
  11. C Ce code est une adaptation en FORTRAN de l'algorithme de la MMA (Methode des Asymptotes Mobiles)
  12. C propose initialement en langage Matlab par K. Svarberg
  13. C Les sources sont disponibles ici : https://www.smoptit.se/
  14. C ------------------------------------------------------------------------------------------------
  15. C Cette subroutine effectue une iteration de la MMA, afin de resoudre un probleme
  16. C d'optimisation non lineaire suivant :
  17. C
  18. C Minimiser : f_0(x) + a_0*z + SUM[ c_i*y_i + 0.5*d_i*(y_i)^2 ]
  19. C soumis a : f_i(x) - a_i*z - y_i <= 0, i = 1,...,m
  20. C xmin_j <= x_j <= xmax_j, j = 1,...,n
  21. C z >= 0, y_i >= 0, i = 1,...,m
  22. C Entrees :
  23. C ---------
  24. C m = Nombre de contraintes
  25. C n = Nombre de variables x_j
  26. C iter = Numero de l'iteration courante ( =1 la premiere fois que mmasub est appellee)
  27. C xval = Vecteur colonne (n x 1) des variables x_j
  28. C xmin = Vecteur colonne (n x 1) des bornes inferieures pour les variables x_j
  29. C xmax = Vecteur colonne (n x 1) des bornes superieures pour les variables x_j
  30. C xold1 = xval, a 1 iteration precedente (a condition que iter>1)
  31. C xold2 = xval, a 2 tterations precedentes (a condition que iter>2)
  32. C f0val = Valeur de la fonction objectif f_0 en xval
  33. C df0dx = Vecteur colonne (n x 1) des valeurs du gradient de la fonction objectif f_0,
  34. C par rapport aux variables x_j, calcules en xval
  35. C fval = Vecteur colonne (m x 1) des valeurs des fonctions contraintes f_i,
  36. C calculees en at xval
  37. C dfdx = Matrice (m x n) des valeurs du gradient des fonctions contraintes f_i,
  38. C par rapport aux variables x_j, calcules en xval
  39. C dfdx(i,j) = gradient de f_i par rapport a x_j
  40. C low = Vecteur colonne (n x 1) des valeurs des asymptotes inferieures
  41. C a l'iteration precedente (a condition que iter>1)
  42. C upp = Vecteur colonne (n x 1) des valeurs des asymptotes superieures
  43. C a l'iteration precedente (a condition que iter>1)
  44. C a0 = Constante a_0
  45. C a = Vecteur colonne (m x 1) des constantes a_i
  46. C c = Vecteur colonne (m x 1) des constantes c_i
  47. C d = Vecteur colonne (m x 1) des constantes d_i
  48. C move = Limite de variation pour les variables
  49. C
  50. C Sorties :
  51. C ---------
  52. C xmma = Vecteur colonne (n x 1) des variables x_j optimisees
  53. C pour le sous probleme courant de la MMA
  54. C ymma = Vecteur colonne (m x 1) des variables y_j optimisees
  55. C pour le sous probleme courant de la MMA
  56. C zmma = Valeur de la variable z optimisee
  57. C pour le sous probleme courant de la MMA
  58. C lam = Vecteur colonne (m x 1) des multiplicateurs de Lagrange
  59. C des contraintes generales f_i de la MMA
  60. C xsi = Vecteur colonne (n x 1) des multiplicateurs de Lagrange
  61. C des contraintes sur les bornes inferieures alfa_j - x_j <= 0
  62. C eta = Vecteur colonne (n x 1) des multiplicateurs de Lagrange
  63. C des contraintes sur les bornes superieures x_j - beta_j <= 0
  64. C mu = Vecteur colonne (m x 1) des multiplicateurs de Lagrange
  65. C des contraintes de non negativite -y_i <= 0
  66. C zet = Multiplicateurs de Lagrange de la contrainte de non negativite -z <= 0
  67. C s = Vecteur colonne (m x 1) des variables d'ecart
  68. C des contraintes generales de la MMA f_i
  69. C low = Vecteur colonne (n x 1) des valeurs des asymptotes inferieures
  70. C mises a jour
  71. C upp = Vecteur colonne (n x 1) des valeurs des asymptotes superieures
  72. C mises a jour
  73. C ------------------------------------------------------------------------------------------------
  74.  
  75. C Arguments de sortie
  76. REAL*8 XMMA(N,1),YMMA(M,1),ZMMA
  77. REAL*8 LAM(M,1),XSI(N,1),ETA(N,1),MU(M,1),ZET,S(M,1)
  78. C Arguments d'entree
  79. INTEGER M,N,ITER
  80. REAL*8 A0,F0VAL,FVAL(M,1),XVAL(N,1),XMIN(N,1),XMAX(N,1)
  81. REAL*8 XOLD1(N,1),XOLD2(N,1),DF0DX(N,1),DFDX(M,N)
  82. REAL*8 LOW(N,1),UPP(N,1),MOVE
  83. REAL*8 A(M,1),C(M,1),D(M,1)
  84. C Arguments internes
  85. REAL*8 RAA0,ALBEFA,ASYINIT,ASYINCR,ASYDECR
  86. REAL*8 B(M,1),EEEN(N,1),EEEM(M,1),ZERON(N,1)
  87. REAL*8 ZZZ(N,1),ZZZ1(N,1),ZZZ2(N,1),FACTOR(N,1)
  88. REAL*8 LOWMIN(N,1),LOWMAX(N,1),UPPMIN(N,1),UPPMAX(N,1)
  89. REAL*8 ALFA(N,1),BETA(N,1),XMAMI(N,1)
  90. REAL*8 XMAMIEPS(N,1),XMAMIINV(N,1),UX1(N,1),UX2(N,1)
  91. REAL*8 XL1(N,1),XL2(N,1),UXINV(N,1),XLINV(N,1)
  92. REAL*8 P0(N,1),Q0(N,1),PQ0(N,1),P(M,N),Q(M,N),PQ(M,N)
  93. REAL*8 TEMP(M,N)
  94. C Valeurs des parametres
  95. EPSIMIN = 1.D-7
  96. RAA0 = 1.D-5
  97. ALBEFA = 0.1D0
  98. ASYINIT = 0.5D0
  99. ASYINCR = 1.2D0
  100. ASYDECR = 0.7D0
  101. ASYMIN = 0.01D0
  102. ASYMAX = 10.D0
  103. CALL UN(EEEN,N,1)
  104. CALL UN(EEEM,M,1)
  105. CALL ZERO(ZERON,N,1)
  106.  
  107. C Mise a jour des asymptotes low etd upp
  108. IF (ITER.LT.3) THEN
  109. LOW = XVAL - ASYINIT*(XMAX-XMIN)
  110. UPP = XVAL + ASYINIT*(XMAX-XMIN)
  111. ELSE
  112. ZZZ = (XVAL-XOLD1)*(XOLD1-XOLD2)
  113. FACTOR = EEEN
  114. DO I=1,N
  115. IF (ZZZ(I,1).GT.0.D0) THEN
  116. FACTOR(I,1) = ASYINCR
  117. ELSEIF (ZZZ(I,1).LT.0.D0) THEN
  118. FACTOR(I,1) = ASYDECR
  119. ENDIF
  120. ENDDO
  121. LOW = XVAL - FACTOR*(XOLD1 - LOW)
  122. UPP = XVAL + FACTOR*(UPP - XOLD1)
  123. LOWMIN = XVAL - ASYMAX*(XMAX-XMIN)
  124. LOWMAX = XVAL - ASYMIN*(XMAX-XMIN)
  125. UPPMIN = XVAL + ASYMIN*(XMAX-XMIN)
  126. UPPMAX = XVAL + ASYMAX*(XMAX-XMIN)
  127. LOW = MAX(LOW,LOWMIN)
  128. LOW = MIN(LOW,LOWMAX)
  129. UPP = MIN(UPP,UPPMAX)
  130. UPP = MAX(UPP,UPPMIN)
  131. ENDIF
  132.  
  133. C Calcul des bornes alfa et beta
  134. ZZZ1 = LOW + ALBEFA*(XVAL-LOW)
  135. ZZZ2 = XVAL - MOVE*(XMAX-XMIN)
  136. ZZZ = MAX(ZZZ1,ZZZ2)
  137. ALFA = MAX(ZZZ,XMIN)
  138. ZZZ1 = UPP - ALBEFA*(UPP-XVAL)
  139. ZZZ2 = XVAL + MOVE*(XMAX-XMIN)
  140. ZZZ = MIN(ZZZ1,ZZZ2)
  141. BETA = MIN(ZZZ,XMAX)
  142.  
  143. C Calcul de p0, q0, P, Q et b
  144. XMAMI = XMAX - XMIN
  145. XMAMIEPS = 0.00001D0*EEEN
  146. XMAMI = MAX(XMAMI,XMAMIEPS)
  147. XMAMIINV = EEEN/XMAMI
  148. UX1 = UPP - XVAL
  149. UX2 = UX1*UX1
  150. XL1 = XVAL - LOW
  151. XL2 = XL1*XL1
  152. UXINV = EEEN/UX1
  153. XLINV = EEEN/XL1
  154. P0 = ZERON
  155. Q0 = ZERON
  156. P0 = MAX(DF0DX,0.D0)
  157. Q0 = MAX((-1.D0)*DF0DX,0.D0)
  158. PQ0 = 0.001D0*(P0 + Q0) + RAA0*XMAMIINV
  159. P0 = P0 + PQ0
  160. Q0 = Q0 + PQ0
  161. P0 = P0*UX2
  162. Q0 = Q0*XL2
  163. CALL ZERO(P,M,N)
  164. CALL ZERO(Q,M,N)
  165. P = MAX(DFDX,0.0D0)
  166. Q = MAX((-1.D0)*DFDX,0.D0)
  167. PQ = 0.001D0*(P + Q) + RAA0*MATMUL(EEEM,TRANSPOSE(XMAMIINV))
  168. P = P + PQ
  169. Q = Q + PQ
  170. CALL MULMV(TEMP,P,UX2,M,N)
  171. P = TEMP
  172. CALL MULMV(TEMP,Q,XL2,M,N)
  173. Q = TEMP
  174. B = MATMUL(P,UXINV) + MATMUL(Q,XLINV) - FVAL
  175.  
  176. C Resolution du sous probleme par une methode de Newton primale-duale
  177. MN = MIN(M,N)
  178. CALL SUBSOLVE(M,N,MN,EPSIMIN,LOW,UPP,ALFA,BETA,P0,Q0,P,Q,
  179. & A0,A,B,C,D,
  180. & XMMA,YMMA,ZMMA,LAM,XSI,ETA,MU,ZET,S)
  181.  
  182. END
  183.  
  184.  
  185.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales