code: def _optimize(self, maxIter=1000, c1=1.193, c2=1.193, lookback=0.25, standard_dev=None):
          
          
          gBests = []
  
          for swarm in self._sample(maxIter, c1, c2, lookback, standard_dev):
  
              #swarms.append(swarm)
              gBests.append(self._gbest.copy())
  
          return gBests
docs: :param maxIter: maximum number of swarm iterations
          :param c1: social weight
          :param c2: personal weight
          :param lookback: how many particles to assess when considering convergence
          :param standard_dev: the standard deviation of the last lookback # of particles used to determine convergence
          :return: