def tunePerfConstants(klass): # Keep going until we've spent 60s doing monte-carlo simulations. # Then, based on that, set constants so that each run takes 1s. perfConstants = klass(0.4, 10, 100) ai = MatthewgAI(perfConstants=perfConstants) gameState = GameState() ai.cardsUnseen = {Cards.MILEAGE_100: 20} gameState.playerNumber = 0 gameState.teams = [Team(number=0), Team(number=1)] gameState.us = gameState.teams[0] gameState.opponents = [gameState.teams[1]] for i in xrange(len(gameState.teams)): gameState.teams[i].playerNumbers = [i] ai.gameStarted(gameState) ai.gameState = gameState timeToStop = time.time() + 60 iterationsCompleted = 0 while time.time() < timeToStop: ai.resetTurnCache() ai.monteCarloMileageSimulation() iterationsCompleted += 1 perfConstants.monteCarloIterations = max(int(iterationsCompleted / 60), 50) perfConstants.savePerfConstants() return perfConstants
def makeState(self, player): state = GameState() state.debug = self.debug # Pass copies, not the original objects, so the canonical ones can't # "accidentally" get modified by the AIs state.hand = copy(player.hand) state.discardPile = copy(self.discardPile) state.teams = deepcopy(self.teams) state.us = copy(self.teams[player.teamNumber]) state.opponents = deepcopy(self.teams) del state.opponents[(player.teamNumber)] # Passed by value, doesn't need copying state.target = self.target state.cardsLeft = self.deck.cardsLeft() state.playerCount = len(self.players) state.playerNumber = player.number return state