Olá,
Como posso construir (dicas) um algoritmo genético em linguagem C ?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Olá,
Como posso construir (dicas) um algoritmo genético em linguagem C ?
Olá, Taís. Tudo bem?
Construir um algoritmo genético em C envolve alguns conceitos fundamentais de evolução, como seleção, cruzamento e mutação. Vou te dar algumas dicas para começar:
Estrutura do Algoritmo Genético:
Exemplo de Estrutura Básica em C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define POPULACAO 10 // Tamanho da população
#define GENOMA 5 // Tamanho de cada solução (genoma)
// Função para avaliar o fitness de uma solução
int fitness(int genoma[]) {
int soma = 0;
for (int i = 0; i < GENOMA; i++) {
soma += genoma[i];
}
return soma;
}
// Função para gerar um número aleatório entre 0 e 1
int rand_bin() {
return rand() % 2;
}
// Função para criar a população inicial
void criar_populacao(int populacao[POPULACAO][GENOMA]) {
for (int i = 0; i < POPULACAO; i++) {
for (int j = 0; j < GENOMA; j++) {
populacao[i][j] = rand_bin();
}
}
}
// Função principal
int main() {
srand(time(NULL)); // Inicializa o gerador de números aleatórios
int populacao[POPULACAO][GENOMA];
criar_populacao(populacao);
// Avalia a aptidão de cada indivíduo
for (int i = 0; i < POPULACAO; i++) {
printf("Individuo %d: ", i);
for (int j = 0; j < GENOMA; j++) {
printf("%d ", populacao[i][j]);
}
printf(" Fitness: %d\n", fitness(populacao[i]));
}
return 0;
}
Explicação do Código:
populacao[POPULACAO][GENOMA], onde cada linha é um genoma de uma solução possível.fitness soma os valores dos genes do genoma (quanto mais próximo de 1, melhor a solução).rand_bin().Próximos Passos:
Espero ter ajudado. Conte com o apoio do Fórum. Fico à disposição.
Abraços e bons estudos!
Tudo bem Renan. Obrigada pelo retorno. Como seria em Python? Teria alguma implementação especifica para otimizar jogos? Nesse caso o jogo é o Pac-Man.
Olá, Taís.
Sobre sua última dúvida, vou mostrar como implementar um algoritmo genético em Python que pode ser ajustado para otimizar estratégias de jogos como o Pac-Man.A ideia básica é usar o algoritmo genético para ensinar o personagem a escolher o melhor caminho para maximizar pontos ou evitar inimigos.
Veja este exemplo inicial:
import random
# Configurações do algoritmo
POPULATION_SIZE = 20
GENOME_LENGTH = 10 # Número de passos ou decisões
GENERATIONS = 50
MUTATION_RATE = 0.1
# Função de avaliação (fitness): avalia pontuação para um genoma
def evaluate(genome):
# Aqui você adapta o cálculo ao Pac-Man, considerando coleta de pontos e desvio de inimigos
score = 0
for step in genome:
if step == 1: # Exemplo: passo para frente coleta pontos
score += 10
elif step == 0: # Exemplo: passo inválido (bateu na parede)
score -= 5
return score
# Função para criar a população inicial
def generate_population():
return [[random.randint(0, 1) for _ in range(GENOME_LENGTH)] for _ in range(POPULATION_SIZE)]
# Seleção: Escolhe os melhores indivíduos com base na aptidão
def select(population, fitness):
sorted_population = sorted(zip(population, fitness), key=lambda x: x[1], reverse=True)
return [ind for ind, _ in sorted_population[:POPULATION_SIZE // 2]]
# Cruzamento (crossover): Combina dois genomas para criar descendentes
def crossover(parent1, parent2):
point = random.randint(1, GENOME_LENGTH - 1)
return parent1[:point] + parent2[point:]
# Mutação: Altera aleatoriamente genes para diversidade
def mutate(genome):
for i in range(len(genome)):
if random.random() < MUTATION_RATE:
genome[i] = 1 - genome[i]
return genome
# Algoritmo Genético
def genetic_algorithm():
population = generate_population()
for generation in range(GENERATIONS):
# Avalia a população
fitness = [evaluate(genome) for genome in population]
# Seleciona os melhores indivíduos
selected = select(population, fitness)
# Gera nova população com cruzamentos e mutações
new_population = []
while len(new_population) < POPULATION_SIZE:
parent1, parent2 = random.sample(selected, 2)
offspring = crossover(parent1, parent2)
new_population.append(mutate(offspring))
population = new_population
# Melhor indivíduo da geração atual
best_genome = population[fitness.index(max(fitness))]
print(f"Geração {generation + 1}: Melhor fitness = {max(fitness)}, Genoma = {best_genome}")
return best_genome
# Executa o algoritmo genético
best_solution = genetic_algorithm()
print("Melhor solução encontrada:", best_solution)
Fico à disposição. Abraços e bons estudos!
Bom dia Renan,
Desculpa a demora para responder. Obrigada pela ajuda. Foi útil sim. No momento estou desenvolvendo um banco de dados para otimizar a gestão de leitos de internação hospitalar. Desejo saber:
Na parte de testes, qual curso abrange os testes baseado na especificação ( partição por equivalência, partição por categoria...) e testes estruturais ( critérios de cobertura de linha, cobertura de condição, cobertura de ramificação, cobertura de caminhos) usando o Junit?
Oi Taís,
Sugiro marcar a resposta do Renan como solucionado ☑️ e abrir um novo tópico no Forum 😎
Bons Estudos! 🤓
Ok. Obrigada.