class BotAgent: def __init__(self, env): """An agent based on a GOFAI bot.""" self.env = env self.on_reset() def on_reset(self): self.bot = Bot(self.env) def act(self, obs=None, update_internal_state=True, *args, **kwargs): action = self.bot.get_action() if update_internal_state: self.bot.take_action(action) return {'action': action} def analyze_feedback(self, reward, done): pass
if options.verbose: print( '%s/%s: %s, seed=%d' % (run_no + 1, options.num_runs, mission.surface, mission_seed)) optimal_actions = [] before_optimal_actions = [] non_optimal_steps = options.non_optimal_steps or int( mission.max_steps // 3) rng = Random(mission_seed) try: episode_steps = 0 while True: action = expert.get_action() if options.advise_mode and episode_steps < non_optimal_steps: if rng.random() < options.bad_action_proba: while True: action = bad_agent.act( mission.gen_obs())['action'].item() # To make things simple, only allow random left/right/fwd moves, and opening of doors if action in (mission.actions.left, mission.actions.right, mission.actions.forward): break fwd_pos = mission.agent_pos + mission.dir_vec fwd_cell = mission.grid.get(*fwd_pos) if action == mission.actions.toggle and fwd_cell is not None and fwd_cell.type == 'door': break