def minimize():
    global elite
    population = [gf.get_individual(utility.n_features) for i in range(go.population_size)]
    for i in range(n_iter):
        population_new = []
        if elite:
            population_new.append(max(population))
        while len(population_new) < go.population_size:
            parents = random.sample(population, 2)
            child = parents[0] + parents[1]
            population_new.append(~child)
            population = population_new
        if 0 == i % 500:
            print(max(population))
    return max(population)
def minimize(n_iter_trace = False):
    global f_eps
    population = [gf.get_individual(utility.n_features) for i in range(go.population_size)]
    for i in range(n_iter):
        tournament = random.sample(population, go.tournament_size)
        worst = min(tournament)
        tournament.remove(worst)
        population.remove(worst)
        parents = random.sample(tournament, 2)
        child = parents[0] + parents[1]
        new_individual = ~child
        if new_individual > max(population):
            info(new_individual, i) if printed else None
            if abs(new_individual.fitness) < f_eps : return new_individual if not n_iter_trace else new_individual, i
        population.append(new_individual)
    if n_iter_trace: return max(population), n_iter
    return max(population)