1 #@ MODIF reca_evol Macro DATE 11/05/2010 AUTEUR COURTOIS M.COURTOIS
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2009 EDF R&D WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
9 # (AT YOUR OPTION) ANY LATER VERSION.
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
18 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
23 Le programme d'optimisation d'une fonctionelle base sur l'algorithm genetique,
24 developpement issu du contrat PdM-AMA
33 def evolutivo(fonc,val,nb_iter,err_min,nb_parents,nb_fils,sigma,borne_inf,borne_sup,graine):
35 #initialisation du vecteur des parametres
37 #les valeurs initiales des parametres sont recuperees
42 #valeur du critere d arret
45 #initialisation et remplisage du vecteur des parents
47 for ind in range(nb_parents):
48 Parents_ini.append(par_ini)
49 #P sera le vecteur des parents retourne par la fonction figli
53 #le premier vecteur d erreurs sera calcule par la fonction errore
54 #a partir des valeurs initiales des parents
56 # On affiche egalement la fenetre MAC pour un appariement manual
58 err_ini=fonc.calcul_F(par_ini)
59 #on rempli l'erreur pour chaque parent initial
60 for ind in range(nb_parents):
61 erreurs_ini.append(err_ini)
63 erreurs.append(erreurs_ini[:])
66 #ici on demarre la boucle de minimisation de la fonction erreur
68 if graine != None: random.seed(graine)
69 F=fils(P[-1],nb_parents,nb_fils,sigma,borne_inf, borne_sup)
71 #on fait la selection des meilleurs fils - p
72 (p,err)=selection(fonc,F,P[-1],erreurs[-1],nb_parents)
74 #P est le nouveau jeu de parents
75 #attention on stocke ici tous l historique des parents et c'est le meme pour les erreurs dans erreurs
79 #on lance un calcul avec le meilleur jeu de parametres juste pour l'appariement des MAC
81 err_mac=fonc.calcul_F(P[-1][0])
82 if erreurs[-1][0]<=err_min:
92 def selection(fonc,fils,parents,err_parents,nb_parents):
95 Selection des meilleurs fils a chaque iteration
102 err.append(fonc.calcul_F(ind))
103 for ind in err_parents:
110 ordre=numpy.argsort(err).tolist()
114 fam_ordonne.append(famille[ind])
115 err_ordonne.append(err[ind])
117 return fam_ordonne[0:int(nb_parents)], err_ordonne[0:int(nb_parents)]
122 def fils(parents,nb_parents,nb_fils,sigma,borne_inf, borne_sup):
128 for ind in range(int(math.floor(nb_fils/nb_parents))):
129 for ind2 in range(nb_parents):
130 F.append(genere_fils(parents[ind2],sigma,borne_inf, borne_sup))
131 #le dernier parent est le plus prolific car il va completer le nombres de fils
132 #mais il est aussi le meilleur parent car correspond a l'erreur minimale
133 for ind2 in range(nb_fils%nb_parents):
134 F.append(genere_fils(parents[ind2],sigma,borne_inf, borne_sup))
138 #les fils sont generes ici
139 def genere_fils(parent,sigma,borne_inf, borne_sup):
142 Creation d'un seul fils avec prise en compte des bornes
147 #F est le vecteur de fils a remplir ici avec la fonction random
148 #a partir des valeurs du parent courant
151 F.append(ind+ind/100.*random.gauss(0,sigma))
152 #la variable parametre initialise ici est un index pour defiler les valeurs de F
155 test1=F[parametre]>=borne_inf[parametre]
156 test2=F[parametre]<=borne_sup[parametre]
161 # print "parametre hors bornes"
163 # print 'fils genere:',F