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

Intelligence artificielle Discussion :

Algorithme alpha-bêta : pseudo code


Sujet :

Intelligence artificielle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut Algorithme alpha-bêta : pseudo code
    Bonjour,

    Je voudrais une explication par rapport à ce 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
    19
    20
     
     
    int alphabêta(int depth, int alpha, int bêta)
    {
       if (game over or depth <= 0)
          return winning score or eval();
       move bestmove ;
       for (each possible move m) {
          make move m;
          int score = -alphabêta(depth - 1, -bêta, -alpha)
          unmake move m;
          if (score >= alpha){
             alpha = score ;
             bestMove = m ;
             if (alpha >= bêta)
                break;
          }
       }
       return alpha;
    }
    En première lecture je pensais à une erreur d'indentation en ligne 6 , mais j'ai trouvé la même chose en différents endroits sur internet.
    Je ne comprend pas : la première fois que l'on appelle alphabeta() on ne passe pas dans le if ligne 4 donc on commence systématiquement par jouer "bestmove" mais d'où sort-il ? On n'a pas encore déterminé m !

    Je vous remercie par avance pour une explication éclairée

  2. #2
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Par défaut
    Bonjour,

    Ligne 5 : En premier lieu je dirais qu'il y a un problème par rapport à ce code, je n'ai jamais vu de return a or b si a et b ne sont pas des booléens...

    Ensuite, comme votre variable bestmove est utilisée dans votre boucle, il faut la déclarer avant la boucle, dans laquelle sa valeur sera affectée.

    L'indentation du code semble donc correcte. Sinon je vous recommande un article de wikipedia qui m'a été très utile dans mes études et que je trouve un peu plus clair :

    http://fr.wikipedia.org/wiki/%C3%89lagage_alpha-beta

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    OK,

    C'est possible qu'il y ait un problème par rapport à ce code, mais comme je l'ai dit j'ai trouvé des choses identiques sur internet.

    C'est un pseudo code proche du langage C puisque la fonction est typée en int, c'est le langage avec lequel je travaille.
    Mais cela ne sert à rien que je commence à coder tant que je n'aurais pas compris l'algo !
    Je ne m'étais pas arrêté sur la ligne 5 mais c'est vrai que ce n'est pas logique : il ne faut pas prendre "or" comme un opérateur !
    En ligne 5 je comprends qu'il faut retourner le résultat de la fonction eval() donc un int.

    Pour moi "move bestmove" (ligne 6) c'était jouer le meilleur coup parmi les m explorés et déterminé justement par l'algo : voir bestmove = m en ligne 13.

    Ensuite, comme votre variable bestmove est utilisée dans votre boucle, il faut la déclarer avant la boucle, dans laquelle sa valeur sera affectée.
    Je ne suis pas d'accord avec cette phrase : comment affecter cette variable avant l'appel à la fonction alphabeta() ?
    Aucun algo alpha-beta en negamax n'a besoin d'une telle variable.

    Revenons à wikipédia (merci pour le lien):
    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
     
    fonction ALPHABETA(P, A, B) /* A < B */
       si P est une feuille alors
           retourner la valeur de P
       sinon
           Meilleur = –INFINI
           pour tout fils Pi de P faire
               Val = -ALPHABETA(Pi,-B,-A)
               si Val > Meilleur alors
                   Meilleur = Val
                   si Meilleur > A alors
                       A = Meilleur
                       si A ≥ B alors
                           retourner Meilleur
                       finsi
                   finsi
               finsi 
           finpour 
           retourner Meilleur
       finsi
    fin
    A partir de ce pseudo-code je voudrais faire apparaître les notions de simuler le coup et de déjouer le coup (exploration de l'arbre) ainsi que celle de jouer le meilleur coup une fois déterminé.
    Ces 3 notions existent dans le premier pseudo-code indiqué et c'est pour cela que j'ai retenu celui-ci.
    Selon wikipédia il me manque le pseudo-code qui appelle la fonction alphabeta() pour jouer le coup.

    Merci si vous pouvez me donner le complément

  4. #4
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Par défaut
    Citation Envoyé par nanosoft Voir le message

    OK,

    Je ne suis pas d'accord avec cette phrase : comment affecter cette variable avant l'appel à la fonction alphabeta() ?
    Aucun algo alpha-beta en negamax n'a besoin d'une telle variable.
    En fait, la variable bestmove est affectée pendant l'appel suivant à la fonction alphabeta() ; ensuite elle persiste durant toute l'exécution de l'intégralité du code. En effet, alphabeta() est une fonction récursive qui va être initialisée au sommet et s'appeler elle-même jusqu'à la condition d'arrêt.

    Citation Envoyé par nanosoft Voir le message

    Selon wikipédia il me manque le pseudo-code qui appelle la fonction alphabeta() pour jouer le coup.

    Merci si vous pouvez me donner le complément
    Le pseudo-code dont vous avez besoin ici n'est donc autre que la fonction alphabeta(P,A,B) elle-même, initialisée pour tous les fils P du sommet de votre arbre, et avec A = - inf et B = + inf.

    Hope it helps !

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Juin 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 257
    Par défaut
    Merci mais je voudrais savoir si le premier pseudo-code de la discussion est correct ou non.
    Et s'il n'est pas correct, cela serait super que quelqu'un puisse le corriger.

    En l'état je ne le comprends pas puisqu'on commence par jouer le meilleur coup avant l'exploration et avant toute récursivité !

    En fait, la variable bestmove est affectée pendant l'appel suivant à la fonction alphabeta()
    Mais au premier appel : elle n'est pas affectée !!!!

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Bonjour,

    Un if qui n'a pas d'accolade donc pas de corp.
    le ; signifie la fin de l'instruction ça revient donc à écrire ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       if (game over or depth <= 0) return winning score or eval();
       move bestmove ;
    Il n'y a donc pas de probléme d'indentation.

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

Discussions similaires

  1. Algorithme Alpha Béta
    Par titme dans le forum Intelligence artificielle
    Réponses: 2
    Dernier message: 15/04/2011, 20h27
  2. Difference Algorithme / Pseudo code
    Par elmander dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 01/03/2010, 12h24
  3. Algorithme alpha béta
    Par Bathou dans le forum Intelligence artificielle
    Réponses: 11
    Dernier message: 16/02/2010, 11h47
  4. Puissance 4 : algorithme MiniMax (alpha-béta)
    Par sperca dans le forum Intelligence artificielle
    Réponses: 9
    Dernier message: 26/04/2008, 20h46
  5. Algorithmes de generateur pseudo-aleatoire
    Par funx dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 06/09/2002, 18h33

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