def update_particle(self, part, chi=0.729843788, c=2.05):
        """Constriction factor update particle method.

        Notes
        -----
        Looks for a list of neighbours attached to a particle and
        uses the particle's best position and that of the best
        neighbour.
        """
        neighbour_pool = [self.population[i] for i in part.neighbours]
        best_neighbour = max(neighbour_pool, key=lambda x: x.best.fitness)
        ce1 = (c * random.uniform(0, 1) for _ in range(len(part)))
        ce2 = (c * random.uniform(0, 1) for _ in range(len(part)))
        ce1_p = map(operator.mul, ce1, map(operator.sub, part.best, part))
        ce2_g = map(operator.mul, ce2, map(
            operator.sub, best_neighbour.best, part))
        chi_list = [chi] * len(part)
        chi_list2 = [1 - chi] * len(part)
        a = map(operator.sub,
                map(operator.mul, chi_list, map(operator.add, ce1_p, ce2_g)),
                map(operator.mul, chi_list2, part.speed))
        part.speed = list(map(operator.add, part.speed, a))
        for i, speed in enumerate(part.speed):
            if speed < part.smin:
                part.speed[i] = part.smin
            elif speed > part.smax:
                part.speed[i] = part.smax
        part[:] = list(map(operator.add, part, part.speed))
        return
Constriction factor update particle method.

        Notes
        -----
        Looks for a list of neighbours attached to a particle and
        uses the particle's best position and that of the best
        neighbour.