Skip to content
Snippets Groups Projects
Commit 00b20b49 authored by Zhong Yi's avatar Zhong Yi
Browse files

Merge branch 'main' of gitlab-student.centralesupelec.fr:yi.zhong/ei into main

parents 184f85bb 2b1d3c82
No related branches found
No related tags found
No related merge requests found
......@@ -7,5 +7,8 @@ AGRANDISSEMENT = 5
nom_selection = "selection_roulette"
nom_croisement = "croisement_milieu"
List_of_genes = ["AA", "AC", "AG", "AT",
"TA", "CA", "CC", "CG", "GC", "CT"]
"TA", "CA", "CC", "CG", "GC", "CT"] # les gènes à modifier
Symetrique = {"AA": "TT", "AC": "TG", "AG": "TC", "AT": None,
"TA": None, "CA": "GT", "CC": "GG", "CG": None, "GC": None, "CT": "GA"} # les symétriques de ces gènes
pas = 10
......@@ -20,7 +20,9 @@ class Population:
def croisement(self, nom_croisement):
n = self.size
rd.shuffle(self.troupeau[1:])
nuls = self.troupeau[1:]
rd.shuffle(nuls)
self.troupeau[0]+nuls
# le meilleur reste à la première place pour éviter de le faire muter ensuite
for k in range(n//2):
self.troupeau = self.troupeau + \
......@@ -46,16 +48,16 @@ class Population:
score = scoreprovisoire
m = x
return m, score
def meilleur_distance(self, molecule):
score = inf
for x in self.troupeau:
scoreprovisoire = x.distance(molecule)
if scoreprovisoire < score:
score = scoreprovisoire
m = x
return m, score
score = inf
for x in self.troupeau:
scoreprovisoire = x.distance(molecule)
if scoreprovisoire < score:
score = scoreprovisoire
m = x
return m, score
def evaluate_moyenne(self, molecule):
score = 0
for x in self.troupeau:
......
......@@ -8,6 +8,7 @@ from .Constantes import *
import math
here = os_path.abspath(os_path.dirname(__file__))
class RotTable:
"""Represents a rotation table"""
......@@ -95,8 +96,8 @@ class RotTable:
xf = traj.getTraj()[n-AGRANDISSEMENT+i][0]
yf = traj.getTraj()[n-AGRANDISSEMENT+i][1]
zf = traj.getTraj()[n-AGRANDISSEMENT+i][2]
res = res + (xf-x0)**2 + (yf-y0)**2 + (zf-z0)**2
return res
res = res + ((xf-x0)**2 + (yf-y0)**2 + (zf-z0)**2)**(1/2)
return res/AGRANDISSEMENT
def evaluate2(self, molecule):
n = len(molecule)
......@@ -105,7 +106,7 @@ class RotTable:
i = rd.randint(1, n)
newmol = molecule[i:] + molecule[:i]
summ = summ + self.evaluate(newmol)
return summ
return summ/ALPHA
def evaluate_partout(self, molecule):
traj = Traj3D(False)
......@@ -212,26 +213,26 @@ class RotTable:
with open("meilleur_table.json", "w") as outfile:
json.dump(self.getTable(), outfile)
def is_good_table(self) :
for dinuc in List_of_genes :
if self.getTwist(dinuc) > RotTable.base_rot_table[dinuc][0] + RotTable.base_rot_table[dinuc][3] :
def is_good_table(self):
for dinuc in List_of_genes:
if self.getTwist(dinuc) > RotTable.base_rot_table[dinuc][0] + RotTable.base_rot_table[dinuc][3]:
return False
if self.getTwist(dinuc) < RotTable.base_rot_table[dinuc][0] - RotTable.base_rot_table[dinuc][3] :
if self.getTwist(dinuc) < RotTable.base_rot_table[dinuc][0] - RotTable.base_rot_table[dinuc][3]:
return False
if self.getWedge(dinuc) > RotTable.base_rot_table[dinuc][1] + RotTable.base_rot_table[dinuc][4] :
if self.getWedge(dinuc) > RotTable.base_rot_table[dinuc][1] + RotTable.base_rot_table[dinuc][4]:
return False
if self.getWedge(dinuc) < RotTable.base_rot_table[dinuc][1] - RotTable.base_rot_table[dinuc][4] :
if self.getWedge(dinuc) < RotTable.base_rot_table[dinuc][1] - RotTable.base_rot_table[dinuc][4]:
return False
if self.getDirection(dinuc) > RotTable.base_rot_table[dinuc][2] + RotTable.base_rot_table[dinuc][5] :
if self.getDirection(dinuc) > RotTable.base_rot_table[dinuc][2] + RotTable.base_rot_table[dinuc][5]:
return False
if self.getDirection(dinuc) < RotTable.base_rot_table[dinuc][2] - RotTable.base_rot_table[dinuc][5] :
if self.getDirection(dinuc) < RotTable.base_rot_table[dinuc][2] - RotTable.base_rot_table[dinuc][5]:
return False
if Symetrique[dinuc] is not None :
if self.getTwist(dinuc) != self.getTwist(Symetrique[dinuc]) :
if Symetrique[dinuc] is not None:
if self.getTwist(dinuc) != self.getTwist(Symetrique[dinuc]):
return False
if self.getWedge(dinuc) != self.getWedge(Symetrique[dinuc]) :
if self.getWedge(dinuc) != self.getWedge(Symetrique[dinuc]):
return False
if self.getDirection(dinuc) != self.getDirection(Symetrique[dinuc]) :
if self.getDirection(dinuc) != self.getDirection(Symetrique[dinuc]):
return False
return True
......
......@@ -164,11 +164,12 @@ def generation():
print("time :", time.time()-time0)
plt.figure(5)
plt.plot(gen, moy, label='moyenne')
plt.plot(gen, meilleur, label="meilleur")
plt.plot(gen, moy, label='score moyenne')
plt.plot(gen, meilleur, label="score meilleur")
plt.xlabel('génration')
plt.ylabel('distance (log)')
plt.yscale('log')
plt.grid()
plt.legend()
plt.savefig('data/evo.png')
......@@ -210,7 +211,8 @@ def main():
traj_final2.write("data/traj_final2.png")
print("time :", time.time()-time0)
def evolution_fitness():#evolution de la fitness au cours de l'évaluation
def evolution_fitness(): # evolution de la fitness au cours de l'évaluation
D = []
N = [i for i in range(nb_iter)]
rot_table = RotTable()
......@@ -235,9 +237,10 @@ def evolution_fitness():#evolution de la fitness au cours de l'évaluation
plt.legend()
plt.show()
plt.savefig("fitness au cours de l'evo.png")
#plt.close()
# plt.close()
def fitness_size():#evolution de la fitness au cours de l'évaluation
def fitness_size(): # evolution de la fitness au cours de l'évaluation
D = []
S = [int(1.5**i+10) for i in range(10)]
......@@ -268,10 +271,11 @@ def fitness_size():#evolution de la fitness au cours de l'évaluation
plt.legend()
plt.show()
plt.savefig("distance et size.png")
#plt.close()
# plt.close()
if __name__ == "__main__":
evolution_fitness()
# evolution_fitness()
'''
fitness_size()
main()
......@@ -279,3 +283,4 @@ if __name__ == "__main__":
tests_croisements()
tests_selection()
'''
generation()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment