From 293c6eb18e276d2159ba33d1f0674fc6dbf26e6d Mon Sep 17 00:00:00 2001 From: O'Sullivan Solal <solal.osullivan@student-cs.fr> Date: Tue, 28 Jan 2020 09:47:12 +0100 Subject: [PATCH] test new version --- test.py | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/test.py b/test.py index 46e0c0b..c1a1a41 100644 --- a/test.py +++ b/test.py @@ -6,35 +6,48 @@ class Population: self.n = n def selection_duel_pondere(self,p=(self.n)//2): - n=self.n - newself=[] #méthode des duels pondérée: si x=10 et y=1, y a une chance sur 11 de passer - while len(self)>p: - m=random.randrange(0,len(self)) - t=random.randrange(0,len(self)) + newself=[] + vu={} + m=None + t=None #méthode des duels pondérée: si x=10 et y=1, y a une chance sur 11 de passer + while len(newself)<p: + while m in vu: + m=random.randrange(0,len(self)) + while t in vu: + t=random.randrange(0,len(self)) x=self[m] y=self[t] + vu.add(t) + vu.add(m) p=uniform(0,1) if p>x.score/(x.score+y.score): newself.append(y) else: newself.append(x) + return(newself) def selection_duel(self,p=(self.n)//2): - n=self.n - newself=[] #méthode des duels pondérée: si x=10 et y=1, y a une chance sur 11 de passer - while len(self)>p: - m=random.randrange(0,len(self)) - t=random.randrange(0,len(self)) + newself=[] + vu={} + t=None + m=None + while len(newself)<p: + while m in vu: + m=random.randrange(0,len(self)) + while t in vu: + t=random.randrange(0,len(self)) x=self[m] y=self[t] + vu.add(t) + vu.add(m) if x.score<=y.score: newself.append(x) else: newself.append(y) return(newself) - def selection_par_rang(self, p): + def selection_par_rang(self, p=(self.n)//2): liste_individus = self.indiv n = self.n @@ -80,6 +93,19 @@ class Population: return self self = modifier_population(self, individus_selectionnes) + + def selection_proportionelle(self,p=(self.n)//2): + newself=[] + somme=0 + for indiv in self: + somme=somme+indiv.score + while len(newself)<p: + m=m=random.randrange(0,len(self)) + x=self[m] + p=uniform(0,1) + if p<=x.score/somme: + newself.append(x) + return(newself) def reproduction(self,selection=selection_duel,enfant=mixage,p=n//2): newself=selection(self,p) @@ -91,7 +117,6 @@ class Population: newself.append(enfant(x,y)) return(newself) -print([random.randrange(1,10) for i in range(5)]) -- GitLab