IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Etape de croisement dans un algorithme génetique


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 110
    Par défaut Etape de croisement dans un algorithme génetique
    Bonjour
    je vais détailler ma problème,s'il vous plait aider moi car la fonction croisement_deux ne marche pas
    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class individu:
    	def __init__ (self,nombre_genes,random=-1):
    		self.genes = []
    		self.nombre_genes = nombre_genes
    		if random == -1 : self.get_random ()
    	"""
            random : initialise aleatoirement les genes
            """
    	def get_random (self):
                self.genes=np.zeros(self.nombre_genes)
                for i in range(4):
                    while True:
                        j=random.randint(0,(self.nombre_genes-1))
                        if self.genes[j] == 0: break
                    self.genes[j]=1
     
     
                return self.genes
    maintenant,aprés une étape de sélection ,je veux faire le croisement entre deux individus par exemple i1 et i2 dans un autre classe population
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class population:
     
            def __init__(self,nombre_genes,nombre_initial_population=25):
                    self.nombre_genes=nombre_genes
                    self.individus=[]
                    self.nombre_initial_population=nombre_initial_population
                    for v in range(self.nombre_initial_population):
                            self.individus.append(individu(nombre_genes))
        def croisement_deux (self , i1 , i2,l):
    		a = l / 2
    		children=[]
    		father=i1.get_random()
    		mother=i2.get_random()
                    child1=father[:a]+mother[a:]
                    children.append(child1)
    		child2=mother[:a]+father[a:]
    		childrens.append(child2)
    		return children
    dans le programme principal,j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i1=individu(10)
    i2=individu(10)
    p=population(10,25)
    print p.croisement_deux (i1,i2,10)
    exemple
    i1=[0 .1 .0 .1 .1. /0. 0. 1 .0 .0] et i2=[0 .1 .1 .0 .0/. 0. 0. 1 .1.0]
    child1=[0 .1 .0 .1 .1. 0. 0. 1 .1 .0] et child2=[0 .1 .1 .0 .0.0. 0. 1 .0 .0]
    Merci d'avance

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    A mon humble avis il y a un problème de conception. Si je comprends bien l'exemple fourni, le croisement entre deux individus revient à créer deux enfants, le premier héritant de la première moitié du code génétique (ici les 0,1) d'un parent et la seconde moitié du second parent, tandis que le deuxième enfant hérite de la seconde moitié du premier parent et la première moitié du second parent. Pourquoi pas. Le problème immédiat c'est que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    child1=father[:a]+mother[a:]
    father et mother sont des objets Individu et non des listes. Utiliser le slicing ([:a]) ne doit pas fonctionner sauf si implémenté dans la classe Individu. Ensuite child ne doit pas être une liste mais une instance d'Individu..

    Il y a d'autres problèmes (notamment le slicing avec une variable a=l/2 qui peut ne pas être un entier ici et qui est bien sûr prohibé). Et pourquoi régénéré le code génétique des parents en faisant i1.get_random()? ça n'a pas de sens.

    Il faut à mon sens retravailler la classe Individu. Elle devrait soit avoir une méthode pour croiser deux individus, soit accepter un code génétique en paramètre. Il devrait y avoir aussi une méthode retournant le code génétique sous une forme ou une autre (pourquoi pas une liste). Il serait aussi possible de pousser plus loin le mimétisme avec un vrai organisme vivant: le code génétique (les 0s et 1s) pourrait être regroupés en "allèles" ce qui faciliterait les croisements.

    Ju

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 110
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Salut,

    A mon humble avis il y a un problème de conception. Si je comprends bien l'exemple fourni, le croisement entre deux individus revient à créer deux enfants, le premier héritant de la première moitié du code génétique (ici les 0,1) d'un parent et la seconde moitié du second parent, tandis que le deuxième enfant hérite de la seconde moitié du premier parent et la première moitié du second parent. Pourquoi pas. Le problème immédiat c'est que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    child1=father[:a]+mother[a:]
    father et mother sont des objets Individu et non des listes. Utiliser le slicing ([:a]) ne doit pas fonctionner sauf si implémenté dans la classe Individu. Ensuite child ne doit pas être une liste mais une instance d'Individu..

    Il y a d'autres problèmes (notamment le slicing avec une variable a=l/2 qui peut ne pas être un entier ici et qui est bien sûr prohibé). Et pourquoi régénéré le code génétique des parents en faisant i1.get_random()? ça n'a pas de sens.

    Il faut à mon sens retravailler la classe Individu. Elle devrait soit avoir une méthode pour croiser deux individus, soit accepter un code génétique en paramètre. Il devrait y avoir aussi une méthode retournant le code génétique sous une forme ou une autre (pourquoi pas une liste). Il serait aussi possible de pousser plus loin le mimétisme avec un vrai organisme vivant: le code génétique (les 0s et 1s) pourrait être regroupés en "allèles" ce qui faciliterait les croisements.

    Ju
    merci beaucoup

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 744
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Le problème immédiat c'est que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    child1=father[:a]+mother[a:]
    father et mother sont des objets Individu et non des listes. Utiliser le slicing ([:a]) ne doit pas fonctionner sauf si implémenté dans la classe Individu. Ensuite child ne doit pas être une liste mais une instance d'Individu..
    father et mother sont fabriqués par i1.get_random() et i2.get_random() qui retournent des tableaux numpy:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	def get_random (self):
                self.genes=np.zeros(self.nombre_genes)
                for i in range(4):
                    while True:
                        j=random.randint(0,(self.nombre_genes-1))
                        if self.genes[j] == 0: break
                    self.genes[j]=1
                return self.genes
    Ceci dit la somme de tableau numpy de longueur N, c'est un tableau de longueur N ou a été fait la somme de chaque élément:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> b = np.ones(5)
    >>> a = np.ones(5)
    array([ 1.,  1.,  1.])
    >>> a[:3] + b[:3]
    array([ 2.,  2.,  2.])
    >>>
    => Ce n'est pas la concaténation de 2 tableaux comme montré dans le post initial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i1=[0 .1 .0 .1 .1. /0. 0. 1 .0 .0] et i2=[0 .1 .1 .0 .0/. 0. 0. 1 .1.0]
    child1=[0 .1 .0 .1 .1. 0. 0. 1 .1 .0] et child2=[0 .1 .1 .0 .0.0. 0. 1 .0 .0]
    Dire:
    Citation Envoyé par zeinab ali Voir le message
    Bonjour
    je vais détailler ma problème,s'il vous plait aider moi car la fonction croisement_deux ne marche pas
    voici mon code:
    sans expliquer ce qui ne fonctionne pas ni poster un code qui permette de reproduire quoi que ce soit ne va pas aider.

    note: en plus le code doit planter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            def croisement_deux (self , i1 , i2,l):
    		a = l / 2
    		children=[]
    		father=i1.get_random()
    		mother=i2.get_random()
                    child1=father[:a]+mother[a:]
                    children.append(child1)
    		child2=mother[:a]+father[a:]
    		childrens.append(child2)
    		return children
    à cause du "s" qui traîne dans certains children.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 110
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    father et mother sont fabriqués par i1.get_random() et i2.get_random() qui retournent des tableaux numpy:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	def get_random (self):
                self.genes=np.zeros(self.nombre_genes)
                for i in range(4):
                    while True:
                        j=random.randint(0,(self.nombre_genes-1))
                        if self.genes[j] == 0: break
                    self.genes[j]=1
                return self.genes
    Ceci dit la somme de tableau numpy de longueur N, c'est un tableau de longueur N ou a été fait la somme de chaque élément:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> b = np.ones(5)
    >>> a = np.ones(5)
    array([ 1.,  1.,  1.])
    >>> a[:3] + b[:3]
    array([ 2.,  2.,  2.])
    >>>
    => Ce n'est pas la concaténation de 2 tableaux comme montré dans le post initial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i1=[0 .1 .0 .1 .1. /0. 0. 1 .0 .0] et i2=[0 .1 .1 .0 .0/. 0. 0. 1 .1.0]
    child1=[0 .1 .0 .1 .1. 0. 0. 1 .1 .0] et child2=[0 .1 .1 .0 .0.0. 0. 1 .0 .0]
    Dire:


    sans expliquer ce qui ne fonctionne pas ni poster un code qui permette de reproduire quoi que ce soit ne va pas aider.

    note: en plus le code doit planter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            def croisement_deux (self , i1 , i2,l):
    		a = l / 2
    		children=[]
    		father=i1.get_random()
    		mother=i2.get_random()
                    child1=father[:a]+mother[a:]
                    children.append(child1)
    		child2=mother[:a]+father[a:]
    		childrens.append(child2)
    		return children
    à cause du "s" qui traîne dans certains children.

    - W
    Merci bien mais ma probléme n'est pas résolue.
    j'ai essayé le maximum de résoudre mes erreurs seul mais j'ai echoué ,S'il vous plait ,pouvez vous m'aider
    je vais détailler plus:

    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class individu:
    	def __init__ (self,nombre_genes,random=-1,genes=[]):
    		self.genes = []
    		self.nombre_genes = nombre_genes
    		if random == -1 : self.get_random (genes)
    	"""
            random : initialise aleatoirement les genes
            """
    	def get_random (self,s):
                self.genes=s    
                self.genes=np.zeros(self.nombre_genes)
                for i in range(4):
                    while True:
                        j=random.randint(0,(self.nombre_genes-1))
                        if self.genes[j] == 0: break
                    self.genes[j]=1
    mon But est de faire croiser deux individus de cette classe par exemple i1=[1.0.0.1.0/.0.1.1.0.0] et i2=[0.1.0.1.0/.0.1.0.1.0.] donc child=1er moitie de i1 et 2eme moitié pour i2
    child=[1.0.0.1.0.0.1.0.1.0.]
    Dans une autre classe population,j'écris le code de fonction croisement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    class population:
     
            def __init__(self,nombre_genes,nombre_initial_population=25):
                    self.nombre_genes=nombre_genes
                    self.individus=[]
                    self.nombre_initial_population=nombre_initial_population
                    for v in range(self.nombre_initial_population):
                            self.individus.append(individu(nombre_genes))
    def croisement_deux (self , i1 , i2):
    		i = individu (self.nombre_genes)
    		l = len(i1.genes)
    		a = l / 2
    		first_segment = i1.genes[:a]
    		last_segment  = []
    		for i in range(len(i2.genes)) :
                        if i2.genes[i] not in first_segment :
                                last_segment.append(i2.genes[i])
                    i.genes=last_segment+first_segment
     
    		return i
    mais j'ai l'erreur suivant:i.genes=last_segment+first_segment
    value error=operand could not broad cast together with shape (0,)et (5,0),je sais que cette erreur veut dire que les deux listes n'ont pas la même dimension mais je sais pas comment le résoudre.
    Merci beaucoup d'avance

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 744
    Par défaut
    Salut,

    Citation Envoyé par zeinab ali Voir le message
    mais j'ai l'erreur suivant:i.genes=last_segment+first_segment
    value error=operand could not broad cast together with shape (0,)et (5,0),je sais que cette erreur veut dire que les deux listes n'ont pas la même dimension mais je sais pas comment le résoudre.
    Si vous pensez listes pourquoi utiliser des array numpy?
    concaténer des listes de taille différentes se fait très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> [0, 0, 0] + [1,1]
    [0, 0, 0, 1, 1]
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 110
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Si vous pensez listes pourquoi utiliser des array numpy?
    concaténer des listes de taille différentes se fait très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> [0, 0, 0] + [1,1]
    [0, 0, 0, 1, 1]
    >>>
    - W
    salut,
    en fait,la valeur retournée par la fonction get_random() est de type array numpy
    mais first_segment et last_segment sont des listes
    pour verifier ca ,lorsque j'ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a=last_segment.tolist()
                    b=first_segment.tolist()
                    i.genes=a+b
    j'ai cette message:Attribute error:'list' object has no attribute 'tolist'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Croisement dans un algorithme genetique
    Par zeinab ali dans le forum Général Python
    Réponses: 3
    Dernier message: 30/08/2016, 09h04
  2. Nombres parfaits : petite erreur dans l'algorithme
    Par katrena99 dans le forum Pascal
    Réponses: 6
    Dernier message: 27/01/2014, 22h36
  3. Aide dans un Algorithme de croisement en C
    Par Zikou123 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 30/11/2010, 20h10
  4. perdu dans l'algorithme de la tour de Hanoi
    Par johnny3 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/07/2008, 18h30
  5. Erreur dans mon algorithme
    Par quaresma dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 25/05/2007, 10h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo