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 :

probabilité de croisement dans un algorithme genetique


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 probabilité de croisement dans un algorithme genetique
    Bonjour
    s'il vous plait ,j'ai développé une fonction de croisement de deux individus et maintenant je veux entrer dans mon code une probabilité de croisement Pc=0.7
    mais je sais pas comment je vais modifier mon code pour prendre en considération la probabilité de croisement.
    Merci d'avance.
    voici le code de fonction de croisement:
    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):
                child=individu(self.nombre_genes)
                l = len(i1.genes)
                a = l / 2
                for i in range(0, int(a)):
                    child.genes[i]=i1.genes[i]
                for i in range( int(a), l):
                    child.genes[i]=i2.genes[i]
     
                return child

  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 quoi fait référence cette probabilité de croisement? A la probabilité que deux individus "se croisent", ou a la probabilité qu'un gène provienne de l'un ou de l'autre? Ou bien tout autre chose... C'est pas super clair.

  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 quoi fait référence cette probabilité de croisement? A la probabilité que deux individus "se croisent", ou a la probabilité qu'un gène provienne de l'un ou de l'autre? Ou bien tout autre chose... C'est pas super clair.
    Merci pour la réponse.
    En fait ,la probabilité de croisement correspond à la probabilité que deux individus "se croisent".

  4. #4
    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
    Et bien dans ce cas deux possibilités:
    1. On choisit s'il y a croisement avant l'appel de la méthode croisement_deux
    2. Ou on choisit s'il y a croisement après l'appel à la méthode

    Au choix en fonction de comment vous voulez architecturer votre programme.

    Pour faire un choix le plus simple est de faire appel au module random. On tire aléatoirement un nombre en 0 et 1 (tirage équiprobable). On fixe une limite, par exemple 0.7. Si le nombre généré est en dessous, alors croisement, sinon rien (d'ailleurs il faut définir ce rien).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from random import random
     
    probabilite_croisement = 0.7
    if random() < 0.7:
        print('Croisement')
    else:
        print('Rien')
    Si vous souhaitez faire ce test à l'intérieur de la méthode croisement_deux il va vous falloir définir ce qui se passe s'il n'y a pas de croisement. Qu'est-ce que cette méthode devrait renvoyer?

    J

  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 Julien N Voir le message
    Et bien dans ce cas deux possibilités:
    1. On choisit s'il y a croisement avant l'appel de la méthode croisement_deux
    2. Ou on choisit s'il y a croisement après l'appel à la méthode

    Au choix en fonction de comment vous voulez architecturer votre programme.

    Pour faire un choix le plus simple est de faire appel au module random. On tire aléatoirement un nombre en 0 et 1 (tirage équiprobable). On fixe une limite, par exemple 0.7. Si le nombre généré est en dessous, alors croisement, sinon rien (d'ailleurs il faut définir ce rien).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from random import random
     
    probabilite_croisement = 0.7
    if random() < 0.7:
        print('Croisement')
    else:
        print('Rien')

    Si vous souhaitez faire ce test à l'intérieur de la méthode croisement_deux il va vous falloir définir ce qui se passe s'il n'y a pas de croisement. Qu'est-ce que cette méthode devrait renvoyer?

    J
    Merci bien pour votre explication
    en fait ,j'ai modifié le code de la fonction croisement comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def croisement_deux (self , i1 , i2):
                child=individu(self.nombre_genes)
                l = len(i1.genes)
                Pc=0.7
                a = l / 2
                if random.random()<Pc:
                    for i in range(0, int(a)):
                        child.genes[i]=i1.genes[i]
                    for i in range( int(a), l):
                        child.genes[i]=i2.genes[i]
     
                return child
    Et j'ai fait appel à cette méthode dans la fonction ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def croisement_nombre (self ):
                    for v in self.individus:
    			print v.genes
                    new = []
    		for r in range(len(self.individus)):
    			v1 = random.randint (0 , len(self.individus)-1)
    			v2 = random.randint (0 , len(self.individus)-1)
    			new.append (self.croisement_deux (self.individus[v1] , self.individus[v2]) )
     
    		self.individus  = new
    est ce que c'est juste comme ca
    et en cas de non croisement(random.random()>Pc)est ce que je peux développer que la nouvelle population contient seulement les parents .
    Merci d'avance

  6. #6
    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
    Citation Envoyé par zeinab ali Voir le message
    est ce que c'est juste comme ca
    Presque. La méthode croisement_deux est sensée renvoyer quelque chose. Si un croisement à effectivement lieu elle renvoi un individu, sinon quoi? Telle qu'écrite en ce moment, la méthode ne renvoi rien. Ce n'est pas correct.

    Citation Envoyé par zeinab ali Voir le message
    et en cas de non croisement(random.random()>Pc)est ce que je peux développer que la nouvelle population contient seulement les parents .
    La condition de croisement est vérifiée à chaque croisement. Si la population totale fait 1000 individus, grosso modo 70 croisements auront lieux (en fait il faudrait plutôt dire, 70 enfants verront le jour). La "nouvelle population" ne pourra pas (et ne devrait pas) contenir seulement les parents. Je pense que vous voulez que la taille de la nouvelle population reste inchangée, et donc compléter avec des parents. Correct?

    Dans ce cas, on peut envisager de demander à la méthode croisement_deux de fournir aléatoirement un des deux parents s'il n'y a pas de croisement. Mais je ne trouve pas ça terrible. Dans un algo génétique, il doit y avoir les phases suivantes:
    1. Evaluation de la population (on attribut une note à chaque individu en fonction de sa performance)
    2. Sélection d'une fraction des meilleurs individus. On les place d'office dans la prochaine population.
    3. Croisement aléatoire des individus avec ou sans mutations.
    4. Génération éventuel de nouveaux individus aléatoires, histoire de donner du sang neuf à la population (et éviter de rester bloquer dans la convergence vers le "meilleur" individu)

    On s'assure que la taille de la population ne varie pas, sinon on risque quelques problèmes.

    Moi, je ferais une boucle while comme ceci (pseudo-code) à modifier et à placer dans la méthode appropriée:
    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
    # Liste des individus de la nouvelle population/génération
    # Initialement vide, elle contient désormais les individus issus de la sélection
    new_population = ...
    # La population précédente
    old_population = ...
     
    # On va générer autant d'enfants que nécessaire pour compléter la population
    while len(new_population) != len(old_population):
        # Tirage aléatoire des individus à croiser parmi la population précédente
        parent_1 = old_population[random.randint(0, len(old_population))]
        parent_2 = old_population[random.randint(0, len(old_population))]
        # Croisement
        child = self.croisement_deux(parent_1 , parent_2)
        # On gère le cas où rien ne se passe
        if child:
            new_population.append(child)
    La modification a apporter à croisement_deux serait minime (attention à utiliser des variables comme a, l, i1, i2... ici le code est court mais sinon un lecteur, vous éventuellement plus tard, sera bien en mal de comprendre ce veulent dire ces variables. Préférez des noms explicites comme child, parent, gene, etc...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def croisement_deux (self , i1 , i2, Pc=0.7):
        if random.random() < Pc:
            child = individu(self.nombre_genes)
            l = len(i1.genes)
            a = l / 2
            for i in range(0, int(a)):
                child.genes[i]=i1.genes[i]
            for i in range( int(a), l):
                child.genes[i]=i2.genes[i]
     
            return child
     
        return None
    J'ai pris la liberté de placer la variable Pc en argument. Cela pourrait aussi être un attribut de la classe. Il est préférable de définir les constantes ailleurs que dans la fonction/méthode elle-même. J'ai choisi de renvoyer None si aucun croisement n'a lieu. Dans votre code vous renvoyiez un nouvel individu généré aléatoirement... rien a voir avec un "croisement" .

    J

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

Discussions similaires

  1. Etape de croisement dans un algorithme génetique
    Par zeinab ali dans le forum Général Python
    Réponses: 23
    Dernier message: 01/09/2016, 20h59
  2. Croisement dans un algorithme genetique
    Par zeinab ali dans le forum Général Python
    Réponses: 3
    Dernier message: 30/08/2016, 09h04
  3. Utilisation de valeurs discretes dans l'algorithme genetique
    Par ziedhosn dans le forum Intelligence artificielle
    Réponses: 0
    Dernier message: 01/02/2013, 17h55
  4. 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
  5. calcul d'une fonction de probabilité dans un algorithme de colonie de fourmis!
    Par etdmi3 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 19/02/2009, 11h21

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