class_docstr: Implement the Boltzmann Q Policy
  
  Boltzmann Q Policy builds a probability law on q values and returns
  an action selected randomly according to this law.
class_docstr_tok: ["Implement","the","Boltzmann","Q","Policy","Boltzmann","Q","Policy","builds","a","probability","law","on","q","values","and","returns","an","action","selected","randomly","according","to","this","law","."]
docstr: Return the selected action
  
  # Arguments
      q_values (np.ndarray): List of the estimations of Q for each action
  
  # Returns
      Selection action
code: def select_action(self, q_values):
      """Return the selected action
  
      # Arguments
          q_values (np.ndarray): List of the estimations of Q for each action
  
      # Returns
          Selection action
      """
      assert q_values.ndim == 1
      q_values = q_values.astype("float64")
      nb_actions = q_values.shape[0]
  
      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)
      return action
  
imports: from __future__ import division
  import numpy
  from rl.util import *
label_desc: Use image node_id 2 for calling the BoltzmannQPolicy obj's underlying member method code with example usage: obj.select_action(q_values) and returns: action