Exemple #1
0
    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