Escolar Documentos
Profissional Documentos
Cultura Documentos
FORTALEZA – CEARÁ
2017
THIAGO OLIVEIRA PINHEIRO
FORTALEZA – CEARÁ
2017
Dados Internacionais de Catalogação na Publicação
Sistema de Bibliotecas
À minha família, por todo o seu suporte e apoio em todos os momentos difíceis e por terem me
ajudado a construir o meu caráter e chegar aonde estou.
Aos meus companheiros de trabalho, que estiveram ao meu lado durante estes anos que se
passaram.
A esta universidade, seu corpo docente, direção e administração que oportunizaram a janela de
onde hoje vislumbro um horizonte superior.
Aos amigos do GOES (Grupo de Otimização em Engenharia de Software), pelo companheirismo,
apresentações e debates técnicos que foram de fundamental importância para construção do
conhecimento que adquiri durante esta jornada.
Agradeço a todos os professores por proporcionarem a mim o conhecimento não apenas racional,
mas a manifestação do caráter e afetividade da educação no processo de formação profissional,
em especial aos mestres Valdísio Viana, Paulo Henrique Maia, Leonardo Sampaio, Gustavo
Lima de Campos e Mariela Cortés.
Ao meu orientador professor Jerffeson Teixeira por toda instrução técnica, inspiração e principal-
mente pelos demais conhecimentos.
Aos grandes amigos que tenho, por compreenderem minhas muitas ausências neste período e
pelos bons momentos que passamos juntos.
A todos, que direta ou indiretamente, contribuíram para a realização deste trabalho.
“Através dos séculos existiram homens que de-
ram os primeiros passos, por novas estradas, ar-
mados com nada além de sua própria visão.”
(Ayn Rand)
RESUMO
A Engenharia de Software preconiza uma série de boas práticas para que o desenvolvimento e
manutenção de software possa fluir de maneira organizada, a fim de melhorar a produtividade e a
qualidade dos sistemas desenvolvidos. Entretanto devido ao imediatismo de resposta exigido por
algumas organizações, muitas dessas práticas são ignoradas em prol de rápidas validações ou
novas funcionalidades críticas que surgem a todo momento. A consequência deste ato pode ser
muito grave, a ponto de comprometer o crescimento da própria organização. Embora este cenário
não seja desejado, ele se repete com grande frequência em muitas organizações. Sendo assim, se
faz necessário encontrar uma maneira de se trabalhar a distribuição de tarefas de modo eficaz,
procurando responder de maneira rápida e continuar agregando valor à organização. Contudo,
montar o planejamento de execução das tarefas de maneira eficiente é um esforço desafiador,
pois é preciso analisar uma quantidade muito grande de possibilidades. Este cenário se torna
mais desafiador quando a demanda por novas tarefas é constante.
Deste modo, a Engenharia de Software Baseada em Busca surge como uma alternativa para
solucionar o problema, aplicando técnicas de otimização baseada em busca. Este trabalho
apresenta uma proposta para a solução do Problema de Agendamento em Projetos de Software,
utilizando informações referentes à experiência do time envolvido e o nível de habilidades
necessárias para a execução das tarefas, determinando a melhor distribuição de tarefas entre a
equipe, a fim de minimizar o tempo total de execução em um determinado período. A proposta
deste trabalho ainda apresenta um aspecto reativo, onde a busca pela solução deve se adaptar às
mudanças ocorridas na instância estudada. Para tanto, uma formulação dinâmica foi elaborada
para o referido problema e um Algoritmo Genético foi adaptado para geração das soluções.
Considerando instâncias artificiais, a abordagem foi avaliada em vários cenários de execução
diferentes. Demonstrou-se, empiricamente, que fazendo uso da representação de solução adotada
neste trabalho, o reaproveitamento de soluções em uma abordagem dinâmica é notável em
situações onde novas pessoas são adicionadas à instância estudada. Entretanto ao se adicionar
um lote de novas tarefas, o reaproveitamento não apresenta ganhos significativos em relação a
uma abordagem tradicional.
The Software Engineering recommends a number of good practices such that the development
and maintenance of software can flow in an organized way, focusing to improve productivity
and quality of generated software. However, due to the required short term response time of
some organizations, many of these practices are ignored in favor of quick validations or critical
new features that arise continually. The price to be paid in situations like this can be very high,
possibly compromising the organization’s growth. Although this scenario is not desired, it is
repeated frequently in many organizations. Therefore, it is necessary to find a way to distribute
tasks effectively, seeking to respond quickly and keep adding value to the organization. However,
build an efficient plan for tasks execution is challenging. There’s a large amount of possibilities.
to analyse in a scenario where demand for new tasks is continuous. This scenario becomes even
more challenging when the demand for new tasks is continuous.
Thus, the Search Based Software Engineering is an alternative to work on the problem by
applying search-based optimization techniques. This work presents a proposal to the Software
Project Scheduling Problem, using information regarding the experience of the involved team and
nature of the tasks to be performed, determining the best distribution of tasks among the team, in
order to minimize the total execution time within a given period. The proposal of this work also
presents a reactive aspect, where the execution of the solution must adapt the changes occurred in
the studied instance. For this, a dynamic formulation was elaborated for the mentioned problem
and a Genetic Algorithm was adapted to generate the solutions. Considering artificial instances,
the approach was evaluated in several different scenarios. It has been empirically demonstrated
that using the solution representation adopted in this work, the reuse of solutions in a dynamic
approach is remarkable in situations where new employee are added to the studied instance.
However, when a lot of new tasks are added, reuse does not present significant gains compared
to a traditional approach.
1 INTRODUÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.1 MOTIVAÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2 OBJETIVOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.2.1 Objetivo Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.2.2 Objetivos Específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.3 ORGANIZAÇÃO DO TRABALHO . . . . . . . . . . . . . . . . . . . . . 18
2 FUNDAMENTAÇÃO TEÓRICA . . . . . . . . . . . . . . . . . . . . . . 20
2.1 ENGENHARIA DE SOFTWARE . . . . . . . . . . . . . . . . . . . . . . . 20
2.1.1 Evolução de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.2 Manutenção de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.1.3 Cronograma do Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2 OTIMIZAÇÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.1 Otimização Matemática . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.2 Otimização Dinâmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.3 Metaheurísticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2.3.1 Computação Evolutiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.2.3.2 Algoritmos Genéticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.3 ENGENHARIA DE SOFTWARE BASEADA EM BUSCA . . . . . . . . . 32
3 TRABALHOS RELACIONADOS . . . . . . . . . . . . . . . . . . . . . 36
3.1 TRABALHOS SOBRE OTIMIZAÇÃO DINÂMICA . . . . . . . . . . . . . 36
3.2 TRABALHOS SOBRE AGENDAMENTO DE TAREFAS . . . . . . . . . . 37
4 ABORDAGEM PROPOSTA . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.1 ESTIMATIVA DE ESFORÇO . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2 AGENDAMENTO DE TAREFAS . . . . . . . . . . . . . . . . . . . . . . 42
4.3 REPRESENTAÇÃO DA SOLUÇÃO . . . . . . . . . . . . . . . . . . . . . 44
5 ESTUDO EMPÍRICO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.1 QUESTÕES DE PESQUISA . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.2 METODOLOGIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.2.1 Instâncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.2.2 Técnica de Busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2.3 Métricas de Avaliação . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.2.3.1 Métricas utilizadas em EDOs . . . . . . . . . . . . . . . . . . . . . . . . . 52
5.2.3.2 Análise Estatistíca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.3 RESULTADOS E ANÁLISES . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.3.1 Comparativo entre abordagem tradicional e dinâmica . . . . . . . . . . 55
5.3.2 Análise da evolução da performance após mudanças . . . . . . . . . . . 57
5.3.3 Outros Cenários de Execução . . . . . . . . . . . . . . . . . . . . . . . . 60
5.4 AMEAÇAS À VALIDADE . . . . . . . . . . . . . . . . . . . . . . . . . . 64
5.5 CONCLUSÃO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
6 CONSIDERAÇÕES FINAIS . . . . . . . . . . . . . . . . . . . . . . . . 66
6.1 CONTRIBUIÇÕES DO TRABALHO . . . . . . . . . . . . . . . . . . . . 66
6.2 LIMITAÇÕES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
6.3 TRABALHOS FUTUROS . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
REFERÊNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
16
1 INTRODUÇÃO
1.1 MOTIVAÇÃO
o ciclo de vida de um aplicativo. Durante essas atividades, defeitos são corrigidos, aplicativos
são adaptados a um ambiente operacional ou de negócio em mutação, melhorias são implementa-
das por solicitações dos interessados e é fornecido suporte aos usuários quando integram um
aplicativo em seu fluxo de trabalho pessoal ou corporativo (PRESSMAN, 2011). Atividades
de manutenção são comuns no dia a dia de uma equipe de desenvolvimento e operação de
sistemas. Cabe ao gerente responsável encontrar a melhor maneira de resolvê-las, considerando
suas criticidades e os recursos humanos disponíveis, alocando as pessoas mais adequadas para a
realização de cada tarefa e satisfazendo as prioridades estratégicas da organização.
Sendo assim, se faz necessária uma metodologia eficaz para planejamento e repla-
nejamento de tarefas, especialmente neste cenário de demandas contínuas. Este planejamento
deve estar alinhado aos objetivos da organização e deve ser feito de modo inteligente, onde a
execução de tarefas seja o mais eficaz e eficiente possível e a entrega de valor para a organização
seja maximizada.
Técnicas computacionais para planejar projetos de software são um passo crucial no
processo de desenvolvimento de software dentro de um setor altamente competitivo. O Problema
de Agendamento de Projetos de Software (Software Project Scheduling Problem, ou SPSP)
relaciona-se com a decisão de quem faz o que durante a vida útil de um projeto de software,
envolvendo principalmente atividades intensivas de recursos humanos (LUNA et al., 2014).
Xiao, Ao e Tang (2013) afirmam que o problema SPSP é NP-Difícil e possui questões
de otimização combinatória extremamente difíceis, além de ser um processo exaustivo e propenso
a erros para serem feitos por seres humanos.
A Engenharia de Software Baseada em Busca, ou Search Based Software Engineering
(SBSE), propõe o uso de técnicas de busca para resolver problemas complexos em Engenharia
de Software (HARMAN; JONES, 2001). Atividades de SPSP são problemas combinatórios que
apresentam um grande espaço de busca a ser explorado, o que as tornam elegíveis para uma
abordagem via SBSE.
1.2 OBJETIVOS
O objetivo geral deste trabalho é propor uma abordagem para solucionar o problema
de agendamento de execução de tarefas em projetos de software em um ambiente com demanda
contínua de tarefas, levando em consideração a prioridade e precedência entre elas de modo
18
que o tempo de execução do total seja o menor possível. Para atingir este objetivo é necessário
alocar tarefas para as pessoas mais aptas a realizá-las, respeitando as restrições mencionadas.
A abordagem proposta neste trabalho possui uma característica dinâmica, pois deve adaptar a
solução corrente à uma nova instância (caracterizada pelo acréscimo de novas tarefas ou recursos).
Espera-se que a abordagem dinâmica proposta contribua para que as tarefas sejam concluídas o
mais brevemente possível. Além disso deseja-se observar se o tempo de convergência da solução
nesta abordagem pode ser menor que o tempo de convergência encontrado em uma abordagem
tradicional, onde não há aproveitamento (ou adaptação) das soluções anteriores.
Para alcançar o objetivo geral deste trabalho, foram definidos os seguintes objetivos
específicos:
a) Selecionar um modelo matemático que estime o tempo de realização de tarefas
por determinada pessoa;
b) Fazer um comparativo entre a abordagem tradicional e dinâmica com base nos
dados coletados do experimento;
c) Propor uma representação da solução do problema em uma codificação aplicável
para Algoritmos Genéticos e que possam ser utilizadas no processo de adaptação
da solução;
d) Desenvolver uma ferramenta onde será possível visualizar as soluções obtidas e
executar uma série de simulações em diferentes instâncias;
e) Testar o comportamento da abordagem dinâmica fazendo uso de diferentes taxas
de reaproveitamento de soluções.
2 FUNDAMENTAÇÃO TEÓRICA
De acordo com Sommerville (2001), o tempo estimado para a execução das tarefas
deve durar em média uma semana e não mais de dois meses. Caso a execução planejada seja
maior do que isso, a tarefa deve ser quebrada e readequada para fins de planejamento e adaptação
ao cronograma.
Definir uma estimativa precisa para um cronograma é uma tarefa difícil, pois há
muita incerteza envolvida nas fases iniciais do projeto. Segundo Pressman (2011) as estimativas
de custo e esforço nunca serão uma ciência exata. Muitas variáveis - fatores humanos, técnicos,
ambientais e políticos - podem afetar o custo final do software e o esforço necessário para
desenvolvê-lo.
Estimativas iniciais são formadas com base em requisitos em um nível muito alto de
abstração, que muitas vezes não leva em consideração detalhes de implementação e restrições da
tecnologias adotadas. Em alguns casos, a equipe (e suas habilidades) envolvida no projeto ainda
25
2.2 OTIMIZAÇÃO
minimize f0 (x)
(2.1)
sujeito a fi (x) ≤ bi , i = 1, ..., m.
Uma grande variedade de problemas práticos que envolvem tomada de decisão pode
ser convertida na forma de um problema de otimização matemática. De fato, a otimização
matemática se tornou uma importante ferramenta em várias áreas. Ela é amplamente usada nas
áreas da engenharia, automação de projetos eletrônicos, problemas de projeto e operação de
redes, finanças, gestão da cadeia de abastecimento, agendamento e muitas outras áreas.
Em boa parte destes cenários, a otimização matemática é usada para auxiliar a
tomada de decisão humana, projetistas e operadores de sistemas, que supervisionam o processo,
checam os resultados e modificam o problema quando necessário. Os envolvidos na tomada de
decisão são encarregados de executar as ações sugeridas pela solução do problema de otimização.
Um método de encontrar uma solução de problemas de otimização é desenvolver um
algoritmo que calcula a solução do problema (com alguma precisão), de um problema específico
em uma determinada classe de problemas de otimização. Um grande esforço vem sendo aplicado,
desde a década de 40, para desenvolver algoritmos que solucionem problemas de otimização de
várias classes diferentes, analisar suas propriedades e desenvolver softwares eficientes.
A habilidade em solucionar o problema (2.1) pode variar consideravelmente e
depende de fatores como a forma das funções objetivas e restritivas, quantidade de variáveis e
restrições e estruturas especiais como a esparsidade (quando determinadas restrições dependem
de poucas variáveis).
Lemaréchal (2006) também afirma que mesmo quando as funções objetivo e inequa-
ções de restrição são suaves (por exemplo, polinomiais) o problema de otimização (2.1) torna-se
difícil de ser resolvido. Entretanto para uma classe de problemas existem algoritmos efetivos
que podem solucionar até mesmo problemas muito grandes contendo milhares de variáveis e
restrições. Dois importantes exemplos são a Programação Linear e o Método dos Mínimos
Quadrados.
Otimização não linear (ou Programação não linear) é o termo usado para descrever
problemas de otimização que possuem funções objetivas ou restritivas não lineares. Atualmente
não há métodos efetivos conhecidos para solucionar problemas de programação não linear. Até
mesmo problemas simples com poucas variáveis podem se tornar desafiadores ou até mesmo
intratáveis.
Na otimização local não há um compromisso com a procura do valor ótimo de x.
Ao invés disso busca-se um valor com um ótimo local, que minimiza a função objetivo entre os
pontos factíveis próximos ao ótimo local, mas não garante ser o menor valor dentre as regiões
factíveis.
27
2.2.3 Metaheurísticas
adaptativa em determinado ambiente. Esta nota é gerada por uma função adaptativa ou fitness.
Uma parcela dos mais aptos é mantida enquanto os menos aptos são descartados.
Em exemplos de minimização, o AG avalia cada indivíduo com uma nota. A partir
deste parâmetro, ele seleciona os indivíduos com menor valor representativo (em casos de
maximização, seriam selecionados os indivíduos com maior valor representativo). Os indivíduos
selecionados são então submetidos a operadores de cruzamento, ou crossover, e mutação, gerando
assim uma nova população que será submetida novamente ao mesmo processo da população
anterior. Este processo iterativo de uma população gerar uma ou mais populações é chamado de
evolução e cada população dentro de um contexto evolutivo é chamada de geração. Este processo
continua se repetindo até que uma solução satisfatória seja encontrada.
Rezende (2003) afirma que os Algoritmos Genéticos são uma espécie de busca
aleatória direcionada, pois exploram informações históricas para encontrar novos pontos de
busca onde são esperados melhores desempenhos.
O AG trabalha com populações de indivíduos ou cromossomos. O cromossomo
é uma estrutura de dados, geralmente um vetor, que representa uma possível solução para o
problema de otimização. Cada unidade básica do cromossomo, ou elemento do vetor, é chamada
de gene.
De maneira geral, um AG pode ser brevemente descrito através do fluxograma
apresentado na Figura 4. O fluxograma mostra as fases de um Algoritmo Genético:
Figura 4 – Fluxograma de um AG
f) No caso do Critério de parada, diferentes critérios podem ser usados para fina-
lizar a execução de um AG, tais como: (a) uma quantidade predeterminada de
gerações; (b) ou quando uma aptidão média ou do melhor indivíduo não melhorar
33
3 TRABALHOS RELACIONADOS
ajudar o algoritmo quando situações passadas forem observadas no futuro. Nesse trabalho é
proposto um AG inspirado por ideias de sistemas imunológicos a fim de lidar com ambientes
dinâmicos.
Já Bui et al. (2012) propõe uma abordagem computacional para a adaptação dentro
do contexto de planejamento. Esta abordagem modela um problema de planejamento dinâmico
como um problema de otimização multiobjetivo e um mecanismo evolucionário é incorporado,
adaptando a solução atual para novas situações quando ocorrer mudanças. O conjunto de soluções
não-dominadas pode ser percebido como um rico conjunto de dados que pode ser usado para
apoiar o processo de adaptação sobre o efeito das mudanças. Nesse trabalho é proposto um
método baseado no conceito de centróides sobre um número de mudanças em um espaço de
tempo, a cada intervalo é obtido um conjunto de soluções. O planejamento de missões de campo
de batalha foi usado para experimentações e análises.
propostas mais recentes (DEPT, MOCell, MOABC, MO-FA, e GDE3). Das experimentações
conduzidas, os resultados sugerem que PAES é o que apresenta as melhores características de
escalabilidade.
Já em Xiao, Ao e Tang (2013) é proposto um algoritmo efetivo para solucionar
problemas de SPSP. É proposto um algoritmo chamado ACS-SPSP, que é baseado em Otimização
de Colônia de Formigas (Ant Colony Optimization ou ACO). Seis heurísticas foram projetadas
para considerar fatores de esforço de tarefas, alocação de pessoas e importância de tarefas.
O algoritmo proposto é comparado a um Algoritmo Genético para solucionar 30 instâncias
aleatórias de SPSP. O resultados experimentais mostram que o algoritmo proposto é promissor e
pode obter melhores soluções que as prévias soluções encontradas com o AG.
Por fim em Hladik et al. (2008) é apresentado uma abordagem original baseada
em programação com restrições (Constraint Programming ou CP) para solucionar a alocação
estática de tarefas de tempo real. O problema consiste em atribuir tarefas periódicas para
processadores distribuídos no contexto de escalonamento preemptivo com prioridade fixa. Duas
novas abordagens são propostas e validadas com resultados experimentais. A abordagem é
completa (se um problema não tiver solução, o algoritmo pode provar), também é não paramétrica
(não necessita de ajuste de parâmetros) permitindo assim que uma grande diversidade de modelos
seja facilmente considerada.
39
4 ABORDAGEM PROPOSTA
Este capítulo detalha a abordagem proposta dividindo-a em duas etapas. São elas:
a) Estimativa de esforço (ou tempo necessário) para a conclusão de uma tarefa por
uma determinada pessoa;
b) Agendamento das tarefas a serem realizadas respeitando as restrições de priori-
dade e precedência de tarefas.
O principal foco deste trabalho é a análise do método de otimização para o problema
de agendamento de tarefas em projetos de software em um ambiente dinâmico. Neste ambiente
o número de tarefas e pessoas varia continuamente, assim como a experiência exigida para a
conclusão de cada tarefa e a experiência de cada pessoa envolvida. Sendo assim, a técnica usada
neste trabalho para a estimativa de esforço é apenas uma ideia inicial.
Para o aprimoramento da estimativa de esforço para a conclusão de tarefas é ne-
cessário investigar a base de dados histórica de uma determinada organização e a partir destas
informações, criar um modelo mais acurado de estimativa de tempo. Tal estimativa pode ser
melhor trabalhada explorando técnicas de Mineração de Dados e Aprendizagem de Máquina.
uso da similaridade de Pearson para encontrar o grau de aptidão entre tarefas e pessoas, que é
definida pela equação:
employee
cov(Stask
i ,Sj )
ρ(Stask ,Semployee ) = , (4.1)
i j σStask σSemployee
i j
forma:
employee
cov(Stask
i ,Sj ) = E[(Stask
i − µStask )(Semployee
j − µSemployee )], (4.2)
i j
Ao fazer uso da equação ρ(Stask ,Semployee ) uma matriz AMxN é gerada. Esta matriz
i j
contém valores de similaridade entre [−1, 1], que representam a aptidão de uma pessoa j na
execução de uma tarefa i. Se os valores se aproximam de 1, a pessoa é adequada para a resolução
da tarefa, a medida que esse valor se aproxima de −1, menos a pessoa é adequada para solucionar
a tarefa. A matriz resultante AMxN é apresentada da seguinte forma:
a1,1 a1,2 · · · a1,n
a2,1 a2,2 · · · a2,n
AMxN =
.. .. .. ..
(4.3)
.
. . .
am,1 am,2 · · · am,n
A matriz AMxN é um bom indicador de aptidão entre tarefas e pessoas, entretanto ela
não indica uma estimativa de tempo de conclusão de tarefa. Para efeitos de simplificação da
experimentação a ser realizada, esses valores serão escalonados para definir um prazo limite para
a execução das tarefas. A ideia é escalar os valores de modo que quando a similaridade for 1, a
tarefa será executada em até 2 horas. Já se o valor -1 ela será executada em 80 horas (equivalente
a 10 dias úteis com 8 horas de trabalho).
Portanto, para transformar a matriz AMxN em uma matriz BMxN que contém as
estimativas em horas de tempo de execução de cada tarefa, cada elemento ai j da matriz AMxN ,
deve passar pela equação linear bi j = d39 × (−ai j + 1) + 2e. A tabela 2 contém uma amostra
de similaridades (ai j ) convertidas em estimativas de tempo (bi j ) após o uso da equação. Sendo
42
assim a matriz BMxN conterá valores com as estimativas de tempo de execução de tarefas entre
[2, 80] e será representada por:
b b1,2 · · · b1,n
1,1
· · · b2,n
b2,1 b2,2
BMxN =
.. .. .. ..
(4.4)
.
. . .
bm,1 bm,2 · · · bm,n
-1 80
-0.75 71
-0.5 61
-0.25 51
0 41
0.25 32
0.5 22
0.75 12
1 2
A modelagem proposta neste trabalho tem como objetivo uma entrega de valor mais
eficiente, de modo a alocar as tarefas para as pessoas mais aptas a solucioná-las para que a
conclusão de todas as tarefas seja o mais rápido possível. Para atender o caráter dinâmico, a
modelagem sempre considera o momento m, que representa o estado (pessoas e tarefas) onde
a instância do problema se encontra. Um exemplo aplicado do conceito de m seria se em um
determinado momento hipotético m1 a instância do problema conta com 20 tarefas a serem
executadas, já em um momento m2 ela conta com 25 tarefas.
A restrição de precedência define que em caso de uma tarefa b depender de uma
tarefa a, a mesma só poderá ser executada após o término de a. Entretanto, para atender o caráter
dinâmico proposto neste trabalho, faz se necessário destacar que esta restrição é referente a um
determinado momento m e que em outra ocasião pode assumir valores diferentes, portanto:
A restrição de prioridade, onde uma tarefa de alta prioridade deve ser executada
antes de uma tarefa de prioridade mais baixa, pode ser conflitante com a restrição de precedência.
Um exemplo desta situação seria se uma tarefa ta precedesse tb e o mesmo tb tiver uma prioridade
mais alta que ta em um momento m. Neste caso hipotético, ainda que a prioridade de tb seja
mais alta, no momento m do planejamento, ela deve ser executada após o término de ta . Portanto,
a restrição de prioridade é uma restrição suave e deve ser formulada de maneira a penalizar o
tempo máximo de execução caso não seja priorizada. Logo a função de penalidade pode ser
definida por:
1 + priority(tb ,m)−priority(ta ,m)
se priority(ta , m) < priority(tb , m)
maxprioritym
penalty(ta ,tb , m) =
1 se priority(ta , m) ≥ priority(tb , m).
(4.6)
A função penalty(ta ,tb , m) retorna um percentual a ser adicionado ao tempo de
execução de uma tarefa tb levando em consideração uma tarefa ta , que em um momento m,
foi alocada anteriormente. Se a prioridade da tarefa anterior, definida por priority(ta , m), for
maior ou igual a tarefa atual, definida por priority(tb , m), nenhuma penalidade de tempo será
acrescentada, caso contrário uma punição percentual é calculada a partir da diferença entre as
prioridades sobre maxprioritym , o maior valor possível entre as prioridades, será acrescido ao
tempo de planejamento.
O cálculo do tempo de execução de todas as tarefas delegadas para uma pessoa j em um
momento m pode ser obtido pela seguinte fórmula:
N
workingTime(ei , m) = bi1 yi1 + ∑ bi j yi j × penalty(xi j−1 , xi j , m), (4.7)
j=2
onde bi j é um elemento da matriz BMxN , que representa o tempo estimado para a execução de
uma pessoa i por uma tarefa j e yi j é um valor onde y ∈ {0, 1} e indica se a pessoa ei irá de
fato executar a tarefa j no tempo estimado bi j no momento m. Já xi j possui um valor entre
x ∈ {1, 2, ..., N} e representa um vetor com a ordem das tarefas a serem executadas por ei no
mesmo momento m.
M
Cada tarefa deve ser alocada para apenas uma pessoa, sendo assim a restrição ∑ yi j =
i=1
1 para todo j ∈ {1, 2, ..., N} é definida. O vetor contendo a ordem de tarefas a serem executadas
por ei não pode possuir valores repetidos (exceto o valor zero que indica que determinada
44
tarefa não será executada por ei ), logo a restrição é definida por alldiff_except0(xi∗ , m) para todo
i ∈ {1, 2, ..., M}.
O agendamento de tarefas possui um caráter combinatório e tem como objetivo
minimizar o maior período de execução de todas as tarefas alocadas por pessoa, ou seja minimizar
o máximo valor de workingTime(ei , m) possível entre as M pessoas envolvidas. Sendo assim o
problema pode ser representado pela seguinte formulação:
Em resumo, a abordagem proposta tem como objetivo alocar tarefas para os in-
divíduos mais aptos a solucioná-las, de modo a minimizar o maior período de execução das
tarefas entre todos os envolvidos, respeitando as restrições de precedência e punindo soluções
com prioridades mal distribuídas. Dessa forma, espera-se que a abordagem possa encontrar
continuamente, dado um ambiente com constante acréscimo de tarefas e alta rotatividade de
pessoas, uma boa distribuição de tarefas entre os envolvidos de modo a minimizar o tempo total
de execução de tarefas e entregar valor a organização o mais rápido possível.
plexidade combinatória do problema. Sendo assim uma atividade alocada para outra pessoa
pode mudar drasticamente o tempo total de execução. Um exemplo seria realocar a tarefa F, que
inicialmente pertencia a Vanessa e no novo planejamento será alocada para Thayse, como mostra
a figura 11. Neste novo planejamento a execução das tarefas leva 12 dias, sendo assim 2 dias de
trabalho foram economizados com o novo planejamento.
onde cada letra representa sua respectiva tarefa e cada número seria um ponto de
corte. Os pontos de corte representam a divisão de tarefas entre cada pessoa, na representação
4.9 ela aponta que as tarefas {A, B,C} serão executadas pela primeira pessoa (Thiago), as tarefas
{D, E, F} serão executadas pela segunda pessoa (Vanessa) e assim por diante.
46
No segundo momento, como mostra a figura 11, a representação pode ser dada por:
5 ESTUDO EMPÍRICO
Este capítulo descreve o estudo realizado para validar a abordagem dinâmica proposta
para alocar tarefas em projetos de software, as instâncias utilizadas, métricas coletadas e testes
realizados com o objetivo de avaliar os resultados alcançados durante este processo. Este
estudo foi realizado utilizando dados fictícios que foram gerados para simular um ambiente
real. O capítulo apresenta as questões de pesquisa que orientam este trabalho. A seguir, é
apresentada a metodologia adotada na aplicação dos experimentos, descrevendo detalhes das
instâncias utilizadas, da configuração do AG utilizado e as métricas usadas para comparação
de desempenho dos algoritmos testados. Após isso, há a apresentação dos resultados obtidos,
seguidos por suas respectivas análises. Por fim, são estabelecidas as ameaças à validade e as
considerações finais. Para permitir a replicação deste experimento, todas as instâncias, resultados
e código-fonte estão disponíveis para acesso público1 .
Para testar a natureza dinâmica do experimento, uma instância aleatória do problema
será gerada, inicialmente a base será formada por 3 pessoas e 25 tarefas a serem alocadas.
Para cada tarefa haverá informações de precedência, prioridade e o conjunto de habilidades
necessárias para a execução da tarefa. Para cada pessoa, haverá o conjunto de habilidades com o
grau de experiência devidamente informado.
comportamento dinâmico, uma série de modificações foram planejadas de modo que ocorressem
durante o processo de otimização de forma controlada. Para a execução dos testes foi aplicado
um Algoritmo Genético como mecanismo de busca em conjunto com um Observer (GAMMA et
al., 1995) que monitora as modificações na instância. Estes e outros aspectos do experimento
serão detalhados nas próximas seções.
5.2 METODOLOGIA
5.2.1 Instâncias
tarefas, pode-se encontrar informações sobre o seu identificador, o título da tarefa, sua criticidade,
o identificador de outra tarefa que a mesma venha a preceder, e o conjunto de habilidades que a
tarefa demanda para ser concluída.
As informações de prioridade de uma tarefa são classificadas como Minor (Baixa),
Major (Alta) e Critical (Crítica). Já as informações sobre precedência entre tarefas indicam que
elas possuem uma dependência de execução acíclica, ou seja, se uma tarefa A precede uma tarefa
B e a tarefa B precede uma tarefa C, é impossível que a tarefa C preceda a tarefa A. A figura 12
mostra um grafo com a relação de precedência entre as tarefas na instância i_25_50, onde 50%
de 25 tarefas são 13 (12,5 arredondados) precedências, que são representadas pelas arestas do
grafo.
Para cada instância, estas perturbações são agendadas para ocorrer 2 vezes em
intervalos de 30 segundos. Portanto, para cada uma das 9 instâncias são executadas simulações
em 2 cenários diferentes, totalizando 18 cenários de execução.
que pode ser encarada como uma remoção ou acréscimo de um item em uma estrutura de lista.
Embora a modificação se dê de maneira simples, dependendo do tipo de item a
ser acrescido ou removido, a alteração pode causar um impacto grande no espaço de busca.
Por exemplo, se em um determinado momento uma solução P assumir a forma P1 e houver o
acréscimo de duas novas pessoas, ela tomará a forma P2 .
P1 = {A, B,C, 1, D, E, F, 2, G, H, I, 3, J, L, 4, M, N}
(5.1)
P2 = {A, B,C, 1, D, E, F, 2, G, H, I, 3, J, L, 4, M, N, 5, 6}
Como discutido na seção 4.3, a nova representação preserva a alocação das tarefas
para as 5 pessoas iniciais e adiciona 2 novas pessoas sem nenhuma tarefa alocada inicialmente,
mas que eventualmente receberão tarefas mais apropriadas que estavam alocadas para as 5
pessoas do estado anterior. Esta alteração não traria nenhuma mudança efetiva ao valor de fitness
da solução, já que as mesmas tarefas ainda estariam alocadas para as mesmas pessoas. Contudo,
se a mesma solução na forma P1 tiver o acréscimo de 5 novas tarefas e ao assumir uma nova
forma P3 , as novas tarefas serão alocadas para uma única pessoa. Se esta pessoa não tiver uma
boa afinidade com as novas tarefas, elas irão tomar muito tempo para serem concluídas e poderão
afetar de maneira drástica o valor de fitness da solução.
P1 = {A, B,C, 1, D, E, F, 2, G, H, I, 3, J, L, 4, M, N}
(5.2)
P3 = {A, B,C, 1, D, E, F, 2, G, H, I, 3, J, L, 4, M, N, O, P, Q, R, S}
Devido ao grande tempo necessário para a realização de uma grande quantidade de simulações,
este trabalho não realizou experimentos que com remoção de tarefas ou pessoas.
mudança na instância. Na sua definição original, o cálculo do ARR demanda que o valor
da solução ótima do problema seja conhecido. Entretanto, este valor é desconhecido e uma
adaptação foi necessária, gerando a definição de uma métrica adaptada chamada ARRt , onde o
valor ótimo é substituído pelo melhor valor conhecido (ótimo ou sub-ótimo) que é dada pela
fórmula:
p(i)
∑ [ fbest (i, j) − fbest (i, 1)]
1 m j=1 (5.3)
ARRt = ∑ ,
m i=1 p (i) [ f ∗ (i) − fbest (i, 1)]
onde fbest (i, j) é o valor de fitness da melhor solução desde a última modificação
encontrada pelo algoritmo até a j-ésima geração do período de mudança i, m é o número de
modificações e p (i), i = 1:m é o número de gerações a cada período de modificação i e f ∗ (i) é o
melhor valor conhecido durante a i-ésima modificação. O valor do ARRt será 1 no melhor caso
quando o algoritmo for capaz de se recuperar e convergir imediatamente após a mudança, do
contrário terá uma valor igual a 0 se o algoritmo não for capaz de convergir rapidamente.
Quanto a métrica sobre a variação de performance, Nguyen e Yao (2012) também
cita estudos que desenvolveram medidas para avaliar a habilidade de algoritmos em restringir a
queda (ou subida, em caso de minimização) do fitness quando mudanças ocorrem. A medida
de estabilidade sobre a variação da performance é calculada pela diferença do fitness entre as
medidas de acurácia do algoritmo considerado entre os dois momentos avaliados. As equações
de acurácia (equação 5.4) e estabilidade (equação 5.5) são descritas abaixo:
(t) (t)
F bestF,EA − MinF
(t) (5.4)
accuracyF,EA = (t) (t)
MaxF − MinF
(t) (t)
onde F bestF,EA é o fitness da melhor solução no tempo t, MaxF é o maior valor
(t)
de fitness no espaço de busca explorado no tempo t e MinF é o menor valor de fitness no espaço
(t)
de busca explorado. Já o valor de stabF,EA é definido pela diferença da acurácia no tempo t e o
momento imediatamente antes. Nos experimentos realizados neste trabalho o tempo t utilizado é
logo após a ocorrência de uma mudança, entretanto se houver mais de uma modificação, a média
dos valores de estabilidade é calculada.
54
Para fins estatísticos, cada um dos 18 cenários de execução são simulados 30 vezes
cada. Este número de execuções é sugerido em Arcuri e Briand (2011) e se deve à natureza
estocástica da estratégia de busca. Ao término das simulações, métricas pertencentes à Estatística
Descritiva como média e desvio padrão são calculados para cada um dos 18 cenários.
No entanto, devido à grande variância da amostra, fazer uso de apenas métricas de
Estatística Descritiva pode levar a conclusões equivocadas (ARCURI; BRIAND, 2011). Deste
modo, os autores recomendam a utilização de testes estatísticos para a avaliação de resultados
produzidos por metaheurística.
Um teste estatístico é utilizado quando se pretende verificar se duas ou mais amostras
são estatisticamente diferentes, ou seja, se há diferença significativa entre os resultados gerados
ao fazer uso de configurações distintas. Para estes casos, assume-se uma hipótese nula H0 onde
as amostras comparadas não apresentam diferenças significativas entre si. Duas situações podem
ocorrer: a primeira, chamada Erro 1 ao se rejeitar a hipótese nula quando na verdade ela é
verdadeira. A segunda situação, chamada de Erro 2, ocorre quando aceita-se uma hipótese falsa.
Os testes geram um p-value, que é a probabilidade de ocorrência do Erro 1 na comparação entre
as amostras. Outro elemento encontrado nesse tipo de teste é o nível de significância α, que
representa o maior valor de p-value admitido para rejeitar a hipótese nula (ARCURI; BRIAND,
2011).
Dois tipos de testes podem ser aplicados de acordo com a distribuição probabilística
apresentada pelos dados das amostras. No caso das amostras seguirem uma distribuição normal,
testes paramétricos como o Student T devem ser utilizados, caso as amostras não sigam uma
distribuição normal, recomenda-se o uso de testes não-paramétricos como por exemplo, teste U
de Mann-Whitney (ARCURI; BRIAND, 2011). Dentre os testes não-paramétricos, encontra-se o
Wilcoxon signed-rank que tem por finalidade comparar duas amostras pareadas.
Embora sejam utilizados com muita frequência para demonstrar a diferença esta-
tística entre amostras, os testes de significância por hipóteses nulas não oferecem informações
sobre a magnitude do evento observado, tampouco conferem precisão de estimativa estatística
do efeito da magnitude (NAKAGAWA; CUTHILL, 2007). Para calcular a magnitude entre a
diferença entre amostras testes de magnitude de efeito (effect size) costumam a ser utilizados.
Em termos comparativos um teste de effect size serve para determinar o quão mais eficiente é
uma abordagem em relação a outra através da análise de seus resultados.
55
Esta seção conduz uma análise sobre a instância i_25_10 em seus dois cenários
de execução (acréscimo de pessoas e de tarefas). O percentual de propagação genética, µ é a
variável a ser comparada neste experimento. Em uma abordagem tradicional não há nenhum
reaproveito de conhecimento do espaço de busca no momento que a instância é modificada, logo
não há propagação genética entre diferentes estados da instância. Esta situação é reproduzida
quando µ = 0.
A tabela 3 mostra a média e desvio padrão, realizadas sobre as 30 execuções, do
resultado final obtido após as duas modificações planejadas na instância. Além disso, apresenta
os resultados do teste Â12 (Vargha-Delaney) e apresenta a indicação da diferença estatística
(Wilcoxon signed-rank) entre os valores de fitness de cada configuração de µ com os valores
obtidos sem considerar as preferências, ou seja, quando µ = 0.
2 <http://goes.uece.br/thiagooliveira/rts/>
56
employee task
instance change µ fitness (avg) fitness (std) µ0 sig fitness (avg) fitness (std) µ0 sig
Então, respondendo a QP1: "A abordagem dinâmica teria uma diferença significativa
no resultado final em relação a uma abordagem tradicional?", pode-se afirmar que em relação
ao resultado final sobre a instância i_25_10, que o uso de uma abordagem dinâmica não traz
necessariamente um resultado melhor que uma abordagem tradicional. Os resultados mostram
que ao contrário da intuição inicial, os resultados finais, no geral, acabam tendo uma performance
levemente pior em uma abordagem dinâmica. Entretanto, na maior parte dos resultados finais
essa diferença se mostra estatisticamente insignificante.
com o uso da métrica de taxa de recuperação absoluta (ARRt ). Os valores dessa métrica variam
entre 0 e 1, quanto mais próximo de 1, maior a velocidade de recuperação. Além da taxa
da convergência, outra métrica relevante é a estabilidade da diferença de performance após
a mudança (stabtF,EA ). Assim como a taxa de recuperação absoluta, os valores dessa métrica
variam entre 0 e 1, mas podem ser negativos, caso exista uma melhoria de performance entre os
estados da instância.
µ employee task
ARRt stabtF,EA ARRt stabtF,EA
A tabela 4 contém os resultados das duas métricas citadas por cenário de execução.
Pode-se observar que os maiores valores absolutos de stabtF,EA estão relacionados às situações
onde há um grande impacto no valor de fitness após a mudança. Contudo, os maiores valores
de ARRt se encontram nas execuções que apresentam picos elevados no momento da mudança.
Esses valores se devem ao fato que a convergência foi mais rápida nesses casos.
A figura 15 representa a relação entre os valores absolutos das métricas ARRt e
stabtF,EA . É possível observar que há um agrupamento claro entre as execuções dinâmicas com
perfil de execução diferente (mudança de pessoas e mudança de tarefas).
Então, respondendo a QP2: "Qual o impacto observado no valor de fitness da solução
corrente no momento da modificação da instância?", pode-se afirmar que o impacto sofrido na
solução da instância i_25_10 depende do tipo de modificação realizada. Em virtude da repre-
sentação da solução adotada pelo algoritmo, o acréscimo de novas tarefas acaba apresentando
um impacto muito forte na solução corrente. Além do alto impacto, a abordagem dinâmica
apresenta uma velocidade de convergência semelhante a de uma abordagem tradicional. Já o
acréscimo de uma nova pessoa à instância fez com que a abordagem dinâmica apresentasse um
impacto pequeno no valor de fitness e com uma baixa velocidade de convergência. Este pequeno
impacto evidencia um grande aproveitamento da solução anterior, entretanto como discutido na
60
QP1, ele não traz necessariamente um valor final melhor que o valor final de uma abordagem
tradicional, entretanto vale destacar que em casos onde o tempo de execução é um fator limitante,
a abordagem dinâmica possui uma boa vantagem.
Quanto à QP3: "Dentre as abordagens dinâmicas, os valores da taxa de propagação
genética apresentam relação com as métricas de reaproveitamento de soluções?", nos casos
observados onde se faz uso da abordagem dinâmica, os valores adotados por µ apresentaram
um comportamento muito semelhante entre si. No caso do acréscimo de uma nova tarefa, o
comportamento é semelhante até mesmo se comparado a uma abordagem tradicional. Somente
no caso de acréscimo de pessoas que uma diferença maior pode ser observada. Além disso, as
métricas de recuperação absoluta e estabilidade da diferença de performance após a mudança
não apresentam uma relação linear com a taxa de propagação genética. Portanto existe uma
diferença entre abordagens (dinâmica vs tradicional), no entanto entre as abordagens dinâmicas,
a taxa de propagação genética não exerce influência sobre o quão adaptado segue sua execução.
Após as análises realizadas sobre a instância i_25_10, o próximo passo deste trabalho
é explorar novas possibilidades em instâncias semelhantes. Sendo assim, um novo lote de 30
simulações é realizado sobre novas instâncias de mesmo tamanho, mas em situações mais restri-
61
tivas apresentando um maior número de precedência entre as tarefas. Para efeitos comparativos a
figura 16 apresenta a evolução média das 30 execuções sobre a instância composta de 3 pessoas
e 25 tarefas, em situações onde 10%, 25% e 50% das tarefas apresentam precedência entre si, a
taxa propagação genética µ variando entre 30%, 60% e 90% e nas já citadas situações onde uma
pessoa é acrescida ou 5 novas tarefas são adicionadas.
um número maior de perturbações. Isso se deve pelo fato de o espaço de busca a ser explorado
ser maior em instâncias maiores e um número maior de restrições reflete em punições maiores
para o valor de fitness. É possível que a convergência obtida nesses casos seja prematura, ou
seja, o tempo utilizado no experimento (30 segundos) se mostra insuficiente para atingir uma
convergência real nesta escala.
Apesar do comportamento semelhante apresentados em alguns gráficos, vale ressaltar
que a escala de valores apresentados no eixo y aumentam a medida que o tamanho da instância e
sua complexidade (precedências) crescem.
Portanto, respondendo à QP4: "O mesmo comportamento observado na abordagem
dinâmica pode ser verificado em instâncias com um maior número de variáveis e restrições?",
pode-se dizer que os diferentes valores adotados por µ no experimento mostraram um resultado
muito semelhante nas simulações com diferentes cenários de execução. Mesmo nos casos onde
o impacto não se apresentou favorável, as execuções com diferentes valores de µ apresentaram
um comportamento semelhante.
64
5.5 CONCLUSÃO
Neste capítulo foi explicado como o estudo empírico realizado neste trabalho foi
conduzido. Inicialmente, foram determinadas quatro questões de pesquisa que guiaram este
estudo. A seguir elucidou-se como as instâncias utilizadas neste trabalho foram geradas, os
65
6 CONSIDERAÇÕES FINAIS
6.2 LIMITAÇÕES
Como fator limitante destaca-se o método utilizado para estimar o tempo de execução
de uma tarefa, o método utilizado pode ser melhorado com o uso de técnicas de Mineração de
Dados e Aprendizado de Máquina.
Além disso, durante o processo de otimização o período estimado pode sofrer uma
alteração que se adéque a situações não planejadas, como impossibilidade da execução de uma
tarefa por motivos externos.
REFERÊNCIAS
AKKER, M. van den; BRINKKEMPER, S.; DIEPEN, G.; VERSENDAAL, J. Flexible re-
lease planning using integer linear programming. In: Proceeding of the 11th Internatio-
nal Workshop on Requirements Engineering: Foundation for Software Quality (REFSQ
’05). Porto, Portugal: Essener Informatik Beitrage, 2005. p. 247–262. Disponível em: <http:
//www.sse.uni-essen.de/refsq/downloads/17.pdf>. Acesso em: 01 mai. 2017.
ARCURI, A.; BRIAND, L. A practical guide for using statistical tests to assess randomized
algorithms in software engineering. In: Proceedings of the 33rd International Conference
on Software Engineering. New York, NY, USA: ACM, 2011. (ICSE ’11). Disponível em:
<http://doi.acm.org/10.1145/1985793.1985795>. Acesso em: 09 jun. 2016.
BACK, T.; FOGEL, D. B.; MICHALEWICZ, Z. (Ed.). Basic Algorithms and Operators. 1st.
ed. Bristol, UK, UK: IOP Publishing Ltd., 1999. ISBN 0750306645.
BAGNALL, A.; RAYWARD-SMITH, V.; WHITTLEY, I. The next release problem. Informa-
tion and Software Technology, v. 43, n. 14, p. 883 – 890, 2001. ISSN 0950-5849. Disponível
em: <http://www.sciencedirect.com/science/article/pii/S095058490100194X>. Acesso em: 23
set. 2016.
BOUKTIF, S.; SAHRAOUI, H.; ANTONIOL, G. Simulated annealing for improving software
quality prediction. In: Proceedings of the 8th Annual Conference on Genetic and Evolutio-
nary Computation (GECCO ’06). Seattle, Washington, USA: ACM, 2006. p. 1893–1900.
DORIGO, M.; BLUM, C. Ant colony optimization theory: A survey. Theor. Comput. Sci.,
Elsevier Science Publishers Ltd., Essex, UK, v. 344, n. 2-3, p. 243–278, nov. 2005. ISSN
0304-3975. Disponível em: <http://dx.doi.org/10.1016/j.tcs.2005.05.020>. Acesso em: 21 set.
2016.
DUBACH, C.; CAVAZOS, J.; FRANKE, B.; O’BOYLE, M.; FURSIN, G.; TEMAM, O. Fast
compiler optimisation evaluation using code-feature based performance prediction. In: Pro-
ceedings of the 4th International Conference on Computing frontiers. Ischia, Italy: ACM,
2007. p. 131–142.
FÁVERO, L.; BELFIORE, P. Pesquisa operacional para cursos de engenharia. [S.l.]: Elsevier
Brasil, 2012. ISBN 9788535263350.
GAMMA, E.; HELM, R.; JOHNSON, R.; VLISSIDES, J. Design Patterns: Elements of
Reusable Object-oriented Software. Boston, MA, USA: Addison-Wesley Longman Publishing
Co., Inc., 1995. 326–337 p. ISBN 0-201-63361-2.
69
GLOVER, F.; LAGUNA, M. Tabu Search. Norwell, MA, USA: Kluwer Academic Publishers,
1997. ISBN 079239965X.
HARMAN, M. The current state and future of search based software engineering. In: 2007 Fu-
ture of Software Engineering. Washington, DC, USA: IEEE Computer Society, 2007. (FOSE
’07), p. 342–357. ISBN 0-7695-2829-5. Disponível em: <http://dx.doi.org/10.1109/FOSE.2007.
29>. Acesso em: 19 set. 2016.
HARMAN, M.; CLARK, J. A. Metrics are fitness functions too. In: Proceedings of the
10th IEEE International Symposium on Software Metrics (METRICS ’04). Chicago, USA:
IEEE, 2004. p. 58–69.
JIN, N.; YAO, X. Heuristic optimization for software project management with impacts of
team efficiency. In: Proceedings of the IEEE Congress on Evolutionary Computation, CEC
2014, Beijing, China, July 6-11, 2014. [s.n.], 2014. Disponível em: <http://dx.doi.org/10.1109/
CEC.2014.6900527>. Acesso em: 05 abr. 2017.
KOREL, B. Automated software test data generation. IEEE Transactions on Software Engi-
neering, v. 16, n. 8, p. 870–879, August 1990.
MILLER, W.; SPOONER, D. L. Automatic generation of floating-point test data. IEEE Trans.
Software Eng., v. 2, n. 3, p. 223–226, 1976. Disponível em: <http://dblp.uni-trier.de/db/journals/
tse/tse2.html#MillerS76>. Acesso em: 23 set. 2016.
NAKAGAWA, S.; CUTHILL, I. C. Effect size, confidence interval and statistical significance: a
practical guide for biologists. Biological Reviews, v. 82, n. 4, 2007.
70
XIAO, J.; AO, X.-T.; TANG, Y. Solving software project scheduling problems with ant colony
optimization. Computers & OR, v. 40, n. 1, 2013. Disponível em: <http://dblp.uni-trier.de/db/
journals/cor/cor40.html#XiaoAT13>. Acesso em: 19 set. 2016.
ZHANG, Y.; HARMAN, M.; MANSOURI, A. The SBSE Repository: A repository and
analysis of authors and research articles on Search Based Software Engineering. CREST
Centre, UCL, 2016. Disponível em: <http://crestweb.cs.ucl.ac.uk/resources/sbse_repository/>.
Acesso em: 28 set. 2016.