def _optimize(self, maxIter=1000, c1=1.193, c2=1.193, lookback=0.25, standard_dev=None):
        """
        
        :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: 
        """
        
        gBests = []

        for swarm in self._sample(maxIter, c1, c2, lookback, standard_dev):

            #swarms.append(swarm)
            gBests.append(self._gbest.copy())

        return gBests