Example #1
0
def genetic(problem: Clustering,
            k,
            t_pop,
            taxa_cross,
            taxa_mutacao,
            t=2.,
            max_sem_melhora=10,
            max_iter=5000):
    """ Parametros : 
            problem : uma instancia do problema de clustering
            k : quantidade de centroides
            t_pop : tamanho da população
            taxa_cross : chance de ocorrer crossover
            taxa_mutacao : chance de ocorrer mutação
            max_sem_melhora : quantidade maxima de iteracoes sem melhora (critério de parada)
            max_iter : número máximo de iterações (critério de parada)
            t : tempo
    """
    start = time.process_time()
    end = 0

    if k == 1:
        return [problem.get_centroid()], time.process_time() - start, 1

    melhor = problem.generate_initial_centroids(k)
    populacao = [melhor]

    melhor_sse = np.inf
    qtd_geracoes_sem_melhora = 0

    i = 0

    while i < max_iter and qtd_geracoes_sem_melhora < max_sem_melhora and end - start < t:
        # Seleciona um estado com potencial e gera a população
        problem.selecao(populacao)
        problem.gerar_populacao(populacao, t_pop, k)

        # Realiza um numero aleatorio de crossovers e mutacoes,
        # entre metade do tamanho e o tamanho da populacao
        for _ in range(1, rand.randrange(t_pop // 2, t_pop)):
            # if end-start < t:
            #     break
            # Crossover
            if taxa_cross >= rand.random():
                x = rand.randrange(len(populacao))
                y = rand.randrange(len(populacao))
                if x == y:
                    y = y - 1
                crossover(populacao[x], populacao[y])
            # Mutacao
            if taxa_mutacao >= rand.random():
                x = rand.randrange(len(populacao))
                populacao[x] = problem.mutacao(populacao[x])

            end = time.process_time()

        melhor_da_geracao, melhor_sse_geracao = problem.melhor_da_geracao(
            populacao)

        if melhor_sse_geracao < melhor_sse:
            melhor = melhor_da_geracao
            melhor_sse = melhor_sse_geracao
            qtd_geracoes_sem_melhora = 0
        else:
            qtd_geracoes_sem_melhora += 1

        i += 1
        end = time.process_time()

    return melhor, end - start, i