'Generate a population of :math:`\lambda` individuals of type
*ind_init* from the current strategy.
:param ind_init: A function object that is able to initialize an
individual from a list.
:returns: A list of individuals with a private attribute :attr:`_ps`.
This last attribute is essential to the update function, it
indicates that the individual is an offspring and the index
of its parent.'

def generate(self, ind_init):

    arz = numpy.random.randn(self.lambda_, self.dim)
    individuals = list()
    for (i, p) in enumerate(self.parents):
        p._ps = ('p', i)
    if (self.lambda_ == self.mu):
        for i in range(self.lambda_):
            individuals.append(ind_init((self.parents[i] + (self.sigmas[i] * numpy.dot(self.A[i], arz[i])))))
            individuals[(-1)]._ps = ('o', i)
    else:
        ndom = tools.sortLogNondominated(self.parents, len(self.parents), first_front_only=True)
        for i in range(self.lambda_):
            j = numpy.random.randint(0, len(ndom))
            (_, p_idx) = ndom[j]._ps
            individuals.append(ind_init((self.parents[p_idx] + (self.sigmas[p_idx] * numpy.dot(self.A[p_idx], arz[i])))))
            individuals[(-1)]._ps = ('o', p_idx)
    return individuals
