Escolar Documentos
Profissional Documentos
Cultura Documentos
Alocação
Dedico este trabalho à minha família e amigos, que me apoiaram durante toda a graduação.
Agradeço a meus colegas de universidade e professores, que me auxiliaram na jornada de apren-
dizado.
Resumo
E
S te trabalho contém um estudo sobre o Problema de Alocação,
bem como alguns métodos para sua resolução, em várias instân-
cias do problema. Uma destas é a instância de associação de pro-
fessores à materias em uma universidade brasileira (Universidade Fed-
eral de São Paulo, campus São José dos Campos). São abordadas áreas
específicas e informações básicas relacionadas ao problema em questão,
como Programação Inteira, Modelagem Matemática, Branch and Bound,
Simulated Annealing e outros métodos de solução. São apresentadas,
também, as soluções obtidas e suas avaliações.
i
Abstract
T
H is work contains a study about the Assignment Problem and some
methods for solving it, applying these concepts to various in-
stances of the problem. A good example is the association of
teacher-subjects on a brazillian university (Federal University of Sao Paulo,
campus São José dos Campos). In this work, specific areas and basic
information related and pertinent to the problem in question will be dis-
cussed, such as Integer Programming, mathemathic modelling, Branch
and Bound, Simulated Annealing and other solution methods. The ob-
tained solutions and its evaluations will also be shown.
iii
Sumário
Resumo i
Abstract iii
1 Introdução 1
1.1 Problema de Alocação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Revisão Bibliográfica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Metodologia 5
2.1 Plano de Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1 Atividades e Cronograma . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Problema de Alocação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Modelagem do Problema de Alocação . . . . . . . . . . . . . . . . . . . . . . 9
2.3.1 Programação Linear . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.2 Programação Inteira . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4 Métodos de Solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4.1 Força Bruta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4.2 Branch and Bound . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4.3 Heurísticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4.4 Simulated Annealing . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3 Implementação 17
3.1 Armazenamento de associações . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Força Bruta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3 Branch and Bound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.4 Simulated Annealing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5 Algoritmo Guloso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4 Resultados Computacionais 27
4.1 Métodos exatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
v
4.2 Metaheurística . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3 Otimizações e Comparações Finais . . . . . . . . . . . . . . . . . . . . . . . . 35
4.4 Instância de alocação professor-matéria . . . . . . . . . . . . . . . . . . . . . 40
5 Conclusão 45
5.1 Considerações finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2 Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Referências Bibliográficas 49
A Apêndice 53
A.1 Código Fonte do Força Bruta . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
A.2 Código Fonte do Branch and Bound . . . . . . . . . . . . . . . . . . . . . . . 54
A.3 Código Fonte do Simulated Annealing . . . . . . . . . . . . . . . . . . . . . . 56
A.4 Código Fonte do Algoritmo Guloso . . . . . . . . . . . . . . . . . . . . . . . 57
vi
C APÍTULO
1
Introdução
1
2 1.2. Objetivos
do problema em questão, podendo ser uma questão de minutos, horas, dias e até semanas) em
problemas de larga escala.
Este tipo de problema (que pode ser nomeado também como designação, matching, em-
parelhamento, dentre outros nomes) constitui uma parte importante da Ciência da Computação
e Matemática, com aplicação prática direta. Em um problema deste tipo, tem-se dois conjun-
tos (agentes-tarefas, trabalhadores-empregos, entre outros exemplos) e deve-se encontrar uma
função que ligue elementos destes dois conjuntos. Podem haver (e na maioria dos casos há)
restrições e requisitos para a ligação de um par de elementos, constituindo um custo para a des-
ignação. E o problema está em encontrar a função que minimiza o custo somado de todas as
alocações, respeitando as restrições existentes. O Problema de Alocação se encaixa exatamente
nesta descrição. Uma definição concisa e geral deste, dada segundo (Dasgupta et al., 2008) é:
Neste trabalho, será tratado o estudo geral do Problema de Alocação, aplicando-o a várias
instâncias geradas aleatoriamente. Uma outra instância a ser estudada é um problema ocorrente
no Campus São José dos Campos, da Universidade Federal de São Paulo: a dificuldade de
associar os pares professor-matéria, definindo qual professor ministrará cada disciplina. Cada
professor possui uma preferência e formação, e é necessário que cada um assuma uma disciplina
de modo que o maior número de docentes possível estejam satisfeitos, e a designação seja feita
de forma coerente em relação às especialidades de cada professor.
1.2 Objetivos
Neste trabalho são estudadas áreas como Otimização Combinatória e Programação Linear In-
teira, focando principalmente no Problema de Alocação. Com isto são inclusos também estudos
de modelagem matemática e métodos de resolução utilizados na área. Pode-se, posteriormente,
buscar uma solução ainda mais eficiente para a instância escolhida, incluindo o estudo de prob-
lemas similares ao Problema de Alocação, como, por exemplo, o Problema do Transporte, além
de métodos e heurísticas de resolução mais elaborados.
O objetivo de avaliar métodos de resolução aplicados ao Problema de Alocação utilizando
algumas instâncias geradas aleatoriamente. No caso da instância particular do problema de
Capítulo 1. Introdução 3
designação professor-disciplina na Unifesp, busca-se encontrar uma solução viável para de-
terminar e designar quais professores ministrarão cada disciplina (no Campus São José dos
Campos, da Universidade Federal de São Paulo). Espera-se que sejam geradas alocações
professor-disciplina respeitando os requisitos de modo que o método possa ser aproveitado
dentro da universidade, caso seja assim desejado.
2
Metodologia
5
6 2.2. Problema de Alocação
Nov
Mai
Dez
Abr
Out
Jun
Set
Jul
Atividades
1) Revisão bibliográfica
2) Elaboração do texto
3) Modelagem do problema específico
4) Implementação de métodos
5) Geração das instâncias
6) Execução dos softwares para obter as soluções
7) Avaliação de resultados e conclusão
8) Revisões finais
A função objetivo é:
!
c(i, f (i)) (2.1)
i∈A
!!
min c(i, j)xij (2.2)
i∈A j∈T
!
xij = 1 ∀i ∈ A (2.3)
j∈T
!
xij = 1 ∀j ∈ T (2.4)
i∈A
Além disso, a variável xij deve ser binária , o que nos leva à restrição:
Pode-se tratar este problema com pequenas variações, como atribuir no máximo K tarefas
a cada agente. Neste caso, haveria a restrição:
!
xij ≤ K, ∀i ∈ A
j∈T
É importante ter em mente que, neste problema, o domínio das soluções possui tamanho n!,
ou seja, possui n! candidatos a solução, onde n é o tamanho dos conjuntos A e T , e, portanto, o
número de agentes e tarefas que a instância possui.
• Linearidade: A relação entre as funções e restrições deve ser linear. Pode também ser
chamada de proporcionalidade, como explicado em (Goldbarg e Luna, 2005): “a quanti-
dade de recurso consumido por uma dada atividade deve ser proporcional ao nível dessa
atividade na solução final do problema. Além disso, o custo de cada atividade é propor-
cional ao nível de operação da atividade”.
• Não Negatividade: “Deve ser sempre possível desenvolver dada atividade em qualquer
nível não negativo e qualquer proporção de um dado recurso deve sempre poder ser uti-
lizado”(Goldbarg e Luna, 2005).
• Aditividade: Propriedade na qual o custo total é igual a soma das partes, ou seja, das
parcelas de cada atividade, exemplificado como f (x + y) = f (x) + f (y)
10 2.3. Modelagem do Problema de Alocação
• Não Negatividade: Nas restrições não há possibilidade da variável xij assumir valores
negativos. O custo, apesar de também ser positivo na grande maioria das instâncias, não
influencia aqui, pois não é uma variável do problema, e sim, um valor fixo já determinado
para a instância específica.
max cx : Ax ≤ b, x ∈ Z∗+
Capítulo 2. Metodologia 11
onde:
A é uma matriz m por n;
c é um vetor linha n-dimensional;
b é um vetor coluna m-dimensional;
e x é um vetor coluna n-dimensional de variáveis ou valores desconhecidos;
Se todas as variáveis são inteiras, tem-se um Programa Inteiro, que pode ser escrito
como:
max cx
Ax ≤ b
x≥0
x ∈ Z”
Na prática isso significa que todas as variáveis não podem possuir valores contínuos e estare-
mos lidando somente com variáveis discretas.
elementos j1 j2 j3
i1 1 0 0
i2 0 1 0
i3 0 0 1
2.4.3 Heurísticas
As heurísticas (ou modelos heurísticos) não garantem que seja encontrado o ótimo. Geralmente
encontram soluções próximas à ótima, mas algumas vezes, dependendo das circunstâncias, é
possível que sejam obtidos resultados arbitrariamente ruins (ou também o resultado ótimo). Isso
denota uma relação de custo benefício. Ao utilizarmos este tipo de método, não precisamos da
melhor solução possível, mas geralmente obtemos uma solução viável com um tempo computa-
cional aceitável.
Claramente, uma situação na qual opta-se pelo uso de heurísticas é aquela onde há prob-
lemas que, utilizando algoritmos exatos (ou mesmo aproximativos), um tempo computacional
demasiadamente longo é necessário para que se obtenha a solução. Outras vantagens destes
métodos são que a maioria deles é conceitualmente simples, podem ser adaptados a vários
problemas (são não-específicos), e operam sem a imposição de condicionantes ao problema,
como convexidade e linearidade. Estes conceitos estão presentes em vários livros didáticos,
dentre eles (Goldbarg e Luna, 2005).
Dentro da categoria das heurísticas estão alguns métodos caracterizados como metaheurís-
ticas (assunto abordado de modo coeso na referência (Luke, 2009)). São definidos como uma
metaheurística os métodos que otimizam um problema ao iterativamente buscar a melhora de
uma canditada à solução, utilizando alguma medida de qualidade. São métodos de otimiza-
ção estocástica, ou seja, algoritmos e técnicas que utilizam alguma forma de aleatoriedade para
encontrar uma solução ótima ou próxima à ótima em problemas difíceis de serem resolvidos.
14 2.4. Métodos de Solução
Metaheurísticas são utilizadas para encontrar soluções para problemas para os quais não
se tem muitas informações. Não se sabe qual deve ser a solução ótima e o espaço de busca é
vasto. Mas, se existe uma candidata à solução do problema, é possível testá-la e definir o quão
boa ela é. Isto é verdade para muitos problemas de Otimização Combinatória, o que leva uma
metaheurística a ser bastante utilizada para resolver problemas da área.
Estes métodos exploram uma característica do espaço de soluções que se repete em muitos
problemas: soluções similares tendem a se comportar de modo similar, ou seja, têm qualidade
parecida. Pequenas modificações numa solução vão resultar em pequenas modificações na
qualidade. Este método, de começar com uma solução aleatória e fazer iterativamente pequenas
modificações aleatórias na solução, de modo a encontrar soluções melhores, é chamado de Hill
Climbing. Essencialmente, quase todas as metaheurísticas utilizam este conceito.
quase aleatória. Conforme T diminui, a aceitação fica mais restrita, eventualmente aceitando
somente soluções melhores. Este processo evita que o Simulated Annealing fique preso em
ótimos locais (o grande problema de métodos gulosos).
C APÍTULO
3
Implementação
Todos os métodos foram implementados na linguagem Java, pela já familiaridade com a mesma.
Visualizar todas as permutações válidas para o Problema de Alocação numa matriz assim é
difícil e insere problemas como, por exemplo, verificar se a matriz de associação é válida a cada
nova permutação obtida. Para uma instância de tamanho n = 3, as permutações possíveis são:
17
18 3.1. Armazenamento de associações
• 1,2,3
• 1,3,2
• 2,1,3
• 2,3,1
• 3,1,2
• 3,2,1
ou em forma de árvore:
Para a primeira permutação, o agente 1 estaria ligado à tarefa 1, o agente 2 ligado à tarefa 2,
e o agente 3 ligado à tarefa 3, e assim por diante para as outras.
Capítulo 3. Implementação 19
Surge, portanto, a primeira dificuldade: nos algoritmos escolhidos - Branch and Bound,
Simulated Annealing e Força Bruta - a maior parte dos exemplos que se encontram na liter-
atura utilizam vetores, e adaptá-los para trabalhar com uma matriz complicaria o algoritmo e
o deixaria ineficiente. É necessário também que se encontre uma forma de representar cada
permutação possível eficientemente, de modo que a implementação dos métodos seja mais fácil
e menos confusa.
Para resolver este problema, ao invés de armazenar as associações de agente-tarefa em uma
matriz de associação, adota-se um vetor - exemplificado na Tabela 3.2 - cujos índices represen-
tam os agentes e o valor dentro de cada índice indica a qual tarefa aquele agente está associado.
O único detalhe é que deve-se iniciamos a contagem pelo zero, ou seja, para o exemplo anterior,
agora tem-se os agentes 0, 1 e 2, e as tarefas 0, 1 e 2.
valor 2 1 0
índice 0 1 2
Figura 3.2: Código do método principal do algoritmo Força Bruta. Neste código, o parâmetro
n é o último índice do vetor.
A cada chamada, o método testa se pos é o final do vetor. Se não for, será executado
um for, de pos até o final do vetor, e a cada iteração deste faremos o swap de pos e o índice
correspondente no for, fazemos uma nova chamada ao método, somando 1 ao pos e desfazemos
a troca feita, para que as permutações seguintes não sejam comprometidas.
Finalmente, para que se torne um algoritmo de força bruta, é necessário que a cada permu-
tação completada (ou seja, a cada vez que uma chamada do método permuta() for executada)
verificar se pos é o final do vetor. Caso positivo, deve-se calcular o custo.
No método de cálculo de custo, percorre-se o vetor com um for, acessando a matriz de
custos (que é um atributo da classe ForcaBruta) utilizando como linhas a variável de iteração
do for e nas colunas o valor contido no índice do vetor correspondente à atual iteração. O valor
contido nesta célula da matriz é somado à variável soma, que, ao final das iterações, conterá o
custo total da solução. Por fim, este custo é comparado com o custo da melhor solução até o
momento (ou seja, a permutação com o menor custo), representados pelos atributos de classe
melhorCusto e melhorSolucao. Caso a nova permutação seja uma solução com menor custo do
que a guardada em melhorSolucao, esta passa a ser a melhor solução. Este método de custo
é apresentado na figura 3.3. O algoritmo continua, até que todas as permutações tenham sido
avaliadas desta forma, varrendo o espaço de soluções por completo, e obtendo a solução ótima.
Capítulo 3. Implementação 21
Figura 3.3: Código fonte do método que calcula o custo de uma permutação
indicando que qualquer permutação cujo valor para o índice 0 seja 2 é ineficiente perante à
solução já obtida e, por isto, não precisa ser processada.
valor 1 2 0
índice 0 1 2
valor 2 x x
índice 0 1 2
O método principal do Branch and Bound (apresentado na Figura 3.4) é, portanto, bem
similar ao do Força Bruta nesta implementação.
Figura 3.4: Código da função principal do algoritmo Branch and Bound. Neste código, o
parâmetro n é o último índice do vetor
Assim como o Força Bruta, o algoritmo é executado até que todas as permutações tenham
sido avaliadas ou eliminadas. Uma possibilidade de melhora seria atualizar as variável melhor-
Solucao e melhorCusto ao buscar - utilizando uma heurística rápida - uma melhora da melhor
Capítulo 3. Implementação 23
solução que utilize o início de vetor recebido na chamada daquela instância de execução da
função.
−delta
aceitacao = e temperatura
4
Resultados Computacionais
As instâncias utilizadas nos testes foram geradas aleatoriamente. Os valores de custo estão
dentro do intervalo de 0 a 99, incluindo ambos. O total de casos de teste utilizados são:
• 1 Instância de tamanho 15
• 1 Instância de tamanho 20
• 1 Instância de tamanho 30
• 1 Instância de tamanho 40
• 1 Instância de tamanho 50
27
28 4.1. Métodos exatos
instância permutações
5 120
10 3628800
15 1307674368000
20 2.43290201 ∗ 1018
30 2.6525286 ∗ 1032
40 8.15915283 ∗ 1047
50 3.04140932 ∗ 1064
É importante citar que todos os testes foram feitos em um processador Intel Core2Quad
Q6600, de 2.4 GHz, utilizando somente um núcleo. Nenhum algoritmo foi otimizado para
mútiplos processadores ou núcleos. O sistema operacional utilizado foi o Windows 7 32bits.
Na Tabela 4.2, pode-se notar que, para o método Força Bruta, o tempo está como N/D (não
disponível) para as instâncias de tamanho 15 e 20. Isto é devido ao fato de que, para a instância
de tamanho 15, já é inviável executar uma única vez o algoritmo de Força Bruta.
Como o Força Bruta não executou para n ≥ 15, será feita uma estimativa do tempo necessário
de execução do método Força Bruta. A fórmula que utilizaremos é baseada no cálculo de tempo
de percurso, ou seja, dada a velocidade, e a distância, podemos calcular o tempo que leva para
encontrarmos o tempo necessário para que se complete. Analogamente:
n!
T (n) = (4.1)
cte
onde T (n) é o tempo de execução do algoritmo em milisegundos, n é o tamanho da instância
e cte é a constante de execução, ou seja, quantas permutações são avaliadas por milisegundo.
Esta constante pode ser obtida para o método de Força Bruta utilizando os valores obtidos nas
instâncias menores. Serão avaliados o melhor tempo de execução (instância 10a) e pior tempo
de execução (instância 10b):
30 4.1. Métodos exatos
10! 10!
T (10a) = T (10b) =
cte cte
10!
317, 5 ms = 321, 6 ms = 10!cte
cte
cte ≈ 11429, 3 cte ≈ 11283, 6
Utilizaremos a média do melhor e pior caso como constante de execução para o método de
Força Bruta. Desta forma:
11429, 3 + 11283, 6
cte =
2
cte = 11356, 45
Com isto, obtemos que o Força Bruta analisa, em média, 11356,45 permutações por milise-
gundo. Com isto, calculando o tempo necessário para a execução da instância de tamanho 15
obtemos:
15!
T (15) =
11356, 45
Este valor equivale a 31h 59min, o que, pelas estimativas, torna a instância de tamanho 15
inviável para o Força Bruta.
O mesmo cálculo pode ser feito para o Branch and Bound não otimizado. Primeiro cal-
culamos a constante de execução, utilizando como base a média do tempo de execução das
instâncias de tamanho 15 e 20:
Capítulo 4. Resultados Computacionais 31
15! 20!
T (15) = T (20) =
cte cte
15!
944, 6 ms = 197268, 2 ms = 20!cte
cte
cte ≈ 1, 38437 ∗ 109 cte ≈ 1, 2333 ∗ 1013
30!
T (30) =
6, 167192185 ∗ 1012
Isto equivale a 5, 974 ∗ 1012 horas, ou seja, sem otimizações, o Branch and Bound é in-
viável para obter a solução para a instância de tamanho 30. Como confirmação, o algoritmo foi
executado por mais de dez horas, mas nenhum resultado foi obtido.
4.2 Metaheurística
Nesta seção é avaliado o desempenho do Simulated Annealing, sendo a do algoritmo guloso
avaliada para efeito de comparação.
Um detalhe que deve ser mencionado é que no Simulated Annealing os parâmetros de tem-
peratura e número de iterações influenciam profundamente no tempo de execução e na quali-
dade de solução, e por isso foram testadas várias configurações destes. Com valores mais altos,
a qualidade das soluções e o tempo de execução aumentam.
Primeiramente são apresentados os resultados para o algoritmo guloso, na Tabela 4.3. As
soluções ótimas foram retiradas dos testes anteriores com os métodos exatos. Não há variação
nas soluções encontradas, pois o algoritmo sempre executa os mesmos cálculos se a instância
32 4.2. Metaheurística
for a mesma. Também há a questão do tempo de execução, que é menor do que 1 ms para
qualquer uma das instâncias, em todas as execuções feitas (e que por isso não está presente
na tabela). A solução ótima para a instância de tamanho 30 foi encontrada com o Branch and
Bound otimizado, que será visto na próxima seção. As soluções ótimas para as instâncias de
tamanho 40 e 50 não foram encontradas com métodos exatos, e por isto não estão disponíveis.
Fica claro que o algoritmo guloso não gera soluções boas o suficiente. Conforme se ex-
ecutam instâncias maiores, a distância entre o resultado obtido e a solução ótima fica maior.
Esta heurística só é realmente útil para o Problema de Alocação na geração de soluções iniciais
razoáveis para outros métodos mais eficientes.
Nas Tabelas 4.4 e 4.5 são apresentados os resultados para o Simulated Annealing. A heurís-
tica foi executada dez vezes para cada instância, em várias configurações dos parâmetros de
temperatura e número de iterações feitas com uma fórmula baseada no tamanho da instância,
como caracterizados abaixo:
Instâncias
parâmetros 5a 5b 5c 5d 10a 10b 10c 15 20 30 40 50
SA(2,100) 0,06 0,05 0,05 0,06 0,16 0,16 0,15 0,26 0,37 0,73 1,14 1,63
SA(3,200) 0,13 0,12 0,12 0,12 0,31 0,31 0,31 0,55 0,84 1,62 2,62 3,84
SA(5,500) 0,38 0,36 0,36 0,36 1,00 1,00 1,00 1,79 2,77 5,48 8,89 13,38
SA(6,750) 0,62 0,60 0,60 0,60 1,68 1,67 1,67 3,02 4,71 9,38 15,44 22,78
SA(7,1000) 0,88 0,86 0,85 0,86 2,40 2,44 2,42 4,45 6,92 14,13 23,02 33,90
SA(10,1500) 1,62 1,60 1,58 1,59 4,64 4,64 4,64 8,47 13,31 27,71 45,75 68,74
SA(15,2000) 2,84 2,80 2,81 2,80 8,37 8,34 8,33 15,44 24,55 49,84 86,17 128,95
É possível notar que o tempo cresce bastante quando se aumenta o tamanho da instância
(devido às fórmulas de determinação da temperatura e de iterações em função do tamanho da
instância), ou quando se aumenta o valor dos parâmetros. A vantagem disso, entretanto, é que
geralmente se obtém melhores soluções, como mostrado na Tabela 4.5. Na Figura 4.3, temos a
melhor solução encontrada em 10 execuções para as instâncias de tamanho 5 até tamanho 30,
enquanto que a Figura 4.4 apresenta o mesmo, só que para as instâncias de tamanho 40 e 50.
34 4.2. Metaheurística
É interessante notar que foi encontrada a solução ótima para as instâncias menores. Nestes
casos, é possível notar que a variação de resultados é pequena ou inexistente, nas dez execuções.
Uma estratégia interessante para se obter boas soluções no Simulated Annealing é, portanto,
executá-lo várias vezes, e escolher o melhor resultado obtido (o com o menor custo). Caso
a variação seja zero, é grande a chance de que se trate da solução ótima, porém não é 100%
garantido.
A tabela também indica que, conforme aumentam os valores dos parâmetros, as soluções
obtidas tendem a ser melhores. Porém, a desvantagem clara demonstrada nos testes para o
Simulated Annealing é conseguir determinar cada valor de parâmetro sem a necessidade de se
fazer testes com várias configurações para cada instância, processo que acaba sendo bastante
trabalhoso. Isto é válido, principalmente, para que não se utilize valores de parâmetros maiores
que o necessário para encontrar o ótimo em instâncias pequenas, o que indica um gasto de
tempo e poder de processamento desnecessário, que se torna crítico conforme se necessita de
soluções para instâncias muito grandes.
Capítulo 4. Resultados Computacionais 35
Instâncias
parâmetros 5a 5b 5c 5d 10a 10b 10c 15 20 30 40 50
maior 48 89 124 91 181 116 84 158 152 147 191 219
SA(2,100) mediana 48 89 124 91 181 116 84 158 149 119 163 193
menor 48 89 124 91 181 116 84 158 149 115 157 173
maior 48 89 124 91 181 116 84 158 150 129 169 205
SA(3,200) mediana 48 89 124 91 181 116 84 158 149 119 158 182
menor 48 89 124 91 181 116 84 158 149 115 148 176
maior 48 89 124 91 181 116 84 158 149 121 167 197
SA(5,500) mediana 48 89 124 91 181 116 84 158 149 115 157 179
menor 48 89 124 91 181 116 84 158 149 115 147 165
maior 48 89 124 91 181 116 84 158 149 117 162 188
SA(6,750) mediana 48 89 124 91 181 116 84 158 149 115 154 172
menor 48 89 124 91 181 116 84 158 149 115 151 164
maior 48 89 124 91 181 116 84 158 149 117 155 183
mediana 48 89 124 91 181 116 84 158 149 115 152 177
SA(7,1000)
menor 48 89 124 91 181 116 84 158 149 115 147 168
maior 48 89 124 91 181 116 84 158 149 115 156 184
mediana 48 89 124 91 181 116 84 158 149 115 147 174
SA(10,1500)
menor 48 89 124 91 181 116 84 158 149 115 143 161
maior 48 89 124 91 181 116 84 158 149 115 153 187
mediana 48 89 124 91 181 116 84 158 149 115 148 174
SA(15,2000)
menor 48 89 124 91 181 116 84 158 149 115 142 164
Solução Ótima 48 89 124 91 181 116 84 158 149 115 N/D N/D
Para tentar melhorar o desempenho do Branch and Bound, e tentar resolver instâncias
maiores, foram feitas duas otimizações no método. A idéia para ambas é que com uma solução
inicial melhor o limite para corte fica bem mais restrito pois o custo da solução inicial está
relativamente próximo do custo da solução ótima. Isto faz com que o processo de bounding
ocorra em níveis mais altos da árvore, efetivamente descartando espaços de soluções maiores,
e tornando o algoritmo mais rápido. Isto foi feito gerando uma solução inicial com o algoritmo
guloso, e também com o Simulated Annealing (utilizando parâmetros com valores baixos, para
não aumentar muito o tempo de processamento). A comparação entre o Branch and Bound puro
(BB), o Branch and Bound otimizado com o algoritmo guloso (BBA) e o Branch and Bound
otimizado com o Simulated Annealing (BBS) está na Tabela 4.6, e um gráfico que representa a
tabela está na Figura 4.5
Apesar de ser mais lento em instâncias pequenas, a otimização com o Simulated Annealing
é muito mais rápida que o Branch and Bound puro, ou o otimizado somente com o algoritmo
Capítulo 4. Resultados Computacionais 37
guloso quando utilizamos instâncias maiores (de tamanho 20 ou mais). Como os tempos para
instâncias pequenas não são problema (todos menores que um segundo), a opção clara é a
otimização com o Simulated Annealing gerando a solução inicial.
A mesma idéia de melhorar a solução inicial é aplicada para o Simulated Annealing, ro-
dando o algoritmo guloso e utilizando a permutação resultante como solução inicial para o SA.
Isto melhora a convergência do método, tornando-a ligeiramente mais rápida. As tabelas de
tempos de execução e qualidade de solução são apresentadas nas Tabelas 4.7 e 4.8, respectiva-
mente:
Instâncias
parâmetros 5a 5b 5c 5d 10a 10b 10c 15 20 30 40 50
SA(2,100) 0,06 0,06 0,06 0,05 0,15 0,14 0,16 0,26 0,37 0,69 1,09 1,59
SA(3,200) 0,12 0,12 0,12 0,12 0,31 0,31 0,31 0,55 0,84 1,64 2,64 3,84
SA(5,500) 0,36 0,36 0,36 0,36 1,00 1,00 1,01 1,78 2,76 5,52 8,92 13,26
SA(6,750) 0,60 0,60 0,60 0,60 1,66 1,67 1,67 3,01 4,69 9,40 15,41 22,67
SA(7,1000) 0,85 0,85 0,85 0,86 2,39 2,39 2,44 4,42 6,88 13,93 22,74 33,67
SA(10,1500) 1,59 1,59 1,59 1,59 4,62 4,63 4,64 8,48 13,28 26,99 44,61 67,23
SA(15,2000) 2,80 2,80 2,79 2,80 8,32 8,32 8,34 15,39 24,53 51,52 86,52 129,30
Os tempos são bem similares à tabela 4.4 referente ao SA puro, não sendo efetivos para
efeito de comparação. As soluções, porém, tendem a ser ligeiramente melhores no otimizado,
como esperado. A comparação de ambos os métodos é dada na tabela 4.9.
Capítulo 4. Resultados Computacionais 39
instâncias
parâmetros método medida 20 30 40 50
mediana 149 119 163 193
SA menor 149 115 157 173
t(2,100) mediana 150 122 164 211
SAO menor 149 115 151 184
mediana 149 119 158 182
SA menor 149 115 148 176
t(3,200) mediana 149 118 161 186
SAO menor 149 115 141 174
mediana 149 115 157 179
SA menor 149 115 147 165
t(5,500) mediana 149 115 150 185
SAO menor 149 115 146 172
mediana 149 115 154 172
SA menor 149 115 151 164
t(6,750) mediana 149 115 150 182
SAO menor 149 115 144 164
mediana 149 115 152 177
SA menor 149 115 147 168
t(7,1000) mediana 149 115 150 169
SAO menor 149 115 141 160
mediana 149 115 147 174
SA menor 149 115 143 161
t(10,1500) mediana 149 115 146 172
SAO menor 149 115 141 165
mediana 149 115 148 174
SA menor 149 115 142 164
t(15,2000) mediana 149 115 149 172
SAO menor 149 115 141 163
custo possível para cada matéria (ou seja, a melhor opção teoricamente possivel, sem levar em
conta as combinações).
Na resolução do problema, foram utilizados apenas o Simulated Annealing otimizado e não
otimizado, devido ao tamanho da instância. Os parâmetros utilizados foram T emperatura =
n2 e N umero de iteracoes = n ∗ 100, onde n é o tamanho da instância. Ambos foram execu-
tados dez vezes, e os tempos de execução presentes estão na Tabela 4.11. Foram encontradas
várias soluções possíveis, todas próximas em termos de custo. Houve mais de uma instância
com o menor custo encontrado (205). Uma destas instâncias está presente na Tabela 4.12. A
solução real dada pela universidade está presente na Tabela 4.13, com custo 240.
A solução encontrada possui, portanto, um custo menor do que a solução definida pela
universidade. Porém, há algumas divergências de opções entre as instâncias, o que afeta o re-
sultado. Com um melhor sistema para cada docente selecionar as opções, de modo que este seja
preenchido por todos e corretamente, é possível utilizar um método como o Simulated Anneal-
ing para gerar estas alocações professor-matéria. Como há professores que foram associados
a matérias vazias, é possível que sejam realizados ajustes em cima de uma solução gerada por
este método apresentado.
É interessante notar que devido à uniformidade da instância (a maior parte dos custos era
alta, com o valor 10), a convergência do método foi mais rápida e a variação das soluções foi
pequena (se comparadas às instâncias geradas aleatoriamente), apesar de ter sido utilizada a
configuração com os menores valores de parâmetros, já definidos anteriormente.
42 4.4. Instância de alocação professor-matéria
Método Tempo de execução médio Maior custo Custo mediano Menor custo
SA 5044.5 ms 207 205 205
SA Otimizado 5024.1 ms 209 205 205
Tabela 4.12: Uma das soluções encontradas para a instância, com custo 205
44 4.4. Instância de alocação professor-matéria
Tabela 4.13: Solução real dada pela universidade, com custo 240
C APÍTULO
5
Conclusão
45
46 5.2. Trabalhos Futuros
instâncias de tamanho 30, obtém-se a resposta ótima com o Branch and Bound otimizado com
Simulated Annealing em algumas horas (aproximadamente seis), enquanto que o de tamanho 40
é impensável para o método da maneira que está implementada, e com o hardware disponível.
O Simulated Annealing foi bastante rápido - ao ser comparado com o Branch and Bound - na
resolução do problema, e obteve soluções muito boas. Com seu reduzido tempo, permite que
possa ser executado diversas vezes e que seja utilizada a melhor solução encontrada dentre to-
das as execuções (e ainda assim tendo um tempo total de execução bem menor que o Branch
and Bound).
• Formação da árvore:
– Variante de Dank
– Variante de Land e Doig
– Variante de Spielberg
– Método das Penalidades
– Método de Taha
– Estratégias dinâmicas
– Busca em Profundidade
– Busca em Largura
– Variantes Híbridas
– Relaxação Linear
– Relaxação Lagrangeana
– Algoritmos heurísticos e metaheurísticos
– Cortes
BAZARAA , M.; JARVIS , J.; S HERALI , H. Linear programming and network flows. John
Wiley & Sons, 2009.
Disponível em http://books.google.com/books?id=2DKKHvV\_xVwC
B EASLEY, J. E., ed. Advances in linear and integer programming. New York, NY, USA:
Oxford University Press, Inc., 1996.
C ORMEN , T.; L EISERSON , C.; R IVEST, R.; S TEIN , C. Introduction to algorithms. MIT
Press, 2009.
Disponível em http://books.google.com/books?id=h2xRPgAACAAJ
DASGUPTA , D.; H ERNANDEZ , G.; G ARRETT, D.; V EJANDLA , P. K.; K AUSHAL , A.; Y ER -
NENI , R.; S IMIEN , J. A comparison of multiobjective evolutionary algorithms with in-
formed initialization and kuhn-munkres algorithm for the sailor assignment problem. In:
Proceedings of the 2008 GECCO conference companion on Genetic and evolutionary com-
putation, New York, NY, USA: ACM, 2008, p. 2129–2134 (GECCO ’08, v.1).
Disponível em http://doi.acm.org/10.1145/1388969.1389035
49
50 Referências Bibliográficas
F LETCHER , R. Practical methods of optimization; (2nd ed.). New York, NY, USA:
Wiley-Interscience, 1987.
K UHN , H. W. The hungarian method for the assignment problem. Naval Research Logistics
Quarterly, v. 2, n. 1-2, p. 83–97, 1955.
Disponível em http://dx.doi.org/10.1002/nav.3800020109
M URTHY, P. Operations research (linear programming). New Age International (P) Ltd.,
2005.
Disponível em http://books.google.com.pe/books?id=u-eRHBbJW7AC
S.N.S ILVA , A.; S AMPAIO , R. M.; A LVARENGA , G. B. Uma aplicação de simulated anneal-
ing para o problema de alocação de salas. INFOCOMP Journal of Computer Science, v. 4,
n. 3, p. 59–66, 2005.
Referências Bibliográficas 51
A
Apêndice
53
54 A.2. Código Fonte do Branch and Bound
36 }
37
38 public int custo(int[] v){
39 int soma = 0;
40 for(int i = 0; i < v.length; i++)
41 soma += matrizCusto[i][v[i]];
42 if(soma < melhorCusto){
43 melhorCusto = soma;
44 copiaVetor(melhorSolucao, v);
45 }
46 return soma;
47 }
48
49 public int forcaBruta(int[][] custos){
50 size = custos.length;
51
52 int[] v = new int[size];
53 for(int i=0; i<size; i++){ //geracao da solucao inicial
54 v[i]=i;
55 }
56
57 matrizCusto = custos;
58
59 melhorCusto = custo(v);
60 melhorSolucao = new int[size];
61 copiaVetor(melhorSolucao, v); //copia v para melhorSolucao
62 permuta(v, 0, size); //executa o metodo propriamente dito
63 return melhorCusto;
64 }
65 }
98 copia(melhorSolucao, v);
99
100 permuta(v, 0, size);
101 return melhorCusto;
102 }
103 }
55 }
56 }
57 else{
58 double exp = ((-1)*delta)/temperatura;
59 double e = Math.exp(exp);
60 double f = r.nextFloat();
61 if(e > f) {
62 atual = vizinho;
63 }
64 }
65 }
66 temperatura *= taxaResfriamento;
67 }
68 }
69
70 public int[] swap(int[] vetor){
71 Random r = new Random();
72 int j = r.nextInt(vetor.length);
73 int i = r.nextInt(vetor.length);
74
75 int a = vetor[i];
76 int b = vetor[j];
77
78 vetor[i] = b;
79 vetor[j] = a;
80
81
82 return vetor;
83 }
84
85 public int custo(int[] vetor){
86 int soma = 0;
87 for(int i = 0; i < vetor.length; i++)
88 soma += matrizCusto[i][vetor[i]];
89 return soma;
90 }
91
92 public int[] geraSolucaoInicial(){
93 int[] vetor = new int[size];
94 for(int i = 0; i < vetor.length; i++)
95 vetor[i]=i;
96 return vetor;
97 }
98
99 public void copia(int[] v1, int[] v2){
100 for(int i = 0; i < v1.length; i++)
101 v1[i] = v2[i];
102 }
103
104 public int getMelhorCusto() {
105 return melhorCusto;
106 }
107
108 public int[] getMelhorSolucao() {
109 return melhorSolucao;
110 }
111
112 }