From 18bf89f27881cbf6ed5c9621650f69e21645d4ac Mon Sep 17 00:00:00 2001 From: lffloyd Date: Thu, 27 Sep 2018 00:30:37 -0300 Subject: [PATCH] Update MonteCarloNo.py --- classes_busca/MonteCarloNo.py | 50 +++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/classes_busca/MonteCarloNo.py b/classes_busca/MonteCarloNo.py index 60755ce..704a05b 100644 --- a/classes_busca/MonteCarloNo.py +++ b/classes_busca/MonteCarloNo.py @@ -1,3 +1,27 @@ +# MIT License +# +# Copyright (c) 2018 Luiz Felipe de Melo (lffloyd), Vítor Costa (vitorhardoim), Renato Bastos (RenatoBastos33) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +############################################################################################################## + + #Define a classe MonteCarloNo, responsável por descrever o um nó no algoritmo de busca 'Monte-Carlo tree search'. #Escrito por: Vítor Costa, Renato Bastos. @@ -6,7 +30,6 @@ # import numpy as np #Substituí as funções do numpy pelas funções normais do Python, pois não consigo instalar o numpy aqui. import math - class MonteCarloNo: def __init__(self, estado, pai = None): self.estado = estado @@ -25,7 +48,7 @@ def __str__(self): return "\nQtd de Filhos:" + str(len(self.filhos)) def expandir(self): - print("AQUIII" + str(len(self.estado.jogador.pegaPecasJogaveis()))) + #print("AQUIII" + str(len(self.estado.jogador.pegaPecasJogaveis()))) for peca in self.estado.jogador.pegaPecasJogaveis(): for i in range(0,2): novoEstado = copy.deepcopy(self.estado) @@ -35,25 +58,35 @@ def expandir(self): novoEstado.oponente.setaVez(True) if (adicionou): novoNo.simular() + novoNo.estado.onde = i + novoNo.estado.ultimaPecaJogada = peca self.filhos.append(novoNo) + #funcao para escolher o melhor filho usando o valor do UCT def melhorFilho(self): + melhor=None for i in self.filhos: - i.UCT = i.vitorias / i.visitas + 1.4 * math.sqrt(math.log(self.visitas) / i.visitas) - print(i.UCT) - return max(p.UCT for p in self.filhos) + i.UCT = (i.vitorias / i.visitas) + (1.4 * (math.sqrt(math.log(self.visitas) / i.visitas))) + if melhor!=None: + if i.UCT>melhor.UCT: + melhor=i + else: + melhor=i + #print("Melhor filho:" + str(melhor)) + return melhor + def foiTotalmenteExpandido(self): - if (self.estado.jogador.ehSuaVez() == True): return len(self.filhos) == len(self.estado.jogador.pegaPecasJogaveis()) + if(self.estado.jogador.ehSuaVez() == True): return len(self.filhos) == len(self.estado.jogador.pegaPecasJogaveis()) else: return len(self.filhos) == len(self.estado.oponente.pegaPecasJogaveis()) #funcao de backpropagation para aumentar o numero de simulacoes e vitorias das simulacoes def backPropagation(self, no, vitoria, visita): if(no != None): - no.vitoria =+ vitoria - no.visita =+ visita + no.vitorias += vitoria + no.visitas += visita self.backPropagation(no.pai, vitoria, visita) else: return @@ -70,6 +103,7 @@ def gerarJogo(self,no,difSimulacao): #difSimulacao variavel para saber se uma si return self.backPropagation(no,0,1) return + novoEstado=copy.deepcopy(no.estado) #Escolhe o jogador da vez e simula uma jogada if novoEstado.jogador.ehSuaVez():