code: def select_action(self, q_values):
          
          assert q_values.ndim == 1
          q_values = q_values.astype('float64')
          nb_actions = q_values.shape[0]
  
          if np.random.uniform() < self.eps:
              exp_values = np.exp(np.clip(q_values / self.tau, self.clip[0], self.clip[1]))
              probs = exp_values / np.sum(exp_values)
              action = np.random.choice(range(nb_actions), p=probs)
          else:
              action = np.argmax(q_values)
          return action
docs: Return the selected action
          The selected action follows the BoltzmannQPolicy with probability epsilon
          or return the Greedy Policy with probability (1 - epsilon)
  
          # Arguments
              q_values (np.ndarray): List of the estimations of Q for each action
  
          # Returns
              Selection action