Baixe o app para aproveitar ainda mais
Prévia do material em texto
¹ Acadêmico da Universidade Federal do Oeste do Pará, 8º semestre, matrícula 201200474. UNIVERSIDADE FEDERAL DO OESTE DO PARÁ INSTITUTO DE ENGENHARIA E GEOCIÊNCIAS PROGRAMA DE CIÊNCIA E TECNOLOGIA Avaliação 1 (2015/2) Endrew Henrique Barreto ¹ 23 de fevereiro de 2016 Consideração Todo conteúdo desta avaliação fora desenvolvido no software MATLAB® versão 2015, e quanto ao tratamento dos dados de resposta utilizou-se o Microsoft Excel® (versão 2016). Respostas Questão 1 Para a otimização da função de Himmelblau (eq.1), primeiramente implementamo-la em um arquivo “.m” do MATLAB, o script pode ser visto no Anexo I. Vale lembrar que o nome designado a função (himmelblau) deve ser o mesmo nome do arquivo “.m”. Matematicamente a função é da forma: 𝑓(𝑥, 𝑦) = (𝑥2 + 𝑦 − 11)2 + (𝑥 + 𝑦2 − 7)2 (01) Feito isto, podemos utilizar o GA para varrer o espaço de busca da função a procura de um valor ótimo. A fim de que o algoritmo seja executado 10 vezes desenvolvemos um script com um laço de iteração, o mesmo consta no anexo II. Este deve estar na mesma pasta do arquivo “.m” da função de Himmelblau quando for executado. Embora não tenha sido requisitado pelo comando da questão, a efeito comparativo decidiu-se executar uma otimização da mesma função utilizando a Metaheurística Particle Swarm (PSO). Para as configurações padrões dos solvers GA e PSO, a exceção da alteração na quantidade de partículas neste último, configurou-se para 50 (como no GA), e na taxa de crossover do GA que fora de 0,75. Encontramos os seguintes resultados: Tabela 1: Pontos ótimos e valores ótimos (fitness) resultantes da otimização da função de Himmelblau com o GA e PSO. Ponto ótimo Himmelblau GA PSO Fitness X Y X Y GA PSO 3,106073 1,943600 -2,805117 3,131312 0,363157 4,42E-11 3,605484 -1,870051 3,584429 -1,848127 0,027282 1,98E-11 3,601745 -1,855694 -2,805118 3,131312 0,015715 1,86E-11 3,582423 -1,848179 3,584428 -1,848127 0,000211 2,25E-16 3,041823 1,947932 -2,805118 3,131313 0,067059 2,63E-15 3,005751 2,062981 3,584428 -1,848127 0,077967 3,42E-12 -2,671416 3,111104 3,000000 2,000000 0,566214 7,10E-14 3,000791 1,996658 3,000001 2,000001 0,000160 1,12E-10 2,896229 2,054282 3,000001 1,999999 0,324420 3,38E-11 -3,764862 -3,283020 2,999997 2,000003 0,012024 3,45E-10 0,145421 5,77E-11 Média 3,023787 1,945766 3,000000 2,000000 0,047171 1,92E-11 Mediana 2,744542 2,334139 2,936226 2,150475 0,199435 1,07E-10 Desvio Padrão Para a tabela 1, utilizamos seis casas decimais, junto com este relatório está sendo enviado o arquivo em Excel que contêm o valor com todas as casas decimais fornecidas pelo MATLAB. Sabemos que esta função (Himmelblau) tem os seguintes mínimos locais: 𝑓(3.0, 2.0) = 0.0 𝑓(−2.805118, 3.131312) = 0.0 𝑓(−3.779310, −3.283186) = 0.0 𝑓(3.584428, −1.848126) = 0.0 Olhando estes pontos e comparando-os com os da tabela 1, podemos ver que o GA encontrou vários mínimos locais, os mais acurados e precisos estão destacados em verde. Olhando para os pontos mínimos, vemos que a precisão do GA se dá em média até a segunda casa decimal. Agora, atentando para os resultados do PSO vemos que o algoritmo encontra três mínimos locais, e as várias execuções forneceram valores bem acurados. Para este, comparando seus resultados com os mínimos conhecidos notamos que sua precisão se dá até a quinta casa decimal. Quanto a média, não podemos extrair valores coerentes dos pontos, uma vez que há diversos mínimos encontrados (relacionado a aleatoriedade dos métodos que vamos citar mais a frente). Mas a média dos valores das fitness encontradas nos mostra uma tendência geral das performances das execuções, uma vez que todos os mínimos assumem valor nulo para a função objetivo, no GA este valor foi de 0,145421, dependendo da magnitude do problema a ser resolvido podemos considerar que o mínimo global da função é o valor nulo ou bem próximo dele (caso a função não seja conhecida). Já o PSO teve a média das fitness o valor nulo (para as casas consideradas), já que nos conhecemos o valor mínimo que a função assume, podemos afirmar que a performance deste fora bem melhor que a do GA, e ainda, que ele fornece em seus dados uma precisão maior que aquele, podemos confirmar isto verificando o desvio padrão das fitness deste, que é nulo até a nona casa decimal. Já da mediana, podemos extrair o ponto central dos 10 mínimos encontrados pelos algoritmos, ambos tiveram a mediana em torno do ponto 𝑥 = 3.0 e 𝑦 = 2.0, mais uma vez podemos ver a diferença de precisão entra ambos se verificarmos a tabela. Assim valida-se a existência de um mínimo para a função neste ponto. Perceba também que este é o mínimo global encontrados pelo algoritmo (ver fitness na tabela 1). Vale lembrar que todos resultados até aqui foram obtidos com as configurações defaults do MATLAB, podemos ajudar o GA a encontrar resultados melhores adicionando a este uma restrição lateral, vamos definir o espaço de busca para o intervalo em que a função apresenta diversos mínimos locais, e para isto escolheremos valores de −5 para o limite inferior e 5 para superior (tanto para 𝑥, quanto para 𝑦). Isto se faz incrementando os dois vetores na parte do comando abaixo (que pode ser encontrada no script do anexo II): [x fval exitflag] = ga(@himmelblau,2,[],[],[],[],[-5 -5],[5 5],[],[],options) Assim, ao executar novamente o script do GA obtemos os seguintes dados: Tabela 2: Pontos ótimos e valores ótimos resultantes da otimização da função de Himmelblau com o GA com restrição lateral de -5 e 5. Ponto ótimo Himmelblau GA Fitness X Y GA 2,999994 2,000003 1,11E-10 -2,805114 3,131316 1,30E-09 2,999997 1,999998 1,28E-09 3,584438 -1,848142 5,62E-10 3,000002 2,000000 7,34E-09 2,999998 2,000002 1,35E-10 2,999986 2,000029 1,25E-10 -3,779300 -3,283181 1,32E-08 2,999999 2,000003 6,08E-09 3,35E-09 Média 2,999997 2,000002 1,28E-09 Mediana 2,828423 2,147354 4,59E-09 Desvio Padrão Observe que agora o GA encontrou todos os quatro mínimos (destacados em verde os mais precisos) e que todas as execuções forneceram um valor bem próximo aos conhecidos, a precisão média quando se trata dos pontos agora é da ordem da quarta casa decimal. Note que o desvio padrão das fitness encontrada é de magnitude nano. Uma melhora significativa se compararmos os dados com a tabela 1. Outro fator importante a ser lembrado é a moda, perceba que o ponto modal das 10 execuções em ambos métodos fora o (3.0, 2.0). Como o método do PSO ao contrário do GA não gera uma nova população a cada iteração, e seus membros se locomovem no espaço de busca sobre influência também de um fator global (gbest) induziria que este ponto é onde se encontra o mínimo global da função (caso não tivéssemos conhecimento da função), uma vez também que para este obtivemos o menor valor de fitness. Perceba que as Metaheurísticas são um bom ferramental para encontrar mínimos locais, ao contrário dos métodos determinísticos que inicializam com um ponto e avançam no espaço de busca gradativamente utilizando alguma informação secundária da função (derivadas, por exemplo), as Metaheurísticas como o GA e o PSO inicializam seus cálculos com uma população de pontos, que é gerada aleatoriamente, o que alavanca uma dispersão da busca. Assim os algoritmos estão menos propensos a bacias de atração. É pelo padrão estocástico associado ao método, que ao executar encontramos resultados diferentes, e com isso também, mínimos diferentes. Questão 2 Essa questão foi desenvolvida com o aplicativo de otimização do MATLAB,com o solver “ga-algoritm genetic”, cuja especificações constam no apêndice I. Para a otimização da função de Himmelblau já descrita aqui, experimentamos variar alguns parâmetros dos operadores do GA. As seguintes alterações nas configurações padrões foram feitas: Alteração 1: Aumento no tamanho da população, configurada para conter 100 indivíduos. Alteração 2: Mudança na taxa de crossover, configurada para 60 %. Alteração 3: Troca da função de mutação, selecionou-se a uniform com probabilidade padrão de 0,01. A função de mutação uniform se divide em duas etapas, em primeiro lugar o algoritmo seleciona uma porção do vetor de entrada bitstring de cada indivíduo para mutação, sendo que cada entrada tem a mesma probabilidade de ser selecionada e sofrer mutação (alternar entre 0 e 1 no caso da codificação binária), escolheu-se a probabilidade padrão de 1%. No segundo passo substitui-se cada entrada selecionada pelo valor “sorteado” (0 ou 1). Observação: cada alteração fora feita separadamente, ou seja, os demais parâmetros permaneceram nos padrões. Resultados obtidos: Tabela 3: Dados de saída da otimização da função de Himmelblau com alteração dos parâmetros do GA. Solução Ótima da Himmelblau Alteração GA X Y Fitness 1 2,983000 2,014000 0,009333 2 3,011000 1,985000 0,005154 3 2,926000 2,321000 1,736943 2,973333 2,106667 0,583810 Média 3,011000 2,014000 0,009333 Mediana 0,103718 0,027514 0,786340 Desvio Padrão Nesta questão o algoritmo foi executado até que as três configurações encontrassem o mínimo (3.0, 2.0), para melhorar a comparação. Desta forma, a média, mediana e desvio padrão estão bem ajustadas. A primeira alteração gerou um bom resultado, com uma população um pouco maior a diversidade de informações aumenta, isto pode ser bom quando o aumento é moderado. Além do mais, se a população aumenta, as regiões analisadas pelo algoritmo são maiores, inferindo indiretamente na precisão dos resultados. Pode-se ver a performance da execução na figura abaixo: Figura 1: Valor da Fitness e Distância Média entre os indivíduos (pontos) para a função de Himmelblau a cada geração, com 100 indivíduos cada. Já a segunda alteração está relacionada à aleatoriedade maior, com 60% de crossover a quantidade de “características” adaptativas passadas a próxima geração diminui, uma vez que agora 40% dos indivíduos sofrem mutação. Ainda assim, um resultado não muito diferente da configuração anterior fora alcançado, mas perceba que se a taxa de mutação for alta, o algoritmo genético se torna em sua maioria aleatório e provavelmente de difícil convergência. Isto pode ser visto no aumento da distância média entre os indivíduos e na quantidade maior de gerações ilustradas no gráfico abaixo: Figura 2: Valor da Fitness e Distância Média entre os indivíduos (pontos) para a função de Himmelblau a cada geração, com 60% de taxa de crossover. A última alteração forneceu o pior resultado, a mutação com probabilidade uniforme e baixa (0,01) pode ter influenciado de maneira global na população, de forma que a parte que sofre mutação a cada geração não convirja. Ilustra o gráfico abaixo a performance extraída: Figura 3: Valor da Fitness e Distância Média entre os indivíduos (pontos) para a função de Himmelblau a cada geração, com função de mutação "uniform" padrão. Apesar disto, os três resultados tiveram um desvio padrão relativamente baixo entre os valores dos pontos, e da fitness se deu quase da ordem de uma unidade, cortesia deste último resultado, se este não fosse levando em consideração seria da ordem de 0,004. Das medidas de tendência central, tanto a mediana como a média estão em torno do ponto mínimo conhecido, com precisão da segunda casa decimal. Questão 3 Para a otimização da função de Rastringinsfcn utilizou-se dos scripts do GA e PSO (anexos II e III), alterando apenas a função fornecida como entrada no primeiro argumento do comando em ambos os códigos, da seguinte forma: ... ga(@(x)rastriginsfcn(x/10), .....) ... particleswarm((@(x)rastriginsfcn(x/10),....) Chama-se assim a função como anônima no MATLAB, e atribuo um valor para 5 na variável n. As execuções forneceram os seguintes resultados: Tabela 4:Resultados de otimização da função Rastriginsfcn utilizando os algoritmos GA e PSO. Ponto ótimo Rastriginsfcn GA PSO Fitness X Y X Y GA PSO -0,194880 -0,041591 -1,13E-07 -1,97E-08 0,078683 2,84E-14 -0,072189 -0,015653 -9,62E-09 -2,95E-09 0,010823 0,00E+00 -0,124224 0,027938 1,46E-06 -7,37E-06 0,032148 1,12E-10 -0,097408 -0,006588 1,41E-06 2,63E-06 0,018904 1,76E-11 -0,158796 -0,029108 -4,19E-06 -8,85E-07 0,051667 3,64E-11 -0,129499 -0,013000 -2,87E-07 -1,13E-06 0,038445 3,32E-11 Média -0,124224 -0,015653 -9,62E-09 -1,97E-08 0,032148 1,76E-11 Mediana 0,048670 0,026462 2,31E-06 3,73E-06 0,027287 4,65E-11 Desvio Padrão É sabido que esta função possui o mínimo global em (0.0,0.0), onde o valor da função é nulo. Nos dados do GA podemos ver que cada execução forneceu um resultado em torno deste ponto, tanto que a média e mediana apontam este valor, sendo estas são poucos discrepantes entre si, além do desvio padrão ser decimal tanto para o valor dos pontos quanto para as fitness. O mesmo ocorre com o PSO, contudo perceba que o algoritmo é de uma precisão muito maior, como o algoritmo não destrói sua população a cada iteração, a informação do mínimo global é conservada a partir do momento que é descoberta e ao decorrer de um tempo acaba atraindo todos indivíduos para ela, estes ainda podem se locomover no espaço de busca, e por isto podem varrer mais afundo aquela região. APÊNDICES APÊNDICE I Figura 4: Aplicativo de otimização com o solver ga, chamado no console com o comando optimtool('ga'). Na aba Problem devemos informar a função a ser otimizada e o número de variáveis, nos campos Fitness function e Number of variables, respectivamente. Podemos restringir o espaço de busca do GA, isto se faz no campo Bounds, em que Lower é o limite inferior para as variáveis e Upper o superior para as mesmas, perceba que se tivermos mais de uma variável na função a entrada para estes parâmetros é na forma vetorial, por exemplo, [-50 -50] e [50 50] para Lower e Upper respectivamente. Desta forma, todo indivíduo gerado nos operadores do GA, ao fim do processo estarão dentro desse intervalo. Nas opções, podemos especificar a quantidade de indivíduos na população que o GA utilizará para varrer os espaço de busca, isto se faz no campo Population size (por padrão, é definido 50 indivíduos). No campo Initial range pode-se especificar os limites inferior e superior para os vetores de entrada dos indivíduos da população inicial, que é criada pelo GA. Vale ressaltar que a restrição configurada neste campo se aplicará apenas a população inicial. Quanto à reprodução dos indivíduos a cada geração, podemos configurar a taxa de crossover e a de mutação na aba Reproduction. Como vemos na figura abaixo, uma extensão da figura 1: Figura 5: Aba de opções do aplicativo de Otimização, para o solver ga - Genetic Algorithm. A taxa de crossover padrão é de 80% (0.8), sendo os 20% (0.2) restantes do operador mutação. Estas taxas definirão a quantidade da população que irá passar por crossover e a porção que sofrerá mutação. Ou seja, desta forma se configura os operadores genéticos que irão operar na reprodução de cada nova geração. Podemos especificar manualmente essas taxas, imprimindo no campo crossover fraction a porcentagem desejada (em número fracionado).ANEXOS ANEXO I function [z] = himmelblau(k) z = (k(1)^2+k(2)-11).^2 +(k(1)+k(2)^2-7).^2; end ANEXO II %% Universidade Federal do Oeste do Pará % % Programa de Ciência e Tecnologia % % Inteligência Computacional % % Prof. Dr. Anderson Meneses % Discente: Endrew Henrique Barreto %% GA por linha de comando %% %[x fval exitflag] = ga(@himmelblau,2) % Otimiza a função informada, % vetores/valores de saída da % função: x (ponto ótimo), % fval (valor ótimo). Dados de % entrada: ga(função,número de % variáveis) %% Laço de iteração para o GA %% % Caso queira executar o GA diversas vezes e obter vários valores de % fitness, descomenta-se o código abaixo. n = 10; % números de vezes que o GA será executado; fitnessga = zeros(n,1); % vetor que armazenará os valores da fitness para % cada geração pontootimoga = zeros(n,2);% vetor que armazena o valor das % variáveis no ponto ótimo (x,y) for i = 1:n options = gaoptimset('CrossoverFraction',0.75); [x fval exitflag] = ga(@himmelblau,2,[],[],[],[],[],[],[],[],options) fitnessga(i) = fval; pontootimoga(i,1) = x(1); pontootimoga(i,2) = x(2); end ANEXO III %% Universidade Federal do Oeste do Pará % % Programa de Ciência e Tecnologia % % Inteligência Computacional % % Prof. Dr. Anderson Meneses % Discente: Endrew Henrique Barreto %% PSO por linha de comando %% % rng default % For reproducibility % [x,fval,exitflag] = particleswarm(@himmelblau,2) % Otimiza a função informada, % vetores/valores de saída da % função: x (ponto ótimo), % fval (valor ótimo). Dados de % entrada: ga(função,número de % variáveis) %% Laço de iteração para o PSO %% % Caso queira executar o GA diversas vezes e obter vários valores de % fitness, descomenta-se o código abaixo. n = 10; % números de vezes que o GA será executado; fitnesspso = zeros(n,1); % vetor que armazenará os valores da fitness para % cada geração pontootimopso = zeros(n,2); % vetor que armazena o valor das % variáveis no ponto ótimo (x,y) for i = 1:n options = optimoptions('particleswarm','SwarmSize',50); [x fval exitflag] = particleswarm(@himmelblau, 2, [],[],options) fitnesspso(i) = fval; pontootimopso(i,1) = x(1); pontootimopso(i,2) = x(2); end
Compartilhar