Modelo de Algoritmo Genético para o Escalonamento de Tarefas em uma Arquitetura Multiprocessadora Autor: Adilmar Coelho Dantas 1, Orientador: Márcia Aparecida Fernandes 1 1 Programa de Pós-Graduação em Ciência da Computação Universidade Federal do Uberlândia (UFU) Uberlândia MG Brasil adilmar@mestrado.ufu.br Nível: Mestrado Resumo. Este artigo apresenta um algoritmo genético baseado na teoria da evolução para resolver o problema de escalonamento de tarefas em máquinas paralelas idênticas. O problema consiste em determinar a ordem de processamento das tarefas nas máquinas, minimizando o tempo máximo de finalização do processamento (makespan). O objetivo do algoritmo genético é determinar uma aproximação do conjunto de soluções eficientes. As técnicas de crossover, mutação e torneio foram utilizados com diferentes índices com o objetivo de avaliar o algoritmo. Palavras-Chave. Escalonamento de Tarefas, Algoritmo Genético, Inteligência Computacional. 1. Introdução e Motivação O problema de escalonamento de tarefas consiste em determinar a ordem de processamento das tarefas nas máquinas, minimizando o tempo máximo de finalização do processamento (makespan). É um problema de otimização combinatória bem conhecido pertencente à classe de problemas intratáveis (NP completo). Este Artigo tem como o objetivo o desenvolvimento de um algoritmo e a realização de testes a fim de verificar seu desempenho e assertividade em situações diversas com o objetivo de chegar a uma melhor configuração para o algoritmo genético proposto e compará-lo a resultados de outros trabalhos com essa mesma proposta. 2. Fundamentação Teórica Algoritmos genéticos usam modelos computacionais dos processos naturais de evolução como uma ferramenta para resolver problemas. Apesar de haver uma grande variedade de modelos computacionais propostos (CAMPELLO e MACULAN 1994), todos eles têm em comum o conceito de simulação da evolução das espécies através de seleção, mutação e reprodução, processos estes que dependem do desempenho dos indivíduos desta espécie dentro do ambiente. Os algoritmos evolucionários funcionam mantendo uma população de estruturas que evoluem de forma semelhante à evolução das espécies. A estas estruturas são aplicados os chamados operadores genéticos, como recombinação e mutação, entre outros (LINDEN 2012). Cada indivíduo recebe uma aptidão ou avaliação que é uma quantificação da sua qualidade como solução do problema em questão. Baseado nesta avaliação é que serão aplicados os operadores genéticos de forma a simular a sobrevivência do mais apto assim como na natureza (LUKE 2011).
Os operadores genéticos consistem em aproximações computacionais de fenômenos vistos na natureza, como a reprodução sexuada, a mutação genética, entre outros (WOODWARD e SWAN 2011). Algoritmos genéticos podem ser definidos como uma técnica de busca baseada nos processos biológicos e de evolução natural encontrados na natureza. Nos algoritmos genéticos populações de indivíduos são criadas e submetidas aos operadores genéticos conhecidos por seleção, crossover e mutação. Estes operadores avaliam a qualidade de cada indivíduo como critério para encontrar a solução do problema. É gerado um processo de evolução natural destes indivíduos, que eventualmente gerará um indivíduo que caracterizará uma boa solução (talvez até a melhor possível) para o problema (LUKE 2011). Assim como na seleção natural que não para de procurar outros indivíduos ainda melhores, mesmo que estes se destaquem no grupo, os algoritmos genéticos não ficarão estagnados simplesmente por terem encontrado um melhor indivíduo. A reprodução e a mutação são aplicadas em indivíduos selecionados dentro da população (LINDEN 2012). A seleção deve ser feita de modo que os indivíduos mais aptos sejam selecionados mais frequentemente do que aqueles menos aptos, de forma que as boas características daqueles passem a predominar dentro da população da solução. Um agendamento, ou escalonamento (Scheduling), pode ser entendido como uma forma de escalonar um conjunto de operações (processos) as quais envolvem planejamento, pois obedecem a múltiplas restrições. Para resolvê-lo é necessário obter as informações sobre as tarefas a serem executadas no sistema como a quantidade de processos, processadores dentre outros uma forma de representar essas informações de escalonamento entre dois processadores de estrutura paralela é o chamado Gauss 18 que pode ser observado na figura 1, que é um grafo direcionado composto de 18 tarefas. Figura 1. Grafo Gauss 18 Onde os círculos (nós) representam as tarefas, ao lado esquerdo de cada círculo pode se observar o tempo total de execução da tarefa. Os links entre esses nós representam a precedência. Não somente o grafo de Gauss foi utilizado neste artigo mas outros semelhantes para medir seu desempenho.
3. Contribuição do Trabalho O presente trabalho tem como objetivo validar é comparar os resultados obtidos com trabalhos semelhantes e além disso propor possíveis soluções utilizando algoritmos genéticos, para o problema de escalonamento de processos, um problema aplicado a diversas situações da vida real, como o escalonamento de processos da CPU, e na indústria em geral com a finalidade de reduzir custos, minimizar gastos dentre outros. 4. Estado atual do Trabalho Para a construção desse algoritmo a população inicial e gerada de forma aleatória para garantir que todos estes indivíduos sejam válidos, onde um indivíduo não válido se caracteriza pelo fato de estar alocado antes de outra da qual é uma dependente no mesmo processador. Muitas das vezes os indivíduos gerados podem não ser válidos, necessitando assim de uma função de correção para melhores resultados, a qual foi implementada com a finalidade de manter a aleatoriedade e diversidade da população. O método de avaliação de indivíduos em algoritmos genéticos tem como objetivo verificar o seu percentual positivo de cada indivíduo da população. Para o problema de escalonamento, o algoritmo contabiliza as unidades de tempo necessárias para que todas as tarefas sejam realizadas, seguindo a alocação de precedência de cada uma delas. Então, o melhor indivíduo será aquele que levar menos tempo de execução dentre os demais na população. Após essa avaliação da população corrente, passa-se para a etapa de seleção, para este algoritmo foi implementado o método de seleção denominado torneio simples para determinar quais indivíduos passaram seus materiais genéticos para as próximas gerações. Nesta etapa sorteia-se dois indivíduos de forma aleatória é feita então a verificação de quais dos dois possui melhor aptidão, neste caso o menor tempo, formando assim pares de indivíduos pais que darão origem a novas gerações para a população. Uma dupla vencedora de cada torneio dará origem a dois filhos através do crossover, onde se escolhe um ponto no qual é feito a troca de material genético entre esses indivíduos. Após o crossover alguns destes filhos são submetidos a mutação assim como pode ocorrer na natureza, para isso se utilizou da permutação simples que evita que tarefas repetidas façam parte do cromossomo. É sorteado dois pontos e feita a troca dessas tarefas sem interferir nos processadores, a figura 2 ilustra esse processo. Figura 2. Processo de Mutação Na etapa final, os melhores indivíduos de cada iteração são selecionados para formarem uma nova população para nova interação, e novamente para o processo de seleção, crossover e mutação. Cada uma dessas iterações é chamada de geração tendo como critério de parada quando se alcança o número máximo (Nger) especificado na implementação. A figura 3 demostra todo o processamento decorrente do algoritmo genético, desde sua execução até a sua convergência final ilustrando todas as etapas citadas acima. Os AG possuem
natureza probabilística, sendo necessário diversas execuções do mesmo para garantir maior confiabilidade dos resultados. Figura 3. Ciclo de um AG 5. Análise de Resultados Foi implementado em Scala um ambiente baseado no algoritmo genético como descrito anteriormente para encontrar uma melhor configuração para o grafo Gauss 18, estes testes realizados levaram em consideração as seguintes combinações das configurações Tpop = Tamanho da população, Nger = Número de gerações e Tour = Tamanho do método de seleção do torneio, para todas as combinações foi utilizado taxa de mutação de 30% e 60% de crossover, e dois processadores em paralelo. As combinações foram executadas 20 vezes cada uma delas, totalizando assim 540 execuções para se encontrar uma melhor combinação, para este trabalho foi levado em consideração o tempo de execução também para cada combinação. Uma das dificuldades de reproduzir os trabalhos relacionados foi primeiramente no sorteio de indivíduos, onde nos primeiros realizados que descartaram os indivíduos considerados não aptos, foi perceptível o aumento no tempo de execução do algoritmo uma vez que ele deveria sortear um novo individuo toda vez que encontrasse um não válido. Para resolver este impasse, fizemos o sorteio cíclico, que varre a estrutura e a reoganiza de modo que ela se torne compatível. A função de avaliação durante os primeiros testes foi realizada de forma incorreta o que acabou provocando uma convergência prematura ou seja quando um conjunto de bons indivíduos e mantido ao longo das gerações seguintes. Sanada essas dificuldades com as devidas correções no algoritmo, reproduziu-se os testes realizados no artigo obtendo assim para o grafo Gauss 18 a seguinte melhor configuração de número 10 com Tpop = 100, Nger= 200 e Tour = 2 pois estamos levando em consideração o tempo de execução, estes resultados podem ser observados na tabela 1. Após a geração da tabela de resultados fizemos uma comparação com os artigos e foi verificado o mesmo resultado na combinação nos demais campos houve variações mas são aceitavéis pelo fato das particularidades do AG e por sua natureza estatística. Ambas combinações foram executadas 20 vezes, somando um total de 540 execuções de 27 combinações para o grafo Gauss 18. Pela tabela 1 pode-se observar que a combinação 22 poderia ser uma boa opção, mas ela requer o dobro de população e muito mais tempo de execução, o que não nos levou à escolhermos como a melhor combinação para este algoritmo proposto.
Combinação Tpop Nger Tour Convergência Média 1 50 200 2 2 52,35 2 50 200 3 2 58,82 3 50 200 4 2 62,94 4 50 300 2 6 52,35 5 50 300 3 3 58,82 6 50 300 4 2 62,64 7 50 500 2 7 52,35 8 50 500 3 2 60,00 9 50 500 4 3 63,82 10 100 200 2 11 44,11 11 100 200 3 5 57,05 12 100 200 4 4 62,05 13 100 300 2 7 49,11 14 100 300 3 2 58,52 15 100 300 4 3 59,99 16 100 500 2 10 51,47 17 100 500 3 3 57,94 18 100 500 4 4 60,29 29 200 200 2 9 57,94 20 200 200 3 5 54,99 21 200 200 4 3 59,41 22 200 300 2 13 51,94 23 200 300 3 2 55,00 24 200 300 4 2 59,11 25 200 500 2 12 57,64 26 200 500 3 2 54,11 27 200 500 4 16 59,99 Tabela 1. Resultados AG: Gauss 18 As combinações foram executadas em um computador com processador Quad Core 3.33 GHZ e 4 GB de memória RAM. Na figura 4 temos os resultados de convergência agrupados por tamanho da população, número de gerações e torneio para o Gauss 18, somando-se as convergências obtidas para cada grupo. Para avaliar o AG, esse mesmo teste foi refeito, porém com variações nas taxas de crossover e de mutação. Os testes demostraram que com baixas populações ocorrem poucas convergências ou nenhuma, e novamente a combinação 10 a mesma proposta para o Gauss 18 foi escolhida como a melhor. Os melhores resultados obtidos para essas variações realizadas nas taxas de mutações e crossover estão apresentados na tabela 2 separados pelas combinações. Combinação Taxa-mutação Taxa-crossover Convergência-melhor Média 1 10% 20% 6 48,70 2 20% 40% 7 50,29 3 30% 80% 9 55,29 Tabela 2. Resultados AG: Gauss 18
Os resultados demostram que muitas das vezes é necessário executar o algoritmo genético com diversas combinações para se alcançar uma melhor configuração ou a que atende melhor suas necessidades. Outra observação é que o tempo de execução do AG cresce de forma linear geralmente, conforme as alterações em populações e convergências. Dentre os testes realizados, uma boa opção observada seria aumentar em 50 o tamanho da população mantendo as mesmas configurações para convergência e torneio, obtendo assim, uma taxa de convergência de 15 em 47 unidades de tempo. Figura 4. Resultados agrapados para o Gauss 18 6. Testes para o grafo P11A O mesmo algoritmo foi executado para um grafo de 11 tarefas que chamamos de P11A cujas os (V) vertices e arestas (E) dos grafos estão representados na tabela 3, os resultados do mesmo foi comparado com o artigo, onde obtivemos 19 de convergência para o mesmo e média de 39,50 ambos bem próximo com os obtidos nos artigos o qual obteve 20 para convergência e 40,00 de média. Grafo V E G11 (0,8),(1,4),(2,4), (0,1,8),(0,2,12),(1,3,12),(1,4,12) (3,4),(4,4),(5,4), (2,5,8),(2,6,12),(3,7,8),(4,7,8), (6,6),(7,3),(8,3), (4,8,8),(5,8,8),(5,9,8),(6,9,8), (9,3),(10,3) (7,10,12),(8,10,8),(9,10,12) Tabela 3. Grafo de 11 tarefas utilizado A tabela 4 demonstra estes resultados claramente, o algoritmo foi executado 20 vezes para cada combinação, com taxas de mutação de 30% e 60% de crossover assim como aplicado para o grafo Gauss 18 apresentado anteriormente.
Combinação Tpop Nger Tour Convergência Média 1 50 200 2 3 33,35 2 50 200 3 3 38,82 3 50 200 4 4 32,94 4 50 300 2 5 31,35 5 50 300 3 4 31,82 6 50 300 4 3 37,64 7 50 500 2 5 32,35 8 50 500 3 6 33,00 9 50 500 4 8 37,82 10 100 200 2 19 39,50 11 100 200 3 11 47,05 12 100 200 4 13 42,05 13 100 300 2 14 49,11 14 100 300 3 12 48,52 15 100 300 4 13 49,99 16 100 500 2 17 53,47 17 100 500 3 13 57,94 18 100 500 4 14 58,29 29 200 200 2 16 57,94 20 200 200 3 14 57,99 21 200 200 4 11 59,41 22 200 300 2 18 58,94 23 200 300 3 13 59,00 24 200 300 4 13 59,11 25 200 500 2 12 57,64 26 200 500 3 12 57,11 27 200 500 4 16 61,99 Tabela 4. Resultados AG: Grafo P11A 7. Trabalhos Relacionados Existem diversos trabalhos com a mesma temática proposta neste trabalho, pelo fato do problema ser NP completo a busca por algoritmos mais eficientes é grande além das técnicas aqui proposta de algoritmos genéticos esses trabalhos apresentam também, autômatos celulares, algoritmos aproximados, algoritmos gulosos dentre outras técnicas. O desenvolvimento deste trabalho utilizou como base dois trabalhos sobre o mesmo assunto, são eles (HELDER & JAQUELINA & PAULO & GINA) e (JAQUELINE & HELDER & GINA ). O primeiro faz uma comparação entre algoritmos genéticos e outros algoritmos enquanto o segundo usado para comparação de resultados principalmente, tem como objetivo encontrar e propor uma melhor configuração para o AG proposto. Os resultados foram diretamente comparados com o trabalho citado com objetivo de obter os resultados mais próximos possíveis, apesar dos trabalhos serem mais abrangentes fazendo comparações com outras técnicas para a solução de escalonamento de tarefas, o artigo proposto tem as mesmas finalidades e bons resultados.
8. Referências Campello, R. E. and Maculan, N. (1994). Universitária. Algorítmo e Heurísticas, EDUFF - Editora Linden, R. (2012). Algoritmos Genéticos (2a edição), BRASPORT. Luke, S. (2011). Essentials of Metaheuristics. Department of Computer Science, George Mason University, Lulu. Woodward, J. R. and Swan, J. (2011). Automatically designing selection heuristics. Proceedings of the 13th annual conference companion on Genetic and evolutionary computation. Dublin, Ireland, ACM: 583-590. PAPINI, J. A. J.; LINHARES, H. R. G. Escalonamento de Tarefas em Multiprocessadores Baseados em Algoritmos Genéticos. [S.l.].