def gen(dico_cube): """ applique l'algo gen a un dico pour construire la figure entree en parametres """ liste_fig = [] liste_c = g.liste_cube(dico_cube) for i in range(len(liste_c)): liste_fig.append(gf.init_fig(o.hauteur, o.largeur, o.longueur)) g.placer_cube((0, 0, 0), liste_c[i], liste_fig[i], dico_cube) i = 0 while (not (Mut.est_pleine(liste_fig)) and i < nb_iter_max): liste_pond = t.ponderation(liste_fig) place_p = t.choix_pond(liste_pond) porteuse = liste_fig.pop(place_p) place_d = t.choix_alea(liste_fig) donneuse = liste_fig.pop(place_d) porteuse_temp = porteuse donneuse_temp = donneuse #matrice 3D croismnt = C.croisement(porteuse_temp, donneuse_temp, dico_cube) mut = R.randint(1, 10) if (mut == 1 and Me.nb_cube(donneuse_temp)): Mut.mutation(porteuse_temp, liste_fig, dico_cube) if (Me.nb_cube(porteuse_temp) >= Me.nb_cube(porteuse) and croismnt): liste_fig.append(porteuse_temp) else: liste_fig.append(porteuse) if (Me.nb_cube(donneuse_temp) != 0 ): #on rement la donneuse dans la liste que si elle est non vide liste_fig.append(donneuse_temp) else: liste_fig.append(donneuse) if not (i % 100000): print(i) if (len(liste_fig) <= 2): for k in range(len(liste_c)): liste_fig.append(gf.init_fig(o.hauteur, o.largeur, o.longueur)) g.placer_cube((0, 0, 0), liste_c[k], liste_fig[k], dico_cube) liste_fig = gf.en_double(liste_fig) liste_fig = gf.doublon(liste_fig) i += 1 print("nombre d'iteration : {0}".format(i)) return liste_fig
def croisement(porteuse_temp, donneuse_temp, dico_cube): liste_cube_donn = gf.liste_cube_fig(donneuse_temp) #liste_cube_fig liste_pos_por = Mut.Pos_libre(porteuse_temp) ajouter = False cpt_c = 0 cpt_pos = 0 cpt_rot_x = 0 cpt_rot_y = 0 cpt_rot_z = 0 while (not ajouter and cpt_c < len(liste_cube_donn)): cube = dico_cube[liste_cube_donn[cpt_c]] while (not ajouter and cpt_pos < len(liste_pos_por)): while (not ajouter and cpt_rot_x < 3): while (not ajouter and cpt_rot_y < 3): while (not ajouter and cpt_rot_z < 3): ajouter = g.placer_cube(liste_pos_por[cpt_pos], liste_cube_donn[cpt_c], porteuse_temp, dico_cube) cube.rotation('Z', 1) cpt_rot_z += 1 cube.rotation('Y', 1) cpt_rot_y += 1 cube.rotation('X', 1) cpt_rot_x += 1 cpt_pos += 1 cpt_c += 1 return ajouter #croisement fait ou non ?
def mutation(figure, liste_fig, dico_cube): """ fait une mutation sur la figure """ cube_m = R.choice(gf.liste_cube_fig(figure)) #int g.retirer_cube_C(cube_m, figure, dico_cube) axe = R.choice(['X', 'Y', 'Z']) dico_cube[cube_m].rotation(axe, 2) place = False cpt = 0 position = Pos_libre(figure) while (not place and cpt < len(position)): place = g.placer_cube(position[cpt], cube_m, figure, dico_cube) cpt += 1 if (not place): liste_fig.append(gf.init_fig(o.hauteur, o.largeur, o.longueur)) g.placer_cube((0, 0, 0), cube_m, liste_fig[-1], dico_cube)
import definition_cube as d import ordres as o import gestion_cubes as g print g.faces_cubes print g.objets_cubes print g.objets_cubes[2].L_faces print g.Figure g.objets_cubes[2].rotation("X", 1) print g.objets_cubes[2].L_faces print g.objets_cubes[2].angle g.placer_cube((1, 1, 1), 24, g.Figure, g.objets_cubes) print('coordonnees de 24 : ', g.objets_cubes[24].X, g.objets_cubes[24].Y, g.objets_cubes[24].Z) print('voisins de 24 : ', g.objets_cubes[24].L_voisins) g.afficher_fig(g.Figure) g.placer_cube((1, 1, 0), 20, g.Figure, g.objets_cubes) print('coordonnees de 20 : ', g.objets_cubes[20].X, g.objets_cubes[20].Y, g.objets_cubes[20].Z) print('voisins de 20 : ', g.objets_cubes[20].L_voisins) print('voisins de 24 : ', g.objets_cubes[24].L_voisins) g.afficher_fig(g.Figure) g.placer_cube((1, 2, 0), 7, g.Figure, g.objets_cubes)
def gen(dico_cube): """ applique l'algo gen a un dico pour construire la figure entree en parametres """ liste_fig=[] liste_c= g.liste_cube(dico_cube) #print(liste_c) for i in range(len(liste_c)) : #print("ici") liste_fig.append(gf.init_fig(o.hauteur, o.largeur, o.longueur)) #print(dico_cube[liste_c[i]]) g.placer_cube((0, 0, 0), liste_c[i], liste_fig[i], dico_cube) #gf.afficher_fig(liste_fig[i]) i=0 while (not(Mut.est_pleine(liste_fig)) and i<nb_iter_max and len(liste_fig)>=2): #print("s") #print(i) #for j in liste_fig : # gf.afficher_fig(j) liste_pond=t.ponderation(liste_fig) place_p=t.choix_pond(liste_pond) porteuse=liste_fig.pop(place_p) place_d=t.choix_alea(liste_fig) donneuse=liste_fig.pop(place_d) porteuse_temp=porteuse donneuse_temp=donneuse#matrice 3D #gf.afficher_fig(porteuse_temp) #gf.afficher_fig(donneuse_temp) croismnt=C.croisement(porteuse_temp,donneuse_temp, dico_cube) mut= R.randint(1,10) if (mut==1 and Me.nb_cube(donneuse_temp)): Mut.mutation(porteuse_temp, liste_fig, dico_cube) if (Me.nb_cube(porteuse_temp)>=Me.nb_cube(porteuse) and croismnt): liste_fig.append(porteuse_temp) else: liste_fig.append(porteuse) if (Me.nb_cube(donneuse_temp)!=0):#on rement la donneuse dans la liste que si elle est non vide liste_fig.append(donneuse_temp) else: liste_fig.append(donneuse) if not(i%100): print(i) #print(len(liste_fig)) # gf.afficher_fig(porteuse_temp) # gf.afficher_fig(donneuse_temp) liste_fig=gf.en_double(liste_fig) liste_fig=gf.doublon(liste_fig) i+=1 #a chaque tour il faudrai enlever les figures en double et celle qui ont plusieur fois le meme cube return liste_fig
import mutation as Mut figure = gf.init_fig(o.hauteur, o.largeur, o.longueur) #print (g.faces_cubes) #print (g.objets_cubes) #print (g.objets_cubes[2].L_faces) #print (gf.Figure) #g.objets_cubes[2].rotation("X", 1) #print (g.objets_cubes[2].L_faces) #print (g.objets_cubes[2].angle) print(Mut.Pos_libre(figure)) g.placer_cube((0, 0, 0), 24, figure, g.objets_cubes) print('coordonnees de 24 : ', g.objets_cubes[24].X, g.objets_cubes[24].Y, g.objets_cubes[24].Z) print('voisins de 24 : ', g.objets_cubes[24].L_voisins) gf.afficher_fig(figure) print(Mut.Pos_libre(figure)) g.placer_cube((1, 1, 0), 20, figure, g.objets_cubes) print('coordonnees de 20 : ', g.objets_cubes[20].X, g.objets_cubes[20].Y, g.objets_cubes[20].Z) print('coordonnees de 24 : ', g.objets_cubes[24].X, g.objets_cubes[24].Y, g.objets_cubes[24].Z) print('voisins de 20 : ', g.objets_cubes[20].L_voisins)