diff --git a/__pycache__/individu.cpython-37.pyc b/__pycache__/individu.cpython-37.pyc index b5e349ab4911f800f7576808eaf3ee7522919618..3ef8c96f9616f2b5975f79ca003e59c0324ae6ae 100644 Binary files a/__pycache__/individu.cpython-37.pyc and b/__pycache__/individu.cpython-37.pyc differ diff --git a/__pycache__/population.cpython-37.pyc b/__pycache__/population.cpython-37.pyc index a2d00a0f413706a094887ce7f0dfe4f1e70ccd5f..f5ff9c148a75706fba3a62595b561aadc6eb2256 100644 Binary files a/__pycache__/population.cpython-37.pyc and b/__pycache__/population.cpython-37.pyc differ diff --git a/population.py b/population.py index 618126d9c9589a39ab2ccd3748595efb0fc63e43..fbb42effbc6b0041a630273b7b0eee5e5c72e396 100644 --- a/population.py +++ b/population.py @@ -5,16 +5,20 @@ from croisement import croisement_un_point, croisement_deux_points import copy class Population: + + #Class initialization def __init__(self,n): self.indiv=[Individu(RotTable()) for k in range (n)] self.n = n - + + #Updates the current individuals in the population def modifier_population(self, liste_individus): """Fonction qui renvoie une nouvelle instance de population a partir d'une liste d'individus""" self.n = len(liste_individus) self.indiv = liste_individus return self + #Select a fixed number of individuals in a population def selection_p_best(self,p=None): if p==None: p=(self.n)//2 @@ -23,7 +27,7 @@ class Population: individus_selectionnes = [element for element in liste_individus[:p]] self = self.modifier_population(individus_selectionnes) - + #Select via comparing two random individuals with some randomness involved and compared def selection_duel_pondere(self,p=None): if p == None : p = (self.n)//2 @@ -33,7 +37,8 @@ class Population: meilleur = individu newself=[meilleur] m=randrange(0,self.n) - t=randrange(0,self.n) #méthode des duels pondérée: si x=10 et y=1, y a une chance sur 11 de passer + t=randrange(0,self.n) + #méthode des duels pondérée: si x=10 et y=1, y a une chance sur 11 de passer non_vu = [i for i in range(0, self.n)] while len(newself)<p: m = choice(non_vu) @@ -50,6 +55,7 @@ class Population: self = self.modifier_population(newself) + #Selection via comparing the player`s score randomly def selection_duel(self,p=None): if p == None : p = (self.n)//2 @@ -75,8 +81,7 @@ class Population: newself.append(y) self = self.modifier_population(newself) - - + #Selection using a random method to select players based on their rank in score def selection_par_rang(self,p = None): if p == None : p = (self.n)//2 @@ -97,6 +102,7 @@ class Population: self = self.modifier_population(individus_selectionnes) + #Selecting using a random method that takes the score into ponderation def selection_proportionnelle(self,p= None): if p == None : p = (self.n)//2 @@ -116,8 +122,12 @@ class Population: newself.append(x) self = self.modifier_population(newself) + #The Function that makes the selection and reduces the quantity of players + #and after reproduces and mutates the remaining ones into a new population def reproduction(self,proba_mutation = None, selection=None,enfant=croisement_un_point, p = None): liste_selections = [self.selection_p_best, self.selection_duel_pondere, self.selection_duel, self.selection_par_rang, self.selection_proportionnelle] + + #Values of variables if there are no initial conditions if proba_mutation == None : proba_mutation = 0.001 if selection == None : @@ -126,14 +136,19 @@ class Population: selection = liste_selections[selection] if p == None : p = (self.n)//2 + + vieille_taille = self.n selection(p) newself = [element for element in self.indiv] while len(newself)<vieille_taille: m=randrange(0,self.n) t=randrange(0,self.n) + #We have to make a deep copy so we dont lose the values of the parents x=copy.deepcopy(newself[m]) y=copy.deepcopy(newself[t]) + + #Creation of the childs couple_enfant = enfant(x,y) for child in couple_enfant : child.mutation_close_values(proba_mutation, number_of_mutations = 2) @@ -142,40 +157,15 @@ class Population: newself.append(couple_enfant[1]) self = self.modifier_population(newself) - +#Prints the current population(used for debugging) def afficher(popu): for individu in popu.indiv : print("\n individu \n") # print(individu.table.rot_table) print ("score", individu.score) - -def test(): - popu = Population(4) - print("\n POPULATION INITIALE \n") - for individu in popu.indiv : - individu.evaluate() - afficher(popu) - popu.reproduction(selection = popu.selection_duel) - print("\n REPRODUCTION \n") - afficher(popu) - -#test() -def test2(): - popu = Population(10) - for individu in popu.indiv : - lineList = [line.rstrip('\n') for line in open("plasmid_8k.fasta")] - brin = ''.join(lineList[1:]) - individu.evaluate() - print("\n \n POPULATION INITIALE \n \n") - afficher(popu) - popu.selection_proportionnelle() - print("\n\nAPRES SELECTION \n\n") - afficher(popu) - -# test2()