def initPolicy(self, game, agentIndex=0): """Interactively allow user to choose an MDP policy.""" from keyboardAgents import KeyboardAgent from graphicsUtils import keys_pressed from searchAgents import searchGen import itertools agent = game.agents[agentIndex] def pollChoice(state): blink_show = True blink_delay = 3 blink_tick = 0 self.update(state.data) action = None while not action: action = agent.getAction(state) time.sleep(0.1) if blink_tick == blink_delay - 1: blink_show = not blink_show self.update(state.data, blink_show) blink_tick = (blink_tick + 1) % blink_delay return action wallsDict = game.state.getWalls().asValDict() availablePos = set(wallsDict[False]) foodDict = game.state.getFood().asPosDict() delKeys = [] # Eliminate entries that refer to locations without food for k, v in foodDict.items(): if v in [0, False]: delKeys.append(k) for k in delKeys: del foodDict[k] minStates = [] for r in range(len(foodDict.items()) + 1): for foodState in itertools.combinations(foodDict.items(), r): # import pdb; pdb.set_trace() print(foodState) occupiedByFood = set() for pos, _ in foodState: occupiedByFood.add(pos) for pos in availablePos - occupiedByFood: minStates.append((pos, frozenset(foodState))) policy = dict() for s in minStates: state = GameState() state.data = game.state.data.deepCopy( ) # Passing data into __init__ makes # shallow copy instead of deep. state.data.agentStates[0].configuration.pos = s[0] state.data.food = Grid(state.data.food.width, state.data.food.height, 0) for (x, y), foodVal in s[1]: state.data.food[x][y] = foodVal print(s) policy[s] = pollChoice(state) self.blinkOn = False return policy