algorithme de génétique
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

algorithme de génétique



  1. #1
    Azghar

    algorithme de génétique


    ------

    bonjour
    je travail actuellement sur un programme qui modélise l'évolution d'une population de fusées essayant d'atteindre un point, et ayant un adn soumis aux mutations à chaque nouvelle génération.

    J'ai une erreur à la ligne 29 et je ne la comprend pas : TypeError: list indices must be integers or slices, not numpy.float64
    alors qu'à cette ligne j'ai bien un entier en indice de liste, j'ai revérifié
    Avez vous une idée?
    Code:
    import matplotlib.pyplot as plt 
    import numpy as np 
    from random import uniform
    from random import randint
    from matplotlib import animation
    
    
    lifetime=500
    n=50 #individus par génération
    class rocket:
    	def __init__(self):
    		self.n = 6
    		self.seq = np.zeros((self.n,lifetime)) #sequence d amorcage
    		self.seq[0,:] = [1 for i in range(lifetime)]
    		self.dir = [-pi/2,0,0,0,0,0]  #orientation des rockets
    		self.v = [0,0]
    		self.pos = [100,0]
    		self.step = 0  #nombre d etapes
    		self.state = 'alive'
    		#[nombre de rockets compris entre 1 et 8;
    		#sequence de propulsion compris entre 1 et 10;
    		#direction de propulsion des rockets]
    	def force(self):
    		F_result = [0,0]
    		for i in range (self.n):
    			if self.state == 'alive' and self.seq[i,self.step]>0:
    				F_result[0]+=-sin(self.dir[self.seq[i,self.step]-1])
    				F_result[1]+=-cos(self.dir[self.seq[i,self.step]-1])
    		return F_result
    
    	def mutation(self):
    		if randint(0,100)<10:
    			self.seq[randint(0,self.n),randint(0,lifetime)] = randint(0,self.n + 1)
    		if randint(0,100)<10:
    			self.dir[randint(0,5)] = uniform(0,pi)
    
    	def maj_vit(self,Force):
    		self.v=[Force[0]+self.v[0],Force[1]+self.v[1]]
    	def maj_pos(self):
    		self.pos=[self.v[0]+self.pos[0],self.v[1]+self.pos[1]]
    	def score(self):
    		objectif = [450,450]
    		distance = sqrt((self.pos[0]-objectif[0])**2+(self.pos[1]-objectif[1])**2)
    		score = 1/(distance+0.01) - self.step
    		return score
    	def collide(self):
    		self.v = [0,0]
    		self.state = 'dead'

    -----
    Dernière modification par Azghar ; 19/12/2016 à 01h55.
    Dobson 200/1200

  2. #2
    pm42

    Re : algorithme de génétique

    Quand tu fais
    Code:
    self.seq = np.zeros((self.n,lifetime))
    , cela te renvoie un tableau de 0 en float64 (voir https://docs.scipy.org/doc/numpy/ref...mpy.zeros.html).

    Ligne 29, ton
    Code:
    self.dir[self.seq
    est donc bien en train d'utiliser un float64 pour indexer self.dir je pense mais je viens de me réveiller.

  3. #3
    Azghar

    Re : algorithme de génétique

    Oui si tu isoles ce morceau de code tu as parfaitement raison, mais le problème c'est que la ligne 29 ne se finit pas ainsi.
    Quand on regarde, je prend qu'un élément de self.seq (qui est un tableau) et je lui enlève -1. Tout cela devient l'indice de self.dir
    Dobson 200/1200

  4. #4
    pm42

    Re : algorithme de génétique

    En effet, j'étais bien mal réveillé. Tu utilises quoi comme version de python ? Je viens d'essayer avec une 2.7 et ton code passe sans message d'erreur.

  5. A voir en vidéo sur Futura
  6. #5
    Azghar

    Re : algorithme de génétique

    j'utilise python 3 mais att je met le code en entier, dis moi si tu as une erreur :
    Code:
    import matplotlib.pyplot as plt 
    from math import*
    import numpy as np 
    from random import uniform
    from random import randint
    from matplotlib import animation
    import matplotlib as mpl
    
    
    lifetime=500
    n=50 #individus par génération
    class rocket:
    	def __init__(self):
    		self.n = 6
    		self.seq = np.zeros((self.n,lifetime)) #sequence d amorcage
    		self.seq[0,:] = [1 for i in range(lifetime)]
    		self.dir = [-pi/2,0,0,0,0,0]  #orientation des rockets
    		self.v = [0,0]
    		self.pos = [100,0]
    		self.step = 0  #nombre d etapes
    		self.state = 'alive'
    		#[nombre de rockets compris entre 1 et 8;
    		#sequence de propulsion compris entre 1 et 10;
    		#direction de propulsion des rockets]
    	def force(self):
    		F_result = [0,0]
    		for i in range (self.n):
    			if self.state == 'alive' and self.seq[i,self.step]>0:
    				F_result[0]+=-sin(self.dir[self.seq[i,self.step]-1])
    				F_result[1]+=-cos(self.dir[self.seq[i,self.step]-1])
    		return F_result
    
    	def mutation(self):
    		if randint(0,100)<10:
    			self.seq[randint(0,self.n),randint(0,lifetime)] = randint(0,self.n + 1)
    		if randint(0,100)<10:
    			self.dir[randint(0,5)] = uniform(0,pi)
    
    	def maj_vit(self,Force):
    		self.v=[Force[0]+self.v[0],Force[1]+self.v[1]]
    	def maj_pos(self):
    		self.pos=[self.v[0]+self.pos[0],self.v[1]+self.pos[1]]
    	def score(self):
    		objectif = [450,450]
    		distance = sqrt((self.pos[0]-objectif[0])**2+(self.pos[1]-objectif[1])**2)
    		score = 1/(distance+0.01) - self.step
    		return score
    	def collide(self):
    		self.v = [0,0]
    		self.state = 'dead'
    	
    
    def new_pop(best_element,n):
    	new_pop = []
    	for i in range(n):
    		element = best_element
    		element.v = [0,0]
    		element.pos = [0,100]
    		element = element.mutation()
    		new_pop.append(element)
    	return new_pop
    
    def step(pop):
    	global lifetime,n
    	if pop[0].step == (lifetime-1):
    		S = 0
    		for i in(pop):
    			if pop[i].score>S:
    				S = pop[i].score
    				indice = i
    		pop = new_pop(pop[indice],n)
    	for i in range(n):
    		X=pop[i].force()
    		pop[i].maj_vit(X)
    		pop[i].maj_pos()
    		pop[i].step = pop[i].step + 1
    		if pop[i].pos[0]<0 or pop[i].pos[0]>500:
    			pop[i].collide()
    		elif pop[i].pos[1]<0 or pop[i].pos[0]>500:
    			pop[i].collide()
    	return pop
    
    population = []
    for i in range(n):
    	element = rocket()
    	population.append(element)
    
    
    
    
    fig, ax = plt.subplots(figsize=(15,15))
    
    ax.set_ylim([0,500])
    ax.set_xlim([0,500])
    
    
    def updatefig(i,fig,pop,scat):
        global n
        step(pop)
        for i in range(n):
            scat.set_offsets(([pop[i].pos[0],pop[i].pos[1]]))
        return scat,
    
    x = [100 for i in range(n)]
    y = [0 for i in range(n)]
    scat = plt.scatter(x,y,c=x)
    
    anim = animation.FuncAnimation(fig, updatefig, fargs = (fig,population, scat), interval=10, blit=True)
    
    plt.show()
    Là tu devrais avoir l"'erreur normalement
    Dobson 200/1200

  7. #6
    pm42

    Re : algorithme de génétique

    Oui, là je l'ai mais je suis au boulot et je manque de temps pour creuser.
    Je te dis quand j'ai trouvé si personne ne s'est dévoué avant.

  8. #7
    Azghar

    Re : algorithme de génétique

    visiblement ça n'inspire pas grand monde
    Dobson 200/1200

  9. #8
    minushabens

    Re : algorithme de génétique

    je ne connais pas ce langage mais n'as-tu pas une fonction de conversion de flottant à entier? apparemment il te dit que tu utilises un flottant là où il attend un entier (ou un "slice" qu'est-ce que c'est que ça?)

  10. #9
    Azghar

    Re : algorithme de génétique

    si tu as raison j'y ai pensé, il existe la fonction int()
    mais
    Si imaginons le flottant que je veux convertir vaut 5.999 et que je fais int(5.999) il me renverrait 5, ce que je ne veux pas.
    Et je ne connais pas d'autres fonctions

    pour le slice , je n'ai auucune idée de ce que c'est,
    pour le langage c'est du python
    Dernière modification par Azghar ; 20/12/2016 à 13h42.
    Dobson 200/1200

  11. #10
    minushabens

    Re : algorithme de génétique

    si tu as une fonction int() qui renvoie le plus grand entier plus petit que x et que tu veux l'entier le plus proche, tu peux toujours faire int(x+1/2)

  12. #11
    Azghar

    Re : algorithme de génétique

    ah ouais pas bête, j'ai modifié du coup les deux lignes en questions mais maintenant j'ai une erreur à la ligne 68:
    if pop[i].score()>S:
    TypeError: list indices must be integers or slices, not rocket

    Je comprend pas, pop[i] est de type rocket, mais pop[i].score() est un float normalement
    Dobson 200/1200

Discussions similaires

  1. Algorithme génétique
    Par speed_01 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 21/04/2019, 19h46
  2. Contrôleur à base de l'algorithme génétique et la logique floue
    Par Rita.. dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 28/12/2014, 12h42
  3. Algorithme génétique
    Par invitea0ca9b75 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 14/03/2011, 11h56
  4. algorithme génétique??
    Par invite3d929e79 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 05/03/2010, 19h04
  5. algorithme génétique
    Par enjie dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 31/12/2008, 17h47