From bc64d679bf304fcdaeee577dcba7521619d9819e Mon Sep 17 00:00:00 2001 From: Dominik Roth Date: Fri, 15 Apr 2022 18:11:18 +0200 Subject: [PATCH] Smashed bugs --- brains/uttt.pth | Bin 15175 -> 15175 bytes ultimatetictactoe.py | 5 +++++ vacuumDecay.py | 31 ++++++++++++++++++++++--------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/brains/uttt.pth b/brains/uttt.pth index 1c29941196f7bf41b115c44b8fdad759ba49a761..919a49949c548245184dade9334cd62414778a69 100644 GIT binary patch delta 7880 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 delta 7880 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 diff --git a/ultimatetictactoe.py b/ultimatetictactoe.py index 3a6632f..8375db5 100644 --- a/ultimatetictactoe.py +++ b/ultimatetictactoe.py @@ -93,9 +93,14 @@ class TTTState(State): self.update_box_won() game_won = self.check_small_box(self.box_won) if game_won == '.': + if self.checkDraw(): + return -1 return None return game_won == 'X' + def checkDraw(self): + return len(self.getAvaibleActions())==0 + def __str__(self): state = self.board acts = list(self.getAvaibleActions()) diff --git a/vacuumDecay.py b/vacuumDecay.py index 93f41bb..2b0e606 100644 --- a/vacuumDecay.py +++ b/vacuumDecay.py @@ -187,8 +187,6 @@ class Node(): def _expand(self): self._childs = [] - if self.getWinner()!=None: - return actions = self.state.getAvaibleActions() for action in actions: newNode = Node(self.state.mutate(action), self.universe, self, action) @@ -287,12 +285,12 @@ class Node(): self._calcScore(p) def _calcScore(self, player): - winner = self.getWinner() + winner = self._getWinner() if winner!=None: - if winner==-1: - self._scores[player] = 2/3 # draw - elif winner==player: + if winner==player: self._scores[player] = 0.0 + elif winner==-1: + self._scores[player] = 2/3 else: self._scores[player] = 1.0 return @@ -321,17 +319,20 @@ class Node(): def curPlayer(self): return self.state.curPlayer + def _getWinner(self): + return self.state.checkWin() + def getWinner(self): if len(self.childs)==0: return -1 - return self.state.checkWin() + return self._getWinner() def _activateEdge(self, dist=0): if not self.strongScoresAvaible(): self.universe.newOpen(self) else: for c in self.childs: - if c._cascadeMemory > 0.001*dist or random.random()<0.01: + if c._cascadeMemory > 0.001*(dist-2) or random.random()<0.01: c._activateEdge(dist=dist+1) def __str__(self): @@ -463,6 +464,7 @@ class NeuralRuntime(Runtime): class Trainer(Runtime): def __init__(self, initState): self.universe = Universe() + #self.universe = QueueingUniverse() self.rootNode = Node(initState, universe = self.universe) self.terminal = None @@ -470,10 +472,12 @@ class Trainer(Runtime): print('[*] Building Timeline') term = self.linearPlay(model, calcDepth=depth, exacity=exacity) if refining: - print('[*] Refining Timeline') + print('[*] Refining Timeline (exploring alternative endings)') self.fanOut(term, depth=depth+2) self.fanOut(term.parent, depth=depth+2) self.fanOut(term.parent.parent, depth=depth+2) + #print('[*] Refining Timeline (exploring uncertain regions)') + #self.timelineExpandUncertain(term, 20) return term def fanOut(self, head, depth=4): @@ -514,6 +518,15 @@ class Trainer(Runtime): return head = head.parent + def timelineExpandUncertain(self, term, secs): + return + self.rootNode.universe.clearPQ() + self.rootNode.universe.activateEdge(rootNode) + self.spawnWorker() + time.sleep(secs) + self.rootNode.universe.clearPQ() + self.killWorker() + def trainModel(self, model, lr=0.00005, cut=0.01, calcDepth=4, exacity=5, term=None): loss_func = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr)