2016-12-31 5 views
0

J'implémente une IA pour un jeu Othello en utilisant MiniMax avec l'élagage Alpha Beta. J'ai implémenté un algorithme Alpha Beta qui me dit la valeur que je peux obtenir, mais pas quel nœud je devrais sélectionner? Donc, ma question est comment puis-je utiliser alpha-bêta pour me dire quel noeud je devrais sélectionner, pas ce que la valeur résultante serait. Voici le pseudo-code de mon algorithme Alpha-Beta.Comment sélectionner un nœud en utilisant Alpha Beta

01 function alphabeta(node, depth, α, β, maximizingPlayer) 
02  if depth = 0 or node is a terminal node 
03   return the heuristic value of node 
04  if maximizingPlayer 
05   v := -∞ 
06   for each child of node 
07    v := max(v, alphabeta(child, depth – 1, α, β, FALSE)) 
08    α := max(α, v) 
09    if β ≤ α 
10     break (* β cut-off *) 
11   return v 
12  else 
13   v := ∞ 
14   for each child of node 
15    v := min(v, alphabeta(child, depth – 1, α, β, TRUE)) 
16    β := min(β, v) 
17    if β ≤ α 
18     break (* α cut-off *) 
19   return v 
+0

_pas la valeur résultante, mais vous en avez également besoin. Vous devez retourner 2 choses. Une réponse exacte dépend de la définition de votre 'node', langage de programmation, etc. –

+0

@HenkHolterman Pourquoi ai-je besoin de retourner la valeur résultante? Si mon arbre était un arbre de recherche binaire, par exemple, je devrais juste savoir lequel des deux nœuds sélectionner, et non pas quelle était la valeur? Bien sûr, même si j'ai besoin de cette valeur pour déterminer quel noeud sélectionner –

+0

Vous venez de répondre vous-même: "pour déterminer lequel ..." –

Répondre

0

Si vous voulez seulement connaître le meilleur mouvement dans la position de la racine, il suffit de se rappeler qui se déplacent dans la position racine avait le score le plus élevé. Pour cela, il suffit de renvoyer le score. Aucun changement dans le pseudo-code n'est nécessaire. Comme vous vous interrogez sur le chemin vers le nœud critique, je suppose que vous demandez un moyen de reconstruire le principal variation, qui donne des informations sur la série de coups attendus par la recherche.

En théorie, vous pouvez simplement renvoyer la valeur et la variation principale de l'appel récursif. Cela vous permet de reconstruire le chemin. Triangular PV-Tables sont des structures de données optimisées à cette fin.

Si votre recherche utilise un transposition table, une approche plus simple consiste simplement à démarrer la position racine et à rechercher le meilleur mouvement dans la table de transposition. Faites ensuite ce mouvement et répétez (recherchez le meilleur coup, faites le meilleur coup, cherchez à nouveau, etc.) jusqu'à ce que le jeu soit terminé ou qu'aucune entrée n'ait été trouvée. À la fin, les mouvements qui ont été faits sont la principale variation. L'approche de la table de transposition n'est pas aussi précise que le suivi explicite de la variation principale, mais elle est simple à implémenter et n'ajoute aucun surcoût pendant la recherche.

+0

Juste pour clarifier, une table de transposition peut ajouter un surcoût significatif (moins si vous utilisez le hachage Zobrist). Mais, ce coût est généralement largement compensé par la réduction de la taille de l'arbre de recherche. –

+0

@NathanS. Vrai. "No overhead" suppose que la recherche utilise déjà une table de transposition mais pour l'instant, je n'ai pas vu de recherche Alpha Beta optimisée sans tables de transposition. Au moins aux échecs, chaque moteur l'utilise, principalement pour améliorer la commande de mouvement. Je pense que la même chose vaut pour d'autres jeux similaires (par exemple, Reversi). –

+0

@ PhillipClaßen Très vrai - le seul jeu où vous n'utilisez pas la table de transposition est l'endroit où il y a très peu de transpositions. –