Algoritmos Genéticos Algoritmos Genéticos (GA) são algoritmos de busca heurística baseados em ideias de seleção natural e genética. Dessa forma, eles representam uma forma inteligente de se fazer uma busca aleatória para resolver problemas de otimização 5. As técnicas básicas de algoritmos genéticos foram criadas a fim de simular processos em sistemas naturais necessários para a evolução, especialmente os princípios desenvolvidos por Charles Darwin no sentido de sobrevivência do mais apto. Como Algoritmos Genéticos simulam a sobrevivência do mais apto após sucessivas gerações, cada geração consiste de uma população de vetores, que são análogos aos cromossomos que existem no DNA. Cada indivíduo é um ponto no espaço de busca e uma solução possível para o problema. Os fundamentos dos Algoritmos Genéticos são: 5 Problemas de Otimização são problemas que envolvem a maximização ou minimização de algum parâmetro. Quando o GPS do seu carro escolhe uma rota, ele está resolvo um problema de otimização de caminho, quando você quer escolher quais livros levar na sua mochila de forma a maximizar o número de livros que você leva pra escola também é um problema de otimização. Indivíduos em uma população competem por recursos e parceiros. Os indivíduos mais bem sucedidos em cada competição vão produzir mais prole. Genes de indivíduos bons se propagam na população de forma que dois pais bons produzem, de vez em quando, uma prole melhor que os pais. A cada sucessiva geração a população se torna mais apta ao ambiente. Os Algoritmos Genéticos são compostos, basicamente, de três passos principais: 1. Seleção, que a cada geração elimina os indivíduos menos aptos. 2. Crossover, que representa o acasalamento entre dois indivíduos. 3. Mutação, que introduz mudanças aleatórias nos indivíduos. Suponha que deseja-se saber valores de a, b, c e d que tornam verdade a seguinte igualdade a + 2b + 3c + 4d = 30. Para resolver esse
38 experimentos com matlab problema, podemos minimizar a função f (a, b, c, d) = (a + 2b + 3c + 4d 30) 2. Como nosso problema tem apenas quatro variáveis, nossos cromossomos (indivíduos) podem ser representados por vetores de 4 posições ([a, b, c, d]). Dessa forma, nossa função de aptidão (fitness) pode ser descrita como: function [ y ] = fitness( x ) a = x(:,1); b = x(:,2); c = x(:,3); d = x(:,4); y = (a + 2*b + 3*c + 4*d 30).^2; A função fitness recebe uma matriz x, onde cada linha é um indivíduo da população. Seleção A seleção é a parte do Algoritmo Genético onde os melhores indivíduos são selecionados, segundo a função de fitness, e os piores indivíduos são eliminados. function [ p2 ] = selecao( p1 ) f = fitness(p1); [~,i] = sort(f); p2 = zeros(size(p1)); p2(1:/2,:) = p1(i(1:/2),:); A seleção inicialmente aplica a função de fitness em todos os elementos da população. Após isso, utiliza-se a função sort para ordenar os resutados em ordem crescente, de forma que o primeiro elemento é o mais apto. Após isso, mantmos os 50% mais aptos da população e eliminamos a outra metade. Crossover Cabe aos indivíduos selecionados repopular o ambiente, por meio de acasalamento. Existem diversas técnicas de crossover, mas neste caso será escolhido um índice no cromossomo de forma que o novo indivíduo é composto de valores de um pai até o índice e de outro pai após o índice. function [ p2 ] = crossover( p1 )
algoritmos genéticos 39 n = size(p1); for i=(n(1)/2)+1:n(1) k = randi(n(2) 1); x = p1(randi(n(1)/2),:); y = p1(randi(n(1)/2),:); p1(i,:) = [x(1:k) y(k+1:)]; p2 = p1; Neste caso, escolhe-se aleatoriamente um pivô (k) e dois indivíduos pais (x e y), após isso, gera-se um novo indivíduo composto pelos genes de x até o pivô e os genes de y após o pivô. O processo é repetido até a população voltar ao tamanho convencional. Mutação Um processo que acontece com probabilidade baixa é a mutação,que consiste em mudanças aleatórias de genes em alguns indivíduos da população. function [ p2 ] = mutacao( p1 ) n = size(p1); for i=1:n(1) if rand() < 0.01 k = randi(n(2)); p1(i,k) = 100*rand() 50; p2 = p1; A função mutacao consiste em passar em todos os indivíduos da população e modificar aleatoriamente um gene k com uma probabilidade baixa (1%). Algoritmo Principal O corpo principal de um Algoritmo Genético consiste em, repetidas vezes, chamar as funções desenvolvidas. Para isso foi criado o script abaixo: clc n = 100; m = 4; p = 100*rand(n,m) 50; while 1 p = selecao(p);
40 experimentos com matlab fitness(p(1,:)) if fitness(p(1,:)) < 1e 3 break; p = crossover(p); p = mutacao(p); p(1,:) fitness(p(1,:)) Como pode ser observado, continuamos criando novas gerações até que o valor da função fitness seja inferior a 10 3. Executando o algoritmo, podemos encontrar diversas respostas, dado a natureza aleatória da solução. Em uma execução, foi obtido o seguinte resultado: [28.2097 32.1328 21.5928 0.3204] Podemos verificar a solução com o seguinte cálculo: sum([28.2097 32.1328 21.5928 0.3204].*[1 2 3 4]) Que resulta em: ans = 30.0041 Indicando que o algoritmo foi capaz de resolver o problema de otimização. Exercícios Os exercícios devem ser enviados por e-mail em um documento pdf com o código utilizado em cada exercício e uma análise escrita de cada solução 1. Existem diversas formas de implementar mutações nos indivíduos e uma delas é trocar a posição de dois genes. (a) Implemente uma função que implemente a mutação trocando o valore referente a dois genes escolhidos aleatoriamente de um indivíduo. (b) Modifique a função mutacao para que, caso a mutação seja aplicada, com uma probabilidade de 50% aplique uma mudança aleatória em um gene (como feito no guia) e com probabilidade de 50% aplique a troca de genes (como feito na letra anterior).
algoritmos genéticos 41 2. Um problema muito comum de otimização combinatória é o chamado Problema das 8 Rainhas. Ele trata de um tabuleiro de xadrez (8 8) onde deseja-se colocar 8 rainhas de tal forma que uma rainha não pode capturar outra rainha. As rainhas podem se mover qualquer número de casas na horizontal, na vertical e nas diagonais. (a) Em geral as soluções do problema das 8 rainhas são permutações do vetor [1, 2, 3, 4, 5, 6, 7, 8]. Porque? (b) Usualmente, a operação de crossover convencional não é interessante no caso do problema das 8 rainhas. Porque? (c) Modifique os algoritmos desenvolvidos na aula a fim de resolver o problema das 8 rainhas e encontre uma solução.