class_docstr: Evolutionary optimizer, which samples random perturbations and applies them either as positive
  or negative update depending on their improvement of the loss (specification key:
  `evolutionary`).
  
  Args:
      learning_rate (parameter, float > 0.0): Learning rate
          (<span style="color:#C00000"><b>required</b></span>).
      num_samples (parameter, int >= 1): Number of sampled perturbations
          (<span style="color:#00C000"><b>default</b></span>: 1).
      name (string): (<span style="color:#0000C0"><b>internal use</b></span>).
      arguments_spec (specification): <span style="color:#0000C0"><b>internal use</b></span>.
code: def __init__(
      self,
      *,
      learning_rate,
      num_samples=1,
      name=None,
      arguments_spec=None,
  ):
      super().__init__(name=name, arguments_spec=arguments_spec)
  
      self.learning_rate = self.submodule(
          name="learning_rate",
          module=learning_rate,
          modules=parameter_modules,
          dtype="float",
          min_value=0.0,
      )
  
      if num_samples is None:
          num_samples = 1
      self.num_samples = self.submodule(
          name="num_samples",
          module=num_samples,
          modules=parameter_modules,
          dtype="int",
          min_value=1,
      )
  
imports: import tensorflow
  from tensorforce.core import parameter_modules, tf_function, tf_util
  from tensorforce.core.optimizers import Optimizer
label_desc: Use image node_id 1 to create a new Evolutionary object from inherited base classes: Optimizer with example: obj = Evolutionary()