<jupyter_start><jupyter_text>Algoritmos Genéticos<jupyter_code>from random import randint, sample, random
from pprint import pprint

# Definição da função de fitness
def fitness(cromossomo):
    return sum(cromossomo)    
    
    
def selecao_pais_torneio(populacao, tam_torneio):
    """Retorna uma lista com os pais dois a dois"""
    tam_populacao = len(populacao) // 2
    
    pais = []
    for i in range(tam_populacao):
        
        torneio1 = sample(populacao, tam_torneio)
        torneio1.sort(key=lambda item: item[1], reverse=True)
        pai1 = torneio1[0]
        
        torneio2 = sample(populacao, tam_torneio)
        torneio2.sort(key=lambda item: item[1], reverse=True)
        pai2 = torneio2[0]
            
        pais.append((pai1, pai2))
        
    return pais
    
def reproducao(pais, taxa_mutacao):
    """Executa o crossover e a mutacao"""
    filhos = []
    for casal in pais:
        p1 = casal[0][0]
        p2 = casal[1][0]
        
        # Crossover
        corte = randint(1, len(p1) - 1)
        
        f1 = p1[:corte] + p2[corte:]
        f2 = p2[:corte] + p1[corte:]
        
        # Mutacao
        for i in range(len(f1)):
            if random() < taxa_mutacao:
                f1[i] = 0 if f1[i] == 1 else 1

        for i in range(len(f2)):
            if random() < taxa_mutacao:
                f2[i] = 0 if f2[i] == 1 else 1
                
        filhos.append((f1, fitness(f1)))
        filhos.append((f2, fitness(f2)))
        
    return filhos
        
def gerar_populacao_inicial(tam_populacao, tam_cromossomo): 
    populacao = []
    for i in range(tam_populacao):
        cromossomo = [randint(0, 1) for _ in range(tam_cromossomo)]
        populacao.append(cromossomo)
    return populacao
# Parametros de configuracao
TAM_CROMOSSOMO = 8
TAM_POPULACAO = 100

MAX_GERACOES = 30 # Numero maximo de geracoes

TAM_TORNEIO = 3

TAXA_MUTACAO = 0.1 # 

# 1. Definicao da populacao inicial
populacao_ini = gerar_populacao_inicial(TAM_POPULACAO, TAM_CROMOSSOMO)
pprint(populacao_ini)

# 2. Calcula o fitness da populacao
populacao = [(ind, fitness(ind)) for ind in populacao_ini]
populacao.sort(key=lambda item: item[1], reverse=True)
pprint(populacao)

# 3. Verifica criterio de parada
for gen in range(1, MAX_GERACOES):
    print(f'GERACAO: {gen}')
    
    # 4. Seleciona os pais para procriação
    #print('PAIS SELECIONADOS: ')
    pais = selecao_pais_torneio(populacao, TAM_TORNEIO)
    #pprint(pais)
    #print()
    
    # 5. Realiza a recombinação (crossover) e mutação
    #print('GERACAO DOS FILHOS: ')
    filhos = reproducao(pais, TAXA_MUTACAO)
    #pprint(filhos)
    #print()
    
    # 6. Seleciona os individuos para a proxima geracao
    #print('SELECAO DOS APTOS: ')
    total = populacao + filhos
    total.sort(key=lambda item: item[1], reverse=True)
    populacao = total[:TAM_POPULACAO] # ELITISMO
    #pprint(populacao)
    pprint([x for x in populacao])
    print()<jupyter_output>GERACAO: 1
[([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 1, 1], 8),
 ([1, 1, 1, 1, 1, 1, 0, 1], 7),
 ([1, 1, 1, 1, 1, 0, 1, 1], 7),
 ([1, 1, 0, 1, 1, 1, 1, 1], 7),
 ([1, 1, 1, 1, 1, 1, 0, 1], 7),
 ([1, 1, 1, 1, 1, 1, 1, 0], 7),
 ([1, 1, 1, 0, 1, 1, 1, 1], 7),
 ([1, 1, 1, 1, 1, 0, 1, 1], 7),
 ([0, 1, 1, 1, 1, 1, 1, 1], 7),
 ([1, 0, 1, 1, 1, 1, 1, 1], 7),
 ([1, 1, 1, 0, 1, 1, 1, 1], 7),
 ([0, 1, 1, 1, 1, 1, 1, 1], 7),
 ([1, 1, 1, 1, 0, 1, 1, 1], 7),
 ([1, 1, 1, 0, 1, 1, 1, 1], 7),
 ([1, 1, 1, 1, 1, 1, 0, 1], 7),
 ([1, 1, 1, 0, 1, 1, 1, 1], 7),
 ([1, 0, 1, 1, 1, 1, 1, 1], 7[...]
{'fraction_non_alphanumeric': 0.181841046277666, 'fraction_numerical': 0.08702213279678069, 'mean_word_length': 2.4978012313104663, 'pattern_counts': {'":': 0, '<': 6, '<?xml version=': 0, '>': 4, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '340520', 'license': 'MIT', 'n_tokens_mistral': 2151, 'n_tokens_neox': 1821, 'n_words': 535, 'path': 'Projetos/Aula05/ag.ipynb', 'repo_name': 'chaua/inteligencia-computacional', 'size': '3976'}