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

  1. #1
    Membre du Club
    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
    Points : 51
    Points
    51
    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 éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    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 : 654
    Points : 1 150
    Points
    1 150
    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 du Club
    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
    Points : 51
    Points
    51
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    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 du Club
    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
    Points : 51
    Points
    51
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    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 du Club
    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
    Points : 51
    Points
    51
    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'

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par zeinab ali Voir le message
    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'
    Dans le dernier code que vous avez posté last_segment est une liste mais first_segment est toujours un array numpy.
    Je vous ai demandé pourquoi utiliser un array numpy alors que vous n'avez besoin que de listes: vous répondez à côté.

    Si vous voulez qu'on vous aide, il faut qu'on puisse comprendre. Et pour comprendre, il faut pouvoir reproduire.
    Donc postez un code permettant de reproduire l'erreur et l'erreur remontée par Python (qui donne le numéro de ligne où çà pète)...

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

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    vous pouvez faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    n=len(i1)=len(i2)
    i1=[0 .1 .0 .1 .1. 0. 0. 1 .0 .0] 
    i2=[0 .1 .1 .0 .0. 0. 0. 1 .1. 0]
    child1=[]
    child2=[]
     
    for i in range(0, int(n/2)):
    child1.append(i1(i)) 
     
    for i in range( int(n/2), len(i2)):
    child1.append(i2(i))
    et pour le child2 c'est la meme chose

  10. #10
    Membre du Club
    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
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par hichem0550 Voir le message
    Bonjour,

    vous pouvez faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    n=len(i1)=len(i2)
    i1=[0 .1 .0 .1 .1. 0. 0. 1 .0 .0] 
    i2=[0 .1 .1 .0 .0. 0. 0. 1 .1. 0]
    child1=[]
    child2=[]
     
    for i in range(0, int(n/2)):
    child1.append(i1(i)) 
     
    for i in range( int(n/2), len(i2)):
    child1.append(i2(i))
    et pour le child2 c'est la meme chose
    Merci bien
    aprés l'exécution de votre code j'ai l'erreur suivant:
    child1.append(i1(i))
    Attribute Error:individu instance has no_call_method

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par zeinab ali Voir le message
    aprés l'exécution de votre code j'ai l'erreur suivant:
    child1.append(i1(i))
    Attribute Error:individu instance has no_call_method
    Si vous postiez un code qui fonctionne plutôt que le copie&coller de bouts de code, cela permettrait aux débutants qui essaient de vous aider de vérifier/tester leur code avant de vous le proposer. Relisez le code: la première instruction (n=len(i1)=len(i2)) c'est déjà n'importe quoi.

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

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous postiez un code qui fonctionne plutôt que le copie&coller de bouts de code, cela permettrait aux débutants qui essaient de vous aider de vérifier/tester leur code avant de vous le proposer. Relisez le code: la première instruction (n=len(i1)=len(i2)) c'est déjà n'importe quoi.

    - W

    Bonjour,

    Mais j'ai écrit le code sous Format algorithmique, voici la syntaxe pour python:

    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
     
    i1=[0, 1 ,0 ,1 ,1, 0, 0, 1 ,0 ,0] 
    i2=[0 ,1 ,1 ,0 ,0, 0, 0, 1 ,1, 0]
    n=len(i1)
     
    child1=[]
    child2=[]
     
    for i in range(0, int(n/2)):
        child1.append(i1[i])
     
     
    for i in range( int(n/2), len(i2)):
        child1.append(i2[i])
     
    print child1
    et vous fait la même chose pour child2.

  13. #13
    Membre du Club
    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
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous postiez un code qui fonctionne plutôt que le copie&coller de bouts de code, cela permettrait aux débutants qui essaient de vous aider de vérifier/tester leur code avant de vous le proposer. Relisez le code: la première instruction (n=len(i1)=len(i2)) c'est déjà n'importe quoi.

    - W
    Merci pour vos remarques.
    en fait,j'ai modifié une peu le code donné par ca
    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
    def croisement_deux (self , i1 , i2):
    		children=[]
    		child1=[]
    		child2=[]
    		n=len(i1.genes)
    		for i in range(0, int(n/2)):
                            child1.append(i1(i))
                    for i in range( int(n/2), len(i2)):
                            child1.append(i2(i))
                    children.append(child1)
                    for i in range(0, int(n/2)):
                            child2.append(i2(i))
                    for i in range( int(n/2), len(i2)):
                            child2.append(i1(i))
                    children.append(child2)
                    return children
    mais jusqu'à maintenant j'ai pas réussi de faire le croisement
    je sais pas comment je vais vous renseigner mes erreurs qui se trouve dans l'invite de commande,je suis obligé de les écrire
    j'ai toujours le même erreur
    child1.append(i1(i))
    Attribute Error:individu instance has no_call_method

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par zeinab ali Voir le message
    Merci pour vos remarques.
    en fait,j'ai modifié une peu le code donné par ca
    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
    def croisement_deux (self , i1 , i2):
    		children=[]
    		child1=[]
    		child2=[]
    		n=len()
    		for i in range(0, int(n/2)):
                            child1.append(i1(i))
                    for i in range( int(n/2), len(i2)):
                            child1.append(i2(i))
                    children.append(child1)
                    for i in range(0, int(n/2)):
                            child2.append(i2(i))
                    for i in range( int(n/2), len(i2)):
                            child2.append(i1(i))
                    children.append(child2)
                    return children
    mais jusqu'à maintenant j'ai pas réussi de faire le croisement
    je sais pas comment je vais vous renseigner mes erreurs qui se trouve dans l'invite de commande,je suis obligé de les écrire
    j'ai toujours le même erreur
    child1.append(i1(i))
    Attribute Error:individu instance has no_call_method
    Mais c'est quoi i1.genes

  15. #15
    Membre du Club
    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
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par hichem0550 Voir le message
    Mais c'est quoi i1.genes
    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
    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
     
     
                return self.genes
    i1.genes(=self.genes) dans le code ci-dessus est le tableau qui contient les genes d'un individu i1.genes=[0 .1 .0 .1 .1. 0. 0. 1 .0 .0]
    Merci d'avance

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par zeinab ali Voir le message
    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
    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
     
     
                return self.genes
    i1.genes(=self.genes) dans le code ci-dessus est le tableau qui contient les genes d'un individu i1.genes=[0 .1 .0 .1 .1. 0. 0. 1 .0 .0]
    Merci d'avance

    Vous avez fait child1.append(i1(i))

    Remplacez () par [] dans la fonction append

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Vous pouvez voir ça et l'exécuter à part :
    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
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    i11=[0, 1 ,0 ,1 ,1, 0, 0, 1 ,0 ,0] 
    i22=[0 ,1 ,1 ,0 ,0, 0, 0, 1 ,1, 0]
     
     
    def croisement_deux (i1 , i2):
        children=[]
        child1=[]
        child2=[]
        n=len(i1)
        for i in range(0, int(n/2)):
            child1.append(i1[i])
     
        for i in range( int(n/2), len(i2)):
            child1.append(i2[i])
     
        for i in range(0, int(n/2)):
            child2.append(i2[i])
     
        for i in range(int(n/2), len(i2)):
            child2.append(i1[i]) 
     
     
        return child1, child2
     
     
    print croisement_deux(i11, i22)

  18. #18
    Membre du Club
    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
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par hichem0550 Voir le message
    Vous avez fait child1.append(i1(i))

    Remplacez () par [] dans la fonction append
    lorsque je remplace () par []
    j'ai cet erreur
    child1.append(i1[i])
    Attribute Error:individu instance has no attribute '_getitem_'
    j'ai pas compris ces erreurs

  19. #19
    Membre du Club
    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
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par hichem0550 Voir le message
    Vous pouvez voir ça et l'exécuter à part :
    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
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    i11=[0, 1 ,0 ,1 ,1, 0, 0, 1 ,0 ,0] 
    i22=[0 ,1 ,1 ,0 ,0, 0, 0, 1 ,1, 0]
     
     
    def croisement_deux (i1 , i2):
        children=[]
        child1=[]
        child2=[]
        n=len(i1)
        for i in range(0, int(n/2)):
            child1.append(i1[i])
     
        for i in range( int(n/2), len(i2)):
            child1.append(i2[i])
     
        for i in range(0, int(n/2)):
            child2.append(i2[i])
     
        for i in range(int(n/2), len(i2)):
            child2.append(i1[i]) 
     
     
        return child1, child2
     
     
    print croisement_deux(i11, i22)
    oui ,j'ai fait ça appart dans le python shell mais je sais pas pourquoi il ne fonctionne pas le fichier sim.py
    lorsque j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a=algo_gen.individu(10)
    	b=algo_gen.individu(10)
    p = algo_gen.population (10,25)
    	print p.croisement_deux(a,b)

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2015
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par zeinab ali Voir le message
    oui ,j'ai fait ça appart dans le python shell mais je sais pas pourquoi il ne fonctionne pas le fichier sim.py
    lorsque j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a=algo_gen.individu(10)
    	b=algo_gen.individu(10)
    p = algo_gen.population (10,25)
    	print p.croisement_deux(a,b)

    dis moi c'est quoi a, b

    le résultat de p ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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