def crowded_comparison_operator(self, other, pareto):
    """
    The crowded-comparison operator guides the selection process at the various
    stages of the algorithm toward a uniformly spread-out Pareto-optimal front.
    The operator returns True if *self* is better than *other* and
    False otherwise.

    :param self: First individual of the comparison
    :param other: Second individual of the comparison
    :param pareto: A ParetoInfo object with the information regarding
                   the Pareto fronts defined by the current population
    :return: True if *self* is better than *other* and False otherwise.
    """

    # Between two solutions with differing nondomination ranks, we prefer the
    # solution with the lower (better) rank. Otherwise, if both solutions
    # belong to the same front, then we prefer the solution that is located in
    # a lesser crowded region, i.e., with the larger crowding distance.
    if (pareto.rank[self] < pareto.rank[other]) or \
            (pareto.rank[self] == pareto.rank[other] and
             pareto.crowding_distance[self] > pareto.crowding_distance[other]):
        return True

    else:
        return False