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