def TreeUp(self, noeud_N, evaluation_R, symbole_racine, symbole_noeud_N): '''Remonter dans l'arbre UCT''' symbole_courant = symbole_noeud_N while(noeud_N is not self.tree): nom_N = noeud_N.name nom_parent_N = noeud_N.parent.name action_pour_arriver_en_N = noeud_N.code try: self.compteur_visite_etat[nom_N] += 1 except KeyError: self.compteur_visite_etat[nom_N] = 1 try: self.compteur_choix_action_dans_etat[(nom_parent_N, action_pour_arriver_en_N)] += 1 except KeyError: self.compteur_choix_action_dans_etat[(nom_parent_N, action_pour_arriver_en_N)] = 1 q = evaluation_R # Pour information, la ligne ci-dessous est juste, ne pas mettre de signe "!=" au lieu de "==". if symbole_courant == symbole_noeud_N: # <- La ligne qui m'a fait perdre beaucoup de temps. q *= -1.0 try: # En effet, nous nous intéressons au parent de N, et non à N lui-même. mu_avant = self.score_choix_action_dans_etat[(nom_parent_N, action_pour_arriver_en_N)] except KeyError: mu_avant = 0 n = self.compteur_choix_action_dans_etat[(nom_parent_N, action_pour_arriver_en_N)] mu = mu_avant + (1.0/n)*(q - mu_avant) self.score_choix_action_dans_etat[(nom_parent_N, action_pour_arriver_en_N)] = mu noeud_N = noeud_N.parent symbole_courant = getOtherSymbol(symbole_courant) # Enfin, visite de la racine. try: self.compteur_visite_etat[noeud_N.name] += 1 except KeyError: self.compteur_visite_etat[noeud_N.name] = 1 return
def TreeDown(self, position_courante, symbole_dont_c_est_le_tour): '''Descendre dans l'arbre UCT''' # soit N la racine de l'arbre N = self.tree joueur = symbole_dont_c_est_le_tour # boucle : fils non explorés de N grille = Grille() grille.set(N.name) mes_coups_possibles = grille.lookForAllowedSteps() while all([self.compteur_choix_action_dans_etat.has_key((N.name, i)) for i in mes_coups_possibles]): # soit F le fils de N ayant la plus grande valeur UCT if(len(mes_coups_possibles)>0): action = self.choisirActionUCT(grille) nouvel_etat = changerEtatApresTransition(N.name, action, joueur) F = Node(nouvel_etat, N) F.code = action N = F joueur = getOtherSymbol(joueur) grille.set(N.name) mes_coups_possibles = grille.lookForAllowedSteps() else: break # soir F un fils de N tiré au hasard parmi les fils non explorés grille.set(N.name) mes_coups_possibles = grille.lookForAllowedSteps() if(len(mes_coups_possibles)>0): actions_inexplorees = [i for i in mes_coups_possibles if not self.compteur_choix_action_dans_etat.has_key((N.name, i))] tirage = randint(0, len(actions_inexplorees)-1) action = actions_inexplorees[tirage] etat_inexplore = changerEtatApresTransition(N.name, action, joueur) F = Node(etat_inexplore, N) F.code = action joueur = getOtherSymbol(joueur) else: F = N return (F, joueur)