def select_action(self, state):
    """
    Select the best action for the given state using e-greedy exploration to
    minimize overfitting

    :return: tuple(action, value)
    """
    value = 0
    if self.steps < self.min_steps:
      action = np.random.randint(self.actions)
    else:
      self.eps = max(self.eps_end, self.eps * self.eps_decay)
      if random.random() < self.eps:
        action = np.random.randint(self.actions)
      else:
        self.local.eval()
        with torch.no_grad():
          state = torch.tensor(state, device=self.device, dtype=torch.float).unsqueeze(0)
          Q = self.local(state)
          value, action = torch.max(Q, 1)

    return int(action), float(value)
Select the best action for the given state using e-greedy exploration to
    minimize overfitting

    :return: tuple(action, value)