From 37291f1dbe204acf14cb1486ccf4ea720c8cefa0 Mon Sep 17 00:00:00 2001 From: renatobastos33 Date: Wed, 26 Sep 2018 17:35:23 -0300 Subject: [PATCH] Jogar MCTS em andamento --- classes_base/Jogador.py | 38 ++++++++++++------ .../__pycache__/Jogador.cpython-36.pyc | Bin 9276 -> 9154 bytes classes_busca/EstadoMCTS.py | 17 ++++---- classes_busca/MonteCarloNo.py | 14 ++++++- .../__pycache__/EstadoMCTS.cpython-36.pyc | Bin 1780 -> 1610 bytes .../__pycache__/MonteCarloNo.cpython-36.pyc | Bin 2908 -> 2858 bytes 6 files changed, 46 insertions(+), 23 deletions(-) diff --git a/classes_base/Jogador.py b/classes_base/Jogador.py index 9c880f1..8955405 100644 --- a/classes_base/Jogador.py +++ b/classes_base/Jogador.py @@ -290,20 +290,32 @@ def jogarMCTS(self, mesa, oponente): oponente.setaVez(True) print("J" + str(self.__ind) + " passou a vez.") return + + estadoAtual = EstadoMCTS(self, oponente, mesa) noTeste = MonteCarloNo(estadoAtual) noTeste.expandir() - print(noTeste) - noTeste.melhorFilho() - escolhida = int(input("Qual peça deseja jogar? ")) - if (len(mesa.pegaTabuleiro()) != 0): pos = int(input("Em que posição?(0 p/ esquerda, 1 p/ direita) ")) - else: pos = 0 - peca = self.__mao.pop(escolhida - 1) - adicionou = mesa.adicionarNaMesa(peca, pos) - if (not adicionou): self.__mao.append(peca) + for i in range(100): + melhorfilho=noTeste.melhorFilho() + noTeste.gerarJogo(melhorfilho,False) + #print("\nMelhor filho:" +str(noTeste.melhorFilho())) + print("Gerou o jogo numero:"+ str(i)+"\n") + #print(noTeste) + #noTeste.melhorFilho() + adicionou=True + + # + #escolhida = int(input("Qual peça deseja jogar? ")) + #if (len(mesa.pegaTabuleiro()) != 0): pos = int(input("Em que posição?(0 p/ esquerda, 1 p/ direita) ")) + #else: pos = 0 + #peca = self.__mao.pop(escolhida - 1) + melhorfilho=noTeste.melhorFilho() + self.removePeca(mesa,melhorfilho.estado.ultimaPecaJogada) + adicionou = mesa.adicionarNaMesa(melhorfilho.estado.ultimaPecaJogada, melhorfilho.estado.onde) + if (not adicionou): self.__mao.append(melhorfilho.estado.ultimaPecaJogada) else: self.setaJogou(True) self.__maoJogaveis = [] - peca.ordem(len(mesa.pegaTabuleiro())) + melhorfilho.estado.ultimaPecaJogada.ordem(len(mesa.pegaTabuleiro())) self.setaVez(False) oponente.setaVez(True) return @@ -314,13 +326,13 @@ def jogarRandom(self, mesa, oponente): self.atualizaPecasJogaveis(mesa) # Caso não existam peças jogáveis em sua mão, executa a compra de peças enquanto for possível. if (len(self.pegaPecasJogaveis()) == 0): self.compraDaMesa(mesa) - print("\n" + str(mesa)) - print("\n" + self.pecasJogaveis(mesa, self.__mao)) - print(self) + #print("\n" + str(mesa)) + #print("\n" + self.pecasJogaveis(mesa, self.__mao)) + #print(self) if (len(self.pegaPecasJogaveis()) == 0): #mesa.fechada = True self.setaJogou(False) - print("J" + str(self.__ind) + " passou a vez.") + #print("J" + str(self.__ind) + " passou a vez.") else: possibilidades = self.possibilidadesJogaveis(mesa) escolhida = random.randint(0, len(possibilidades) - 1) diff --git a/classes_base/__pycache__/Jogador.cpython-36.pyc b/classes_base/__pycache__/Jogador.cpython-36.pyc index 189c73920141f7fc9c2a0002478a0dc9b69fa80f..e6a284c659ac3e4e4b19b15160c7101560e2266d 100644 GIT binary patch delta 680 zcmX|9OKTKC5U!f{&OR8|P4<=DOtK2DpcnO$V+@JJ5EK=0gUV=+>$cgQ*gGpB^pL~c zCD0(Ay?P3sgdBngPaZtyA1H|U53Jcl8LH;%uBxxPzv`n~U)J1f#iBd;`EkozK6DS8 zR~!H^$!?O3j}bru2ZpaSQDSh9P@*5;?psNI{6VeHwUsq@w7y z(`!J|8B&)lZa`U(Zc7ib^Q1p{5p1K04hg0Ai^e8nf9 WYKt3Kxb8HBPAOeSJX1TJZ+`*Ysh<@9 delta 571 zcmX|;zi-n(6vywK?X!JNLXx&|5*pWus6-Jzq;_E|2=POR1(5jB4lEZ$uMGjmR19Y^ zctZ#wJ!TjfKnzF~Ys5e$#6V~M3RY&`ITf<*tFPX@cX!{9zh9kRlk3&0e2<^ErW^Zm z|M;1ZG3L>_L~HU17&A;W1v@;gDR!G&?!1BLdxmuK60a}CD3+!=1LG9{%y_z9Fko3D zYbw8h0&DK3(GI1tV10roKF&iA56_zu>u3UiGl- zXqf;n^rA4((d<-Iy;YF-x;H?KmKV>_qc4w=r_YATlksHx;N!uE@do~kPCy$Ed&9NO zxzTX<(Kx-bZS@Xyr+2NKvU1PLeJin*O_J3RU&RAI-Li#?_@xoyVZ5F|1%jim0!>x} z7wS|K$5CT~$2e#vvqv0`uH8j&VCo@ea$qBQMAc znyMKKmlIsj$BbtL^;=+}1w2DeXMt{5#ASu)rkXiUuI$3S?pc_}KT!w2bz{7ljQZ#4 w=T1&jG6s^lAbFih%F&`^buOXJ@ptkAZhd{%zX6q#K{s_Qksy75e+R$*0k$=MYXATM diff --git a/classes_busca/EstadoMCTS.py b/classes_busca/EstadoMCTS.py index 4baeaec..71b9bd1 100644 --- a/classes_busca/EstadoMCTS.py +++ b/classes_busca/EstadoMCTS.py @@ -16,6 +16,7 @@ def __init__(self, jogador, oponente, mesa): self.qtdPecasOponente = len(self.oponente.pecas()) self.probabilidade = 0 self.ultimaPecaJogada = None + self.onde=None def __str__(self): resp="" @@ -29,31 +30,31 @@ def comparar(self,estado2): for peca in self.jogador.pecas(): achou=False for peca2 in estado2.jogador.pecas(): - if peca.igual(peca2): + if peca==peca2: achou=True break if achou==False: return False for peca in self.oponente.pecas(): igual=False for peca2 in estado2.oponente.pecas(): - if peca.igual(peca2): + if peca==peca2: igual=True break if igual==False: return False onde=0 for pecaTab in self.mesa.pegaTabuleiro(): pecaTab2=estado2.mesa.pegaTabuleiro()[onde] - if not pecaTab.igual(pecaTab2): return False + if not pecaTab==pecaTab2: return False onde+=1 return True #Indica se um estado terminal foi atingido def ehEstadoFinal(self): - print("----Teste no ehEstadoFinal()") - print(self) - print("Jogador:" + str(self.jogador.jogouRodada())) - print("Oponente:" + str(self.oponente.jogouRodada())) - print("--------Fim do teste -------\n") + #print("----Teste no ehEstadoFinal()") + #print(self) + #print("Jogador:" + str(self.jogador.jogouRodada())) + #print("Oponente:" + str(self.oponente.jogouRodada())) + #print("--------Fim do teste -------\n") if (not self.jogador.jogouRodada() and not self.oponente.jogouRodada() and len(self.mesa.pegaPecasAComprar())==0) \ or (len(self.jogador.pecas())==0 or len(self.oponente.pecas())==0) : return True diff --git a/classes_busca/MonteCarloNo.py b/classes_busca/MonteCarloNo.py index e617b54..9198d2a 100644 --- a/classes_busca/MonteCarloNo.py +++ b/classes_busca/MonteCarloNo.py @@ -36,13 +36,22 @@ def expandir(self): if (adicionou): novoNo.simular() self.filhos.append(novoNo) + novoNo.estado.ultimaPecaJogada=peca + onde=i #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) + if melhor!=None: + if i.UCT>melhor.UCT: + melhor=i + else: + melhor=i + print("Melhor filho:" + str(melhor)) + return melhor + def foiTotalmenteExpandido(self): @@ -70,6 +79,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(): diff --git a/classes_busca/__pycache__/EstadoMCTS.cpython-36.pyc b/classes_busca/__pycache__/EstadoMCTS.cpython-36.pyc index f3aba60aa2630d7390b1272eabda123e5415f961..86244d72e1334e27e9071835229c573f1f2a1b73 100644 GIT binary patch delta 745 zcmZXS&ubGw6vyAp&Q7LDHpW=B7OMqC8pRwm=*3%V=*1vOFc6Wj&7?mzwVTYQ5M|dK z@)v|T2|aify?OKEy?;UwJc>ubKfpH|(_+f9U*7x9n>RBb-XG^Az4Xv=l2?9ydU-rq z`bf4WUrMPslX~?=% z-?P?6rkeg&ZO7Gf@3dO&NE+GCp}*6B(3Yf2RaKH2^s5b!R>X%z>|}W?KKD+Pz!T#v zkForU+1Sc5uM{Zyw{@MQb%w2vn)d$g zk$a$0Xg3qRPTQ@!+fDH=c(6!DwEfpTSGj5p>w^LcAWw$BK;=Y$IG3B%46ZPeCT}l2 z4F<0CpOxyh0`}6MS#CtJOUd+mfimZu26cB%(ZmA_Gv?W27!$)OsKgF!3%G!SKO`M!B{?1qa0=yfUrT_o{ delta 942 zcmZvbPiqrF6u{@r{+msc{;{>S+CtDvb7(6Ttd!!xY7oIHBv7c7ux6GvX|lVW-9ikz zc@0^;-pu0lS23-yU{gbd8APr_t6&j&Zg5Dj(ZhJniC zawG}_ty(RNRIN6Xe&w4tzai?BW7cF%=(GE5?@q!cBwFWs3}`yt$m~zqU-s%i^2B(`jt+KMY)Cldsw$zvj;cFMYKhsojj{Bmk)6GiSa@ot#pXOq zL~P-yq7UI`@`+8Uud~GDM{m;a+U%;SG)hfSRz_q0*l8)9fI*-Txcg4kd4Ak-8_F-) zYAl`5i#>H2H+Oa4lkTn+xOFnw6~7m^F5Z=>`|ZF{j#@yka0LZ}NzifRP?{i^_(!MR zamXCo?mniM){N*p3_e9EVyG@$_5GK} z82kR>PWkQ3M_zCkV;02~ioFB;!z(ABDV7?knOZ}3l|ASWpf7v2;KCSkdKb82G<*fh zN{x-d5Twh**x%lq2}0MsD2S zjdnyLr}Xqm0)rD!gaCXffJgMf1Q&dKWuBfhsBBYYR(DAVM&26aR{Oj$;EJc9IQ}%t z4|&R`*bquAWQuRt3Iy9Wp6n=Tm?f2={sNw>a1$q+G=Ib z@71UIn{oS5S5{gH9hdNvwOEq0NNSQE9qV={tD|q9np~j7UXj4az7O;I3Se^=0$i~_ z!$l08_tR&oEYE5DyA`=axy$cmVbhz27@v5J@)_Mfud%3+4Xfcd??M>31=n&Nw<0-J N=!%(#IjoK?{{=D{d@=w4 delta 669 zcmZ8eOKTHR6h7z9Bgu3!L~Rpaq>b&Oqivd6q%L9wEnOC*ke1de!%WjAOijI$LXasg z#+@7GZd~bB3L@e{aI0(4rNN!}7ZhBG=S+%VFMQve_jm7^!{WDMelDN4%C8PLUOE8Z zpWYgIbK#S4OaL$lHwn>m^+$}2#xb;~n$}P+vpsYo*b&*Mofpp6b%#5U^ci$4BPP>Quuoi#FgH%NvBt{z~FZH71p z0d`56U{F>hN6`d_p#(ABHM<$AGZRF(pIwD+map{)29pv@a0Og_dApgOpVxgPAwJ>` z6Cq*@6UDG;r^3(x8YTjuR$O*b<|ylmzNpsvxF?6m8<0)b?_7O*>)uvxPcBT88}UdT z9$Zq6dHPhf9(H^$j25c@iqsQh%I<5sUe6WMqGI*gs1#go%@P5v=OQ|4$oz^m^}~Eu zo}r+uG5s$rXDN2&?fc9s7TA<$n9edyt4eO^_GL2H?V#0MY3=TZp6_*Jg+rF-?{xN; zTH#J--DvVhj&s+s@$(d`6QW5XFf7ys|3N*4`jGR+xPrFBk2v03rr3sBv>GE5oSkB- eGNm`2SFf$vl9SD34Z^78ow?fJ0h8*NHTM_ePk%oE