def METHOD_NAME(self):
    episode = episode_steps = 0
    episode_steps += 1
    if self.observation is None:
        self.observation = self.env.reset()
        self.agent.reset(self.observation, self.args.noise_factor)
    action = self.agent.select_action(self.observation, noise_factor=self.args.noise_factor)
    self.observation, reward, done, _ = self.env.step(action)
    self.agent.observe(reward, self.observation, done, self.step)
    if (episode_steps >= self.args.max_step and self.args.max_step):
        # [optional] evaluate
        if episode > 0 and self.args.validate_interval > 0 and \
           episode % self.args.validate_interval == 0:
            reward, dist = self.evaluate(self.env, self.agent.select_action)
        tot_Q = 0.
        tot_value_loss = 0.
        lr = (3e-4, 1e-3)
        for i in range(self.args.episode_train_times):
            Q, value_loss = self.agent.update_policy(lr)
            tot_Q += Q.data.cpu().numpy()
            tot_value_loss += value_loss.data.cpu().numpy()
        # reset
        self.observation = None
        episode_steps = 0
        episode += 1
    self.step += 1