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

Algorithmes et structures de données Discussion :

croiser 2 listes (algo génétique)


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut croiser 2 listes (algo génétique)
    Bonsoir,

    Dans le cadre d'algorithme génétique, je dois créer une fonction qui croise deux listes selon une probabilité donnée mais en fait je ne vois pas trop comment faire... si quelqu'un pouvait me guider...

    En entrée de la fonction, je pense qu'il faut déja les 2 listes "parents" + la probabilité donnée et en sortie on a donc une liste "enfant".

    Mais je sais pas trop comment partir...

    Merci
    Bonne soirée...


    Ps : en espérant être dans le bon forum, sinon désolez...

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    je suppose que pour une liste à n éléments, tu choisit au hasart x éléments dans la liste mère et n-x éléments dans la liste "père" , et tu les compile en une seule liste enfant. sauf, si un morceau de chaque élément de chaque liste doit se mélanger à l'élément de l'autre liste avant de donner la liste enfant (un peu comme dans le génétisme animal) auquel cas il faudrais nous donner quelles sont tes contraintes de césure et de réassemblage .


    salut
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    qu'est ce que tu entends par "selon une probabilité deonnée" ?? comme je le comprend, je ferais un simple truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    liste resultat <- []
    de i=1 a tailleDeLaListe
       tire un nombre n au hasard entre 0 et 1
       si n < probabilité
          resultat[i] <- liste1[i]
       sinon
          resultat[i] <- liste2[i]
       fin si
    fin de
     
    return resultat

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    et bien en fait ce que j'ai compris moi, c'est qu'il faut intervertir les éléments des 2 listes parents selon une probabilité, donc par exemple si la probabilité est 0,5
    on prend 1 sur 2...

    Enfin c'est ce que j'ai compris, voici l'énoncé de la question exactement, comment le comprenez-vous ?

    "Croiser deux listes, c'est à dire intervertir les éléments des deux listes selon une probabilité donnée (proba) pour chaque position dans la liste (tirage aléatoire et comparaison avec la probabilité"

    Et donc ensuite on peut choisir proba tel qu'on veut. Dans la pluspart des exemples a faire ensuite : proba = 0,5.


    Merci Bonne journée

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    ben tel que je le comprends, c'est exactement ce que je t'ai donné, mais avec 2 listes en sortie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    de i=1 a tailleDeLaListe
       tire un nombre n au hasard entre 0 et 1
       si n < probabilité
          Swap(liste1[i], liste2[i])
       fin si
    in de

  6. #6
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Euh donc selon vous, on a deux listes au départ, et on en récupère 2 en sortie ?

    swap ca veut dire quoi ?

    Par exemple, on a 2 listes de bits en entrée :
    L1 : 0 1 1 0 1
    L2 : 1 1 1 0 0

    On va donc faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Pour i=1 à 5
        n = nombre décimal aléatoire entre 0 et 1
     
        Si n<proba
     
           ... je ne comprends pas trop ce qui se passe ici...
           Alors... Sinon ?
     
        Fin Si
     
    Fin Pour
    Merci de votre aide

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    je te cite :

    Citation Envoyé par italiasky
    "Croiser deux listes, c'est à dire intervertir les éléments des deux listes
    c'est ce mot "intervertir" qui me fait dire que ca va retourner 2 listes. on parcourt les listes simultanement, a chaque etape, on tire un nombre au hasard. si ce nombre est plus petit que la proba demandée, on echange le ieme element de la liste 1 et celui de la liste 2, c'est ca que veut dire swap, c'est un reccourci, j'aurais pu ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    temp <- liste1[i]
    liste1[i] <- liste2[i]
    liste2[i] <- temp

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Ah ok merci

    oui parce que moi ca me genais un peut ce mot "intervertir" parce que je voyais plus le croisement comme le modele en génétique : 2 parents qui donne un enfant qui contient les genes des 2 parents...

    Mais comme vous m'expliquez, ca colle tout a fait avec la question quand je la relis après avoir lu votre explication...

    Donc du coup, mon algo devient bien :

    Entrée : liste1, liste 2
    Sortie : liste3, liste 4

    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
     
     
    liste3 <- liste1
    liste4 <- liste2
     
    Pour i de 1 à taille_liste de 1 en 1
        n_al = nombre décimal aléatoire entre 0 et 1
     
        Si n_al<proba
              Alors  // on échange l'élément i des 2 listes
                      temp <- liste3[i]
                      liste3[i] <- liste4[i]             
                      liste4[i] <- temp
        Fin Si
     
        retourner ???
     
    Fin Pour

    Mais j'ai un petit problème, comment je vais faire pour retourner les 2 nouvelles listes ?
    Dans mon cas ce sera des listes chainées en C, mais il me semble que dans une fonction on peut retourner qu'une seule chose nan ?

    Merci

  9. #9
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par jobherzt
    c'est ce mot "intervertir" qui me fait dire que ca va retourner 2 listes. on parcourt les listes simultanement, a chaque etape, on tire un nombre au hasard. si ce nombre est plus petit que la proba demandée, on echange le ieme element de la liste 1 et celui de la liste 2
    Dans ce cas on ne va pas tant retourner deux listes qu'effectuer une opération sur deux listes données en paramètre. La question, suivant le contexte, est doit-on copier ou modifier les listes ?

    Edit:
    Mais j'ai un petit problème, comment je vais faire pour retourner les 2 nouvelles listes ?
    Dans mon cas ce sera des listes chainées en C, mais il me semble que dans une fonction on peut retourner qu'une seule chose nan ?
    Soit en définissant une structure qui contient deux listes et sera le type de retour (et peut-être aussi d'entrée), soit en passant en entrée les listes de destination que la fonction ne fera que remplir.

  10. #10
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Citation Envoyé par Sivrît
    doit-on copier ou modifier les listes ?
    Euh moi je pense que nos 2 listes de départs doivent rester intact et donc il faut en créer deux nouvelles qui sont le fruit du croisement des 2...
    C'est pour ca que dans ma fonction au départ, je copierais les 2 listes dans 2 nouvelles mais ensuite comment retourner les 2 ? c'est pas possible si ?

    Merci
    ++

  11. #11
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    je pense qu'on doit les retourner, car en general un meme parents peut etre "impliqué" dans plusieurs accouplements. :-) mais a la limite il suffit de les copier au prealable et passer les copies par references.

    en fait, il y a bien l'idee {papa,maman} -> enfant, mais pour que l'algo fonctionne, il faut que le nombre d'individu soit stable (et meme constant en general). Donc decider que 2 parents vont donenr 2 enfants est une maniere de faire.

    Apres, il y en a d'autre, pas forcement moins bonne au contraire. on peut decide que chaque "mariage" ne donne qu'un enfant, mais faire 2 fois plus de mariage. a priori, cela introuit plus de diversité genetique.

  12. #12
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Oui donc il faudrait au préalable d'appeler la fonction, dupliquer les parents et ensuite appelé la fonction qui renvoie rien mais qui modifiera les listes parents en enfants...
    Sauf que le problème, si j'ai un nombre indéfini d'individus au départ, de parents, tous les dupliqués c'est pas forcément génial si ? il faut que je fasse une fonction qui duplique tout ca ?

    Oui mais comme jobherzt disait, avec le mot intervertir, ca fait bien penser qu'il y a deux enfants... donc je pense que je vais partir la dessus...

    Je vais essayer, je vous tiens au courant si j'ai un problème

    Merci a vous

  13. #13
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par italiasky
    Sauf que le problème, si j'ai un nombre indéfini d'individus au départ, de parents, tous les dupliqués c'est pas forcément génial si ? il faut que je fasse une fonction qui duplique tout ca ?
    ben non, tu duliques juste avant d'appeler la fonction croisement.. ou alors je n'ai pas compris la question. et normalement le nombre d'individu est quand meme plus ou moins defini !

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

Discussions similaires

  1. Fonction d'évaluation pour algo génétique.
    Par Trap D dans le forum Intelligence artificielle
    Réponses: 16
    Dernier message: 14/04/2008, 10h34
  2. [Algorithmes génétiques] Limites ?
    Par laclac dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 21/03/2006, 10h46
  3. Algo génétiques
    Par Nemerle dans le forum Intelligence artificielle
    Réponses: 8
    Dernier message: 31/07/2005, 13h53
  4. Algos génétiques, heuristiques...
    Par Regis.C dans le forum Intelligence artificielle
    Réponses: 3
    Dernier message: 29/04/2004, 23h32

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