code: def select_action(self, state):
      
      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)
docs: Select the best action for the given state using e-greedy exploration to
      minimize overfitting
  
      :return: tuple(action, value)