コード例 #1
0
	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
コード例 #2
0
	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)