docs: def run_opt(self, popsize, numgen, processors,
                  plot=False, log=False, **kwargs):
          """
          Runs the optimizer.
          :param popsize:
          :param numgen:
          :param processors:
          :param plot:
          :param log:
          :param kwargs:
          :return:
          """
          self._params['popsize'] = popsize
          self._params['numgen'] = numgen
          self._params['processors'] = processors
          self._params['plot'] = plot
          self._params['log'] = log
          # allows us to pass in additional arguments e.g. neighbours
          self._params.update(**kwargs)
          self.halloffame = tools.HallOfFame(1)
          self.stats = tools.Statistics(lambda thing: thing.fitness.values)
          self.stats.register("avg", numpy.mean)
          self.stats.register("std", numpy.std)
          self.stats.register("min", numpy.min)
          self.stats.register("max", numpy.max)
          self.logbook = tools.Logbook()
          self.logbook.header = ["gen", "evals"] + self.stats.fields
          self._params['model_count'] = 0
          start_time = datetime.datetime.now()
          self.initialize_pop()
          for g in range(self._params['numgen']):
              self.update_pop()
              self.halloffame.update(self.population)
              self.logbook.record(gen=g, evals=self._params['evals'],
                                  **self.stats.compile(self.population))
              print(self.logbook.stream)
          end_time = datetime.datetime.now()
          time_taken = end_time - start_time
          self._params['time_taken'] = time_taken
          print("Evaluated {0} models in total".format(
              self._params['model_count']))
          print("Best fitness is {0}".format(self.halloffame[0].fitness))
          print("Best parameters are {0}".format(self.parse_individual(
              self.halloffame[0])))
          for i, entry in enumerate(self.halloffame[0]):
              if entry > 0.95:
                  print(
                      "Warning! Parameter {0} is at or near maximum allowed "
                      "value\n".format(i + 1))
              elif entry < -0.95:
                  print(
                      "Warning! Parameter {0} is at or near minimum allowed "
                      "value\n".format(i + 1))
          if self._params['log']:
              self.log_results()
          if self._params['plot']:
              print('----Minimisation plot:')
              plt.figure(figsize=(5, 5))
              plt.plot(range(len(self.logbook.select('min'))),
                       self.logbook.select('min'))
              plt.xlabel('Iteration', fontsize=20)
              plt.ylabel('Score', fontsize=20)