Exemplo n.º 1
0
 def getBestLegalMove(self, moveProbs):
     while True:
         choice = random.choice(config.maxelements(moveProbs))
         if choice in self.legalMoves:
             return choice
         else:
             moveProbs[choice] = 0
Exemplo n.º 2
0
 def selectRec(self, node):
     if node.expanded:
         valList = []
         for child in node.children:
             valList.append((child.num / child.den) +
                            config.MCTSexploration *
                            math.sqrt(math.log(self.root.den) / child.den))
         return self.selectRec(node.children[random.choice(
             config.maxelements(valList))])
     else:
         self.expand(node, False)
         return node
Exemplo n.º 3
0
 def makeMove(self, resetRoot=False):
     if self.root.children:
         valList = []
         for child in self.root.children:
             valList.append(child.den)
         moveChoice = self.root.children[random.choice(
             config.maxelements(valList))]
         if resetRoot:
             self.root = moveChoice
         else:
             return moveChoice.board, moveChoice.rowNum, moveChoice.colNum
     else:
         raise Exception('The node has no children.')
Exemplo n.º 4
0
 def genGameResults(self):
     origTurn = self.root.isRedTurn
     while True:
         col = self.root.board.legalMoves[random.choice(
             config.maxelements(self.root.getChildScores()))]
         newBoard, row, col = self.root.board.serveNextState(
             col, self.root.isRedTurn)
         if newBoard.checkWin(row, col, self.root.isRedTurn):
             if origTurn == self.root.isRedTurn:
                 return 1
             else:
                 return -1
         elif newBoard.checkDraw():
             return 0
         self = miniTree(newBoard, not self.root.isRedTurn,
                         config.miniMaxDefaultDepth)
Exemplo n.º 5
0
 def nnSelectRec(
     self,
     node,
     custConstMC=None
 ):  # drill through tree until unexpanded node is reached, expand and backpropagate values through tree
     if node.boardCompleted:
         monteTree.nnBackProp(node, node.isRedTurn, 1 if node.isWin else .5)
         return node
     elif node.expanded:
         valList = []
         for child in node.children:  # for each child, generate value according to assigned values, and traversal count
             valList.append(
                 (child.nnVal / child.den) +
                 (custConstMC if custConstMC else config.MCTSexploration) *
                 child.nnProb * math.sqrt(self.root.den) / (1 + child.den))
         self.nnSelectRec(
             node.children[random.choice(config.maxelements(valList))],
             custConstMC=(
                 custConstMC if custConstMC else config.MCTSexploration
             ))  # call fn recursively on node with largest value
     else:
         self.nnExpand(node)
Exemplo n.º 6
0
 def getMove(self):
     # moves = [0,0,0,0,0,0,0]
     # moves[self.root.board.legalMoves[random.choice(config.maxelements(self.root.getChildScores()))]] = 1
     # return moves
     return self.root.board.legalMoves[random.choice(
         config.maxelements(self.root.getChildScores()))]