Você está na página 1de 33

CDD013

Métodos em Otimização Combinatória


Especialização em Ciência de Dados

Prof. Dr. Alexandre Xavier Martins


Autores:
Prof. Dr. Alexandre Xavier Martins
Prof. Dr. Paganini Barcellos de Oliveira
Prof. Dr. Thiago Augusto de Oliveira Silva

Universidade Federal de Ouro Preto - UFOP


Instituto de Ciências Exatas e Aplicadas - ICEA
Curso de Especialização em Ciência de Dados
Página web: https://deenp.ufop.br/ciência-dos-dados

Agosto de 2022
Sumário

I Conteúdo programático

1 Programa da disciplina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1 Objetivo 6
1.2 Ementa 6
1.3 Tópicos abordados 6
1.4 Ferramentas e ambiente computacional 7

II Heurísticas
2 Métodos Heurísticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1 Introdução 9
2.2 Representação de uma Solução 9
2.3 Heurísticas Construtivas 11
2.4 Busca Local 13
2.4.1 Busca em Regiões inviáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.2 Tipos de Busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3 Metaheurísticas baseadas em Buscas Locais . . . . . . . . . . . . . . . . . . 16


3.1 Multi-Start 16
3.2 GRASP 17
3.3 Simulated Annealing 18
3.4 Busca Tabu (Tabu Search) 20
4

3.5 Descida em Vizinhança Variável (Variable Neighborhood Descent ) 23


3.6 Busca em Vizinhança Variável (Variable Neighborhood Search) 23
3.7 Busca Local Iterada (Iterated Local Search) 24

4 Metaheurísticas baseadas em Buscas Populacionais . . . . . . . . . . . 26


4.1 Algoritmos Genéticos 26
4.2 Colônia de Formigas (Ant Colony) 27
4.3 Algoritmo Clonal Imunológico 28

Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
I
Conteúdo programático

1 Programa da disciplina . . . . . . . . . . . . . . . 6
1.1 Objetivo
1.2 Ementa
1.3 Tópicos abordados
1.4 Ferramentas e ambiente computacional
1. Programa da disciplina

1.1 Objetivo
Ao final do curso o estudante deve ser capaz de resolver problemas de otimização aplicando
heurísticas e metaheurísticas. Deve ser capaz ainda de analisar o desempenho de heurísticas e
metaheurísticas aplicados a problemas de otimização.

1.2 Ementa
Tecnicas para solução de problemas de otimização, em especial problemas de otimização combina-
tória: Heurísticas clássicas, Metaheurísticas. Principais metaheurísticas: Recozimento Simulado
(Simulated Annealing), Busca Tabu, Busca Local Iterada (Iterated Local Search - ILS), Busca em
Vizinhanc¸a Variavel (Variable Neighborhood Search - VNS), Procedimentos de Busca Adapta-
tiva Aleatoria e Gulosa (Greedy Randomized Adaptive Search Procedures - GRASP), Algoritmos
Geneticos, Colônia de Formigas.

1.3 Tópicos abordados


A disciplina irá apresentar um desdobramento da ementa com destaque para os seguintes itens:
1. Introdução aos Métodos aproximados ou heurísticos
• Justificativa de uso a problemas combinatórios
• Representação e avaliação de uma solução
• Noção de vizinhança
2. Métodos Construtivos
3. Métodos de Busca Local
• Métodos de descida/subida
• Estratégias de busca
4. Algoritmos metaheurísticos ou heurísticas inteligentes: Histórico, fundamentação, diferenças
entre metaheurísticas e heurísticas convencionais.
5. Metaheurísticas Baseadas em Buscas Locais (Simulated Annealing, Busca Tabu, GRASP,
ILS, VNS, VND)
1.4 Ferramentas e ambiente computacional 7

6. Metaheurísticas baseadas em buscas populacionais (Algoritmos Genéticos, Colônia de formi-


gas, Algoritmos imunológicos)
7. Aplicações de metaheurísticas a problemas clássicos de otimização

1.4 Ferramentas e ambiente computacional


A linguagem de programação Python será adotada ao longo do curso. Trata-se de uma linguagem de
alto nível, interpretada (não compilada) e de rápida prototipagem. Em aulas síncronas será adotada
a plataforma do Google Colab (https://colab.research.google.com/) para demonstração
da resolução dos exemplos de aplicação.
II
Heurísticas

2 Métodos Heurísticos . . . . . . . . . . . . . . . . . . 9
2.1 Introdução
2.2 Representação de uma Solução
2.3 Heurísticas Construtivas
2.4 Busca Local

3 Metaheurísticas baseadas em Buscas Lo-


cais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.1 Multi-Start
3.2 GRASP
3.3 Simulated Annealing
3.4 Busca Tabu (Tabu Search)
3.5 Descida em Vizinhança Variável (Variable Neigh-
borhood Descent)
3.6 Busca em Vizinhança Variável (Variable Neigh-
borhood Search)
3.7 Busca Local Iterada (Iterated Local Search)

4 Metaheurísticas baseadas em Buscas Po-


pulacionais . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.1 Algoritmos Genéticos
4.2 Colônia de Formigas (Ant Colony)
4.3 Algoritmo Clonal Imunológico

Referências . . . . . . . . . . . . . . . . . . . . . . . 32
2. Métodos Heurísticos

2.1 Introdução
Para os autores Arroyo et al. (2002) os algoritmos heurísticos de otimização são métodos que visam
alcançar soluções aproximadas para problemas de otimização. O seu desenvolvimento surge em
resposta a incapacidade de se resolver de modo eficiente diversos problemas da classe N P-difícil.
Ou seja, as heurísticas buscam resolver os problemas com a mesma eficiência que os métodos
exatos de programação, porém, em um tempo reduzido.
Em geral, usamos os métodos heurísticos quando o tempo necessário para resolver um problema
de forma exata é superior ao tempo que temos disponível para obter uma resposta, ou até mesmo
quando não há ainda nenhum método exato disponível. Neste sentido, vemos que uma das vantagens
dos métodos heurísticos é no tempo para gerar uma solução viável e de boa qualidade. Como
desvantagem estes métodos não garantem que a solução encontrada seja ótima.
De maneira simplificada, podemos dividir os métodos heurísticos em duas categorias principais:
Métodos Construtivos e Métodos de Refinamento.
As heurísticas construtivas, como o nome sugere, constroem uma solução, passo a passo,
elemento por elemento até que se obtenha uma solução viável ou que nenhum elemento possa ser
inserido na solução.
Já as de refinimento partem de uma solução inicial ou de um conjunto de soluções iniciais e
utilizam mecanismos específicos para obterem soluções melhores.

2.2 Representação de uma Solução


Definição 2.2.1 Uma instância de um problema de otimização é um par (S, f ), onde S é um
conjunto de soluções viáveis e f é uma função de custo tal que f : S ← R1 . O problema é encontrar
uma solução que seja ótima globalmente, isto é, uma solução s∗ ∈ S tal que f (s∗ ) ≤ f (s) para todo
s ∈ S.
Uma instância (S, f ), em geral, não é dada explicitamente. Usualmente, nós temos uma
representação da instância e um algoritmo para verificar se a solução pertence a S e para computar
seu custo.
10 Capítulo 2. Métodos Heurísticos

Uma solução é representada por um conjunto de variáveis de decisão, as quais podem estar
dentro de intervalos determinados.
Exemplo 2.2.1 Problema da Mochila

• Imagine que um mochileiro precise viajar e nesta viagem deseja levar alguns objetos
• Para guardar esses objetos ele pode usar uma mochila, que, no entanto, só pode levar b quilos
• Cada objeto i tem um certo peso wi
• Cada objeto i proporciona um benefício ci se for levado
• O problema consiste em escolher os objetos que trarão o maior benefício possível sem
ultrapassar a capacidade da mochila

Objeto 0 1 2 3 4 5 6 7
Benefício 4 3 2 6 2 3 5 4
Peso 5 4 3 9 4 2 6 7
b = 20
Instância do problema

A primeira pergunta que devemos fazer para a resolução do problema é: Qual a variável de
decisão?
No caso do problema da mochila temos já disponível na literatura um modelo para sua resolução
em que a variável de decisão é dada por xi ∈ {0, 1}. Seja n o número de objetos disponíveis o
modelo é dado por:

n
Maximize Q(x) = ∑ ci xi (2.1)
i=1
Sujeito a:
n
∑ wi xi ≤ b (2.2)
i=1
xi ∈ {0, 1} ∀ i = {1, . . . , n} (2.3)

Outra questão que podemos nos fazer é a seguinte: Como podemos representar uma solução
deste problema no computador?
Repare que, como o Problema da Mochila já possui um modelo de otimização definido, uma
representação computacional natural pode ser dada por um vetor x em que cada posição é 0 ou 1,
como no modelo. Mas também podemos representar uma solução desse problema por uma lista
com os objetos que serão levados.

Figura 2.1: Representações Alternativas para o Problema da Mochila

A Figura 2.1 mostra a mesma solução para o Problema da Mochila com duas representações
diferentes.
2.3 Heurísticas Construtivas 11

Pensarmos em como iremos representar uma solução computacional é importante porque isso
pode influenciar no próprio desempenho computacional. No caso do exemplo, uma representação
natural já é oferecida pelo próprio modelo, mas existem problemas que nem mesmo possuem
modelos matemáticos para sua resolução.
Além da representação de uma solução precisamos determinar como iremos verificar se uma
dada solução é viável e qual o valor da função objetivo. Veja que a codificação para que isso seja
realizado está diretamente ligado à forma como representamos a solução.
A Figura 2.2 mostra o código em Python para se calcular o valor da função objetivo em um vetor.
Na mesma função é também verificada a viabilidade da solução. Caso o código seja executado para
a solução que é mostrada na Figura 2.1 a mensagem de "Solução inviável!!!" será retornada.

Figura 2.2: Código para o calculo da função objetivo e viabilidade em um vetor

A Figura 2.3 mostra o código em Python para se calcular o valor da função objetivo em uma
Lista. Assim como no código anterior na mesma função é também verificada a viabilidade da
solução.

2.3 Heurísticas Construtivas


De maneira geral a solução de um problema pode ser construída de 4 maneiras:
1. Construção Gulosa
2. Construção Aleatória
3. Uma combinação das duas anteriores
4. Um solução baseada em economias
A construção gulosa visa inserir na solução o "melhor elemento"segundo algum critério pré-
definido. Obviamente esse critério de "melhor elemento"varia de problema para problema e as
vezes até em um mesmo problema podemos ter mais de um critério a ser utilizado. A ideia principal
desse método é tentar reproduzir a criação de uma solução de uma maneira como faríamos de uma
forma racional.
12 Capítulo 2. Métodos Heurísticos

Figura 2.3: Código para o calculo da função objetivo e viabilidade em uma lista

Voltando ao Exemplo do Problema da Mochila como queremos maximizar a soma dos benefí-
cios poderíamos usar como critério para criação a cada passo inserir o elemento de maior benefício
que ainda não está na mochila. Repare que neste problema a mochila vazia já é viável, logo é
interessante inserir elementos até que não seja mais possível inserir nenhum devido à capacidade.
A Figura 2.4 apresenta o pseudocódigo genérico para a geração de uma solução usando o
método guloso. Como entrada o procedimento recebe os dados do problema. Na Linha 1 o conjunto
de candidatos a entrar na solução é estabelecido. Na Linha 2 uma solução vazia é criada. Na Linha
4 é escolhido o melhor elemento do conjunto de C que é adicionado à solução na linha 5. Na Linha
6 o conjunto C é atualizado e o método verifica se irá repetir o processo ou se já tem uma solução
inicial adequada.
Exemplo 2.3.1 Problema da Mochila - Gerando uma Solução

Seguindo o pseudocódigo apresentado o primeiro passo é iniciar o conjunto C de candidatos a


entrar na solução. Inicialmente, como a mochila está vazia, todos os objetos podem entrar em C, já
que nenhum ultrapassa a capacidade da mesma, que é 20. Logo C = {0, 1, 2, 3, 4, 5, 6, 7}. A solução
inicial S = {0}.
/ Na primeira iteração c = 3, que é o elemento que traz o maior benefício. Sendo
assim, agora temos S = {3} e como ainda não temos elementos que ultrapassam a capacidade da
mochila C = {0, 1, 2, 4, 5, 6, 7}.
Na segunda iteração c = 6. A nova solução parcial passa a ser S = {3, 6}. Repare que agora o
peso dentro da mochila é 15, logo o elemento 7 não pode mais fazer parte dos candidatos a entrar
na mochila pois geraria uma solução inviável. Sendo assim, atualizando C temos C = {0, 1, 2, 4, 5}.
Na terceira iteração o elemento escolhido é o 0. A nova solução é S = {0, 3, 6}. Neste ponto
atingimos o limite de capacidade da mochila, logo C = {0} / e o método retorna a solução com
função objetivo igual a 15.
Exercício 2.3.1
Gere a solução inicial do Problema da Mochila tendo como critério guloso o peso dos objetos. Ou
2.4 Busca Local 13

Figura 2.4: Pseudocódigo para geração de uma solução Gulosa

seja, a cada passo, o elemento inserido será o mais leve.


Exercício 2.3.2
Gere a solução inicial do Problema da Mochila tendo como critério guloso o maior elemento na
relação benefício/peso dos objetos.
Uma solução gulosa, como vimos, é simples de ser obtida mas possui alguns problemas. Para
maioria dos problemas de interesse raramente gera uma solução de qualidade por ter uma visão
míope do problema. Ou seja, no fim do procedimento acabamos tendo que inserir elementos de
pior qualidade. Outro "problema"deste tipo de geração de solução é que apenas uma solução é
gerada não importando quantas vezes se executa o método.
Como alternativa podemos usar algum método de geração aleatória. A ideia agora é a cada
passo, escolher da lista de candidatos um elemento de maneira aleatória. Em geral, as soluções
geradas por esse método são piores do que o método guloso, no entanto é uma boa alternativa
quando precisamos de gerar soluções diversas.
Uma outra forma de se gerar uma solução inicial é combinar as duas estratégias anteriores.
Neste caso a ideia é a cada passo ao invés de listarmos todos os elementos candidatos e escolhermos
o melhor ou escolher de forma aleatória, primeiro selecionamos um conjunto com os melhores
candidatos e dentre estes melhores a escolha é feita aleatoriamente. Em geral, com esta abordagem
obtemos soluções melhores do que a escolha completamente aleatória com o benefício adicional de
mantermos a diversidade.
Uma solução baseada em economias não é realizada da mesma forma para todos os problemas
de otimização. Na verdade, este método é restrito há alguns problemas em que é possível se obter
uma solução trivial de maneira simples. Para o Problema de Roteamento de Veículos podemos
ver em [2] o método conhecido como heurística de Clark e Wright. Em [6] podemos encontrar
a Heurística Esau-Williams para a geração de uma solução para o Problema da Árvore Geradora
Mínima Capacitada. Mais recentemente [10] apresentaram uma heurística baseada em economias
para gerar soluções iniciais para o Problema Instalação de Concentradores Com Alocação Simples.

2.4 Busca Local


A Busca Local é um procedimento que visa, através de modificações sistemáticas, melhorar a
solução de um problema.
14 Capítulo 2. Métodos Heurísticos

A partir da definição da representação computacional de um problema podemos definir como


podemos modificar uma dada solução para chegar a uma nova solução. A esse procedimento
chamamos de ’movimento’.
Definição 2.4.1 Denomina-se movimento a uma modificação m que transforma uma solução s em
outra, s′ , que esteja em sua vizinhança:

s′ ← s ⊕ m

Seja N uma função que associa a cada solução s ∈ S, sua vizinhança N(s) ⊆ S. Qualquer
solução s′ obtida a partir de s com um ’movimento’ é chamada vizinha de s.
O movimento introduz uma noção de proximidade entre as soluções em S. Duas soluções
podem ser vizinhas ou não. Uma solução s é um ótimo local se f (s) é melhor ou igual a todo
f (s′ ) : s′ ∈ N(s). Uma solução s é um ótimo global se f (s) é melhor ou igual a todo f (s′ ) : s′ ∈ S.
A Busca Local se baseia na noção de vizinhança. Seja S o espaço de pesquisa de um problema
de otimização e f a função objetivo a otimizar (minimizar ou maximizar), seja s uma solução
qualquer do problema, isto é, s ∈ S, a busca local consiste em encontrar uma solução s′ , dentro da
vizinhança de s, que seja melhor que s. Em geral, a busca termina quando nenhum vizinho de s seja
melhor que ele, o que caracteriza que um ótimo local foi obtido.
De maneira simplificada, podemos definir o mecanismo de funcionamento de uma busca local
como: Partir de uma solução inicial qualquer; Caminhar, a cada iteração, de vizinho para vizinho
de acordo com a definição de vizinhança adotada, tentando melhorar a solução construída; Parar
quando não existir nenhum vizinho que seja melhor à solução atual.
Exercício 2.4.1
Dado um conjunto com n produtos que devem ser levados em uma mochila. Cada produto tem um
valor Vi e um peso Pi . A mochila tem capacidade C. O problema consiste em levar os produtos
buscando maximizar o valor sem, no entanto, ultrapassar a capacidade da mochila.
Seja n = 4 e dado que: P = {4, 10, 8, 5}; V = {5, 7, 8, 6} e C = 18
a) Dada a solução s = {0, 1, 0, 1} identificar o conjunto N(s), tal que o movimento seja a
mudança de um bit;
b) Existe vizinho melhor que s?
Uma coisa importante a se notar é que o movimento pode variar de problema para problema
e pode variar até mesmo para o mesmo problema. Para o Problema da Mochila, por exemplo,
poderíamos escolher utilizar como movimento a troca de um produto que está na mochila por outro
que não está. Repare agora que a vizinhança muda e que neste caso não há variação na quantidade
de objetos que já estão na solução. Ou seja, a escolha deste movimento impede que muitas soluções
sejam encontradas. Isso é uma situação recorrente em problemas mais complexos e a escolha do
movimento é crucial para um bom desempenho de uma busca local.

2.4.1 Busca em Regiões inviáveis


Em alguns problemas é comum que se permita que a busca local possa realizar movimentos em
regiões inviáveis. Por exemplo, podemos gerar uma solução inicial de maneira aleatória e esta
ser inviável e neste caso poderíamos inviabilizar a aplicação da busca local. A pergunta é: como
devemos proceder para que isso seja feito?
Uma maneira simples é criar uma penalização que será ativada na função objetivo toda vez que
a solução for inviável. O ideal é que a penalidade seja maior quanto maior seja a inviabilidade.
Voltando ao exemplo do Problema da Mochila: seja s[i] = 1, se leva o objeto e s[i] = 0, caso
contrário:
• A função objetivo é normal é dada por ∑ni=1 b[i] ∗ s[i].
Se permitirmos que se caminhe em regiões inviáveis podemos adotar:
2.4 Busca Local 15

• ∑ni=1 b[i] ∗ s[i] − α × MAX(0, ∑ni=1 p[i] ∗ s[i] −CAP)


• α é a penalização por violar a capacidade da mochila
• O valor da penalização deve ser alto o suficiente para impedir que a solução final seja inviável

2.4.2 Tipos de Busca


Podemos executar uma busca local em um problema de três maneiras:
1 Busca Completa (Best Improvement)
2 Primeiro de Melhora (First Improvement)
3 Busca Randômica (Random Improvement)
Na busca completa, em cada passo devemos verificar todos os vizinhos de uma solução antes
de tomar a decisão se iremos alterar ou não a solução corrente. Ao fim do passo, verificamos se o
melhor vizinho é melhor que a solução corrente, se sim adotamos o melhor vizinho como solução
corrente e repetimos o processo. Caso não haja um vizinho melhor que a solução corrente estamos,
então, diante de um ótimo local.
Na busca em que usamos o Primeiro de Melhora a diferença para o método anterior é que ao
identificarmos o primeiro vizinho que seja melhor que a solução corrente interrompemos a busca e
já atualizamos a solução corrente reiniciando a busca a partir desta nova solução. Nesta variação o
número de vezes que analisamos toda vizinhança de uma solução tende a ser menor. Geralmente
usamos esta variação quando o número de vizinhos de uma solução é muito grande e há um grande
esforço computacional para realizar essa análise. O método é interrompido quando analisamos
todos os vizinhos e nenhum apresenta melhora, caracterizando um ótimo local.
Na Busca Randômica cada vizinho de uma solução corrente é analisado aleatoriamente. Caso
a solução encontrada seja melhor que a corrente alteramos a solução corrente e prosseguimos na
busca. Nesta variação é ideal criarmos maneiras de não repetir vizinhos analisados ou de criarmos
mecanismos para interromper a busca.
Não há entre os três métodos um que seja melhor que outro em todas as situações ou todos os
problemas encontrados. É necessário que testes sejam feitos para que possamos definir qual busca
se adequa melhor a cada situação.
3. Metaheurísticas baseadas em Buscas Locais

Em geral, quando construímos uma heurística estamos interessados em resolver um problema


específico e dificilmente essa heurística tem um caráter geral que irá funcionar para todo tipo de
problema. Exemplos disso podemos ver nas heurísticas clássicas para geração de soluções iniciais
apresentadas na Seção 2.3. Além disso, um problema comum nas heurísticas é que ao se deparar
com um ótimo local, por pior que seja, o procedimento é interrompido, muitas vezes retornando
soluções distantes da solução ótima globalmente.
O termo metaheurística combina o prefixo grego meta (superior, nível superior) com o termo
heurística (descobrir, encontrar). A ideia é que as metaheurísticas atuam em um nível superior
guiando uma heurística específica para resolver um problema. Em geral, as metaheuríscas possuem
um caráter geral, podendo ser adaptadas para a resolução de qualquer problema. Uma característica
que tem feito que enormes esforços tenham sido dispendidos no desenvolvimento das metaheu-
rísticas nas últimas décadas é a capacidade destes métodos de escaparem de ótimos locais. No
entanto, como uma heurística qualquer, uma metaheurística não é capaz de garantir que a solução
encontrada seja um ótimo global. Mas a aplicação de tais métodos tem sido importante pois muitos
dos problemas de interesse são intratáveis através de métodos exatos.
Como dito anteriormente, as metaheuríscas possuem mecanismos para escapar de ótimos locais
e basicamente se diferenciam entre si basicamente pelo mecanismo usado. De maneira simples,
podemos dividir esses mecanismos de busca por soluções em duas categorias:
1 - Mecanismo baseado em Busca Local
2 - Mecanismo baseado em Busca Populacional
As próximas seções serão dedicadas a apresentar algumas metaheurísticas que usam buscas
locais para escapar de ótimos locais.

3.1 Multi-Start
Em geral, uma heurística de busca local parte de uma solução inicial e após uma busca retorna
uma solução que é um ótimo local. Veja que, se construírmos uma solução de maneira gulosa a
solução inicial será sempre a mesma e não importa quantas vezes executarmos esse procedimento,
chegaremos sempre à mesma solução final.
3.2 GRASP 17

Uma maneira simples de obter ótimos locais diferentes, ou seja, de escaparmos de um ótimo
local, é gerar soluções aleatórias e aplicar uma busca local. A este método damos o nome de
Multi-Start que como o próprio nome diz gera múltiplas soluções iniciais de maneira aleatória e a
elas aplica uma busca.

Figura 3.1: Pseudocódigo do Multi-Start

A Figura 3.1 apresenta o pseudocódigo da metaheurística Multi-Start para um problema de


minimização. Vejam que com o que vimos até o momento é possível construir facilmente uma
implementação desta metaheurística. Basta termos um método que gere soluções aleatórias (Linha
3) e um método que faça uma busca local (Linha4). A diferença do que vimos até o momento é
que agora iremos trabalhar com duas soluções. Uma solução s∗ que representa a melhor solução
encontrada em todas as iterações e uma solução s que representa a solução corrente em cada
iteração. Repare que toda vez que encontrarmos um ótimo local melhor que o ótimo local s∗ este é
atualizado (Linhas 6 a 9).

3.2 GRASP
A metaheurística GRASP (Greedy Randomized Adaptive Search) foi proposta por Feo e Resende
[7] e tem sido aplicada para a resolução de vários problemas de Otimização Combinatória (veja [14]
e [13]). GRASP é um método iterativo onde cada iteração é composta de duas etapas: construção
de uma solução e busca local. A fase de construção do GRASP é iterativa, gulosa, randômica
e adaptativa. Ela é iterativa porque constrói uma solução elemento a elemento e é adaptativa,
pois a escolha do próximo elemento da solução parcial é influenciada pelas escolhas anteriores.
Para a seleção do próximo elemento da solução parcial, a princípio todos os candidatos são
considerados, contudo o número de candidatos pode em muitos casos ser extremamente elevado,
por isso, normalmente, é considerada apenas uma lista restrita de candidatos (LRC). Em geral
essa LRC é composta pelos melhores candidatos disponíveis, isso define a parte gulosa do método.
Dentre os melhores elementos presentes na LRC um é escolhido de maneira aleatória.
A LRC é construída da seguinte forma:
• Calcula o item de menor valor para a função objetivo (Min);
• Calcula o item de maior valor para a função objetivo (Max);
18 Capítulo 3. Metaheurísticas baseadas em Buscas Locais

• Se o problema é de minimização: Colocar na LRC elementos variando de Min até Min +


α(Max − Min)
• Se o problema é de maxização: Colocar na LRC elementos variando de Max até Max −
α(Max − Min)
O parâmetro α define o nível de aleatoriedade do método. Se α = 0 o método gera uma solução
gulosa, se α = 1 o método gera uma solução completamente aleatória.
Ao escolher um elemento para entrar na solução ele deve ser retirado da lista. Em alguns
problemas, como no Problema da Mochila, a lista deve ser atualizada se o elemento que fornece o
valor máximo ou mínimo for escolhido. Em alguns problemas a lista deve ser atualizada a cada
iteração (Exemplo: Caixeiro viajante). O procedimento para até que a lista seja vazia ou se tenha
uma solução viável ou algum critério predeterminado seja atendido (a depender do problema).
A exploração do espaço de soluções é feita por meio de movimentos aplicados sobre a solução
corrente, gerando outra solução promissora em sua vizinhança. Em muitos trabalhos podemos
encontrar a aplicação de métodos híbridos, onde a busca local do GRASP é feita por outra metaheu-
rística como:
• Busca Tabu
• Simulated Annealing
• VND

Figura 3.2: Pseudocódigo do GRASP

A Figura 3.2 apresenta o pseudocódigo do GRASP. Repare que o método é muito próximo do
Multi-Start apresentado na Seção anterior. A diferença básica entre os dois métodos é na geração da
solução inicial. No GRASP a função de geração de soluções recebe o critério guloso para classificar
os elementos candidatos a entrar na solução e o al pha. Se fazemos α = 1 temos na verdade o
Multi-Start, onde a solução inicial é aleatória.

3.3 Simulated Annealing


A metaheurística Simulated Annealing (SA) foi proposta por Kirkpatrick et al. (1983) [17], o qual
teve como base o procedimento proposto por Metropolos et al. em 1953 [15].
3.3 Simulated Annealing 19

Em física de matéria condensada, recozimento (Annealing) é conhecido como um processo


térmico para obter estados de baixa energia de um sólido em uma caldeira. Este processo se divide
em dois estágios:
• Aumento da temperatura da caldeira até um valor máximo para o qual o sólido derreta;
• Diminuição cuidadosa da temperatura até que as partículas se arranjem no estado de mínima
energia do sólido.
Na fase líquida as partículas se arranjam aleatoriamente. No estado de mínima energia as
partículas formam uma rede altamente estruturada. O estado de mínima energia é alcançado
somente se a temperatura máxima for suficientemente alta e o resfriamento for suficientemente
lento.
O algoritmo de Metropolis visa simular a evolução de um sólido em uma caldeira na direção do
equilíbrio térmico. Baseado na técnica de Monte Carlo o algoritmo funciona da seguinte maneira:
• Dado um estado atual i do sólido com energia Ei , um novo estado j é gerado a partir de uma
perturbação (deslocamento de uma partícula)
• A energia do próximo estado é E j
• Se a diferença de energia, ∆ = E j − Ei , é menor ou igual a zero, o novo estado é aceito como
estado atual
• Senão, o novo estado é aceito com uma certa probabilidade
Utilizando a ideia contida no algoritmo de Metropolis o SA simula o processo de recozimento
de metais tendo em conta que:
• Resfriamento rápido conduz a produtos meta-estáveis, de maior energia interna;
• Resfriamento lento conduz a produtos mais estáveis, estruturalmente fortes, de menor energia;
• A esse processo cuidadoso de resfriamento dá-se o nome de ’annealing’;
• Durante o recozimento o material passa por vários estados possíveis
Os estados possíveis de um metal correspondem às soluções do espaço de busca. A energia
em cada estado corresponde ao valor da função objetivo. A energia mínima (se o problema for de
minimização ou máxima, se de maximização) corresponde ao valor de uma solução ótima local,
possivelmente global.
A cada iteração do método, um novo estado é gerado a partir do estado corrente por uma
modificação aleatória (movimento aleatório). Se o novo estado é de energia menor (minimização)
que o estado corrente, esse novo estado passa a ser o estado corrente. Se o novo estado tem uma
energia maior que o estado corrente em ∆ unidades, a probabilidade de se mudar do estado corrente
para o novo estado é: e−∆/T , onde T = temperatura corrente. Este procedimento é repetido até se
atingir o equilíbrio térmico (passo de Metropolis).
A Figura 3.3 foi construída considerando Delta = 1. Podemos perceber que conforme a
temperatura aumenta a probabilidade de se aceitar soluções piores se aproxima de 100%. A altas
temperaturas, cada estado tem (praticamente) a mesma chance de ser o estado corrente. A baixas
temperaturas, somente estados com baixa energia têm alta probabilidade de se tornar o estado
corrente.
Dessa forma, no início do processo, a temperatura é elevada e a probabilidade de se aceitar
soluções de piora é maior. As soluções de piora são aceitas para escapar de ótimos locais.
Atingido o equilíbrio térmico em uma dada temperatura, esta é diminuída e aplica-se novamente
o passo de Metropolis. O método termina quando a temperatura se aproxima de zero.
No final do processo, praticamente não se aceita movimentos de piora e o método se comporta
como o método clássico de busca local. O final do processo se dá quando a temperatura se aproxima
de zero e nenhuma solução de piora é mais aceita, evidenciando o encontro de um ótimo local.
A Figura 3.4 apresenta o pseudocódigo do método. No início do processo temos dois loops
(linhas 3 e 4). O primeiro define a execução em uma mesma temperatura (parâmetro T ). O segundo
determina quantas iterações serão realizadas em uma mesma temperatura (parâmetro SAmax). A
20 Capítulo 3. Metaheurísticas baseadas em Buscas Locais

Figura 3.3: Probabilidade de aceitar uma solução pior em função da temperatura

cada iteração um vizinho aleatório é gerado e verificado. Ao fim do primeiro loop a temperatura é
resfriada de acordo com o parâmetro α. O parâmetro α varia entre 0 e 1. Quanto mais próximo
de 1 mais lento é o resfriamento. Os melhores valores para os parâmetros devem ser ajustados ao
problema tratado.
Exercício 3.3.1

• Considerando o valor de ∆ = 1, construa um gráfico em python calculando o valor de e−∆/T


para a Temperatura variando entre (0∗ , 100).
• Temperatura variando de 1 em 1.
• Sugestão: quando temperatura = 0, usar 0.01 na equação.
Exercício 3.3.2
Considerando o exemplo do Problema da Mochila, construa um procedimento que utilizando o
movimento de troca de um bit e dada uma solução qualquer gere um vizinho aleatório

3.4 Busca Tabu (Tabu Search)


A Busta Tabu (BT) surgiu como um método para guiar uma heurística de busca local tradicional
(de subida ou descida) na exploração do espaçço de soluções além da otimalidade local. A origem
do método vem dos trabalhos independentes de Glover (1986) [8] e Hansen (1986) [12].
De acordo com Souza et al. (2002) [18] de forma semelhante ao método Simulated Annealing,
Busca Tabu é um procedimento de otimização local que admite soluções de piora. Em sua forma
clássica, a cada iteração procura-se um ótimo local selecionando-se o melhor vizinho s′ de um
subconjunto V da vizinhança N(s) da solução corrente s. Independentemente de f (s′ ) ser melhor
ou pior que f (s), s′ será sempre a nova solução corrente. Entretanto, apenas esse mecanismo
3.4 Busca Tabu (Tabu Search) 21

Figura 3.4: Pseudocódigo do Simulated Annealing


22 Capítulo 3. Metaheurísticas baseadas em Buscas Locais

não é suficiente para escapar de ótimos locais, uma vez que pode haver retorno a uma solução
previamente gerada. Para evitar isso, o algoritmo usa o conceito de lista tabu. Esta lista define
todos os movimentos que têm um certo atributo como sendo tabu por um determinado número de
iterações, conhecido como ’tempo tabu’. Tais movimentos são proibidos a menos que a solução
satisfaça a um certo critério de aspiração A, em geral que essa solução seja melhor que a melhor
solução encontrada até então. Os atributos são escolhidos para prevenir o retorno a soluções
visitadas recentemente e são escolhidos por características que são fáceis para detectar.
Assim, além dos mecanismos tradicionais existentes em uma busca local devemos também
criar uma memória de curto prazo para armazenar as regras de proibição (lista Tabu), o número
de iterações que um atributo selecionado permanece tabu e um critério de aspiração. A Figura 3.5
apresenta o pseudocódigo do algoritmo Busca Tabu com o critério de aspiração por objetivo.

Figura 3.5: Pseudocódigo da Busca Tabu

Em geral, o BT usa como critério de parada o número de iterações sem melhora da melhor
solução (BTmax). Diferentemente da Busca Local convencional, na linha 7 a BT utiliza o melhor
vizinho que não esteja na lista tabu ou que esteja mas atenda ao critério de aspiração. Na linha 8 a
lista é atualizada, ou seja, insere um novo atributo na lista e retira os atributos que já estiveram na
lista por um número determinado de iterações. O resto do algoritmo tem o mesmo funcionamento
de uma busca local.

Exercício 3.4.1

1. Criar uma lista e inserir os elementos [0, 2, 4, 6, 8];


2. Crie um procedimento que verifique se um elemento está na lista e imprima ’Está’ ou ’Não
está’;
3. Use o procedimento para verificar se o 4 está na lista;
4. Retire os 3 primeiros objetos da lista e verifique novamente;
5. Insira o elemento 5 e depois verifique se ele está na lista.
3.5 Descida em Vizinhança Variável (Variable Neighborhood Descent) 23

3.5 Descida em Vizinhança Variável (Variable Neighborhood Descent )


O Método de Descida em Vizinhança Variável (Variable Neighborhood Descent, VND) (Mladenovic
e Hansen (1997) [16] ) é um método de busca local que consiste em explorar o espaço de soluções
através de trocas sistemáticas de estruturas de vizinhança, aceitando somente soluções de melhora
da solução corrente e retornando à primeira estrutura quando uma solução melhor é encontrada. O
pseudocódigo desse algoritmo é apresentado pela Figura 3.6.
A ideia do método se baseia no fato de que o ótimo local para uma determinada vizinhança
pode não ser um ótimo local para uma outra vizinhança. Sendo assim, o método aplica uma Busca
Local na primeira estrutura de vizinhança, em geral se começa pelas mais simples, e quando o
ótimo local é encontrado o método troca de vizinhança. Caso haja melhora em alguma vizinhança
a busca é retomada na primeira vizinhança, caso contrário o procedimento caminha em direção a
última vizinhança. Ao final o método retorna a melhor solução obtida que será um ótimo local para
todas as estruturas de vizinhanças apresentadas.

Figura 3.6: Pseudocódigo do VND

3.6 Busca em Vizinhança Variável (Variable Neighborhood Search)


Contrariamente a outras metaheurísticas baseadas em métodos de busca local, a Busca em Vizi-
nhança Variável (Variable Neighborhood Search - VNS) não segue uma trajetória, mas sim explora
vizinhanças gradativamente mais “distantes” da solução corrente e focaliza a busca em torno de
uma nova solução se e somente se um movimento de melhora é realizado. O método inclui, também,
um procedimento de busca local a ser aplicado sobre a solução corrente. Esta rotina de busca local
também pode usar diferentes estruturas de vizinhança. O pseudocódigo do algoritmo é apresentado
pela Figura 3.7. Detalhes adicionais desse algoritmo podem ser encontrados em Mladenovic e
Hansen (1997) [16].
O método tem semelhanças com o VND apresentado na Seção anterior. Mas em sua forma
clássica a Busca Local é feita sempre na mesma estrutura de vizinhança. Mas a cada iteração, antes
da aplicação da busca um vizinho aleatório da solução corrente é gerado e só após isso a busca
é aplicada. A ideia deste vizinho aleatório é gerar uma perturbação na solução corrente com o
24 Capítulo 3. Metaheurísticas baseadas em Buscas Locais

objetivo de se escapar de um ótimo local. Em geral, se começa com vizinhanças mais simples e
caso a solução não melhore geramos um vizinho através de movimentos mais complexos.

Figura 3.7: Pseudocódigo do VNS

3.7 Busca Local Iterada (Iterated Local Search)


Apresentada na tese de Stützle em 1998 [19] a Busca Local Iterada (Iterated Local Search - ILS))
apresenta semelhanças com o VNS apresentado na Seção anterior. A ideia aqui, também, é perturbar
uma solução, que em geral é um ótimo local, e aplicar uma Busca Local a seguir. A diferença
principal é que no ILS podemos optar por perturbar a melhor solução até o momento ou em
uma solução corrente qualquer. Repare que ao insistir em se perturbar a melhor solução estamos
intensificando a busca em uma determinada localidade. Caso a opção seja por perturbar uma
solução corrente que não seja a melhor até o momento a opção é pela diversificação.
A Figura 3.8 apresenta o peseudocódigo do ILS. Veja que a diferença deste método para
outros que já vimos está nas linhas 11 e 12. Na linha 11 devemos decidir se optaremos pela
intensificação ou pela diversificação. Na linha 12 a solução é perturbada. Essa perturbação pode
ser um movimento aleatório como feito no VNS. Em geral, caso não se melhore em um número
determinado de iterações a perturbação pode ser aumentada para que se escape do ótimo local.
3.7 Busca Local Iterada (Iterated Local Search) 25

Figura 3.8: Pseudocódigo do ILS


4. Metaheurísticas baseadas em Buscas Populacio

Até então, tratamos de metaheurísticas que usam mecanismos de buscas locais para escapar dos
ótimos locais dos problemas. Nesta e nas próximas seções iremos tratar de métodos que utilizam
buscas populacionais, sendo a primeira delas o Algoritmo Genético (AG).

4.1 Algoritmos Genéticos


O AG é uma metaheurística que se fundamenta em uma analogia com processos naturais de
evolução, nos quais, dada uma população, os indivíduos com características genéticas melhores têm
maiores chances de sobrevivência e de produzirem filhos cada vez mais aptos, enquanto indivíduos
menos aptos tendem a desaparecer. De acordo com Goldberg [9] o método foi proposto por John
Holland nos anos 70.
Neste método cada cromossomo (indivíduo da população) está associado a uma solução do
problema e cada gene está associado a uma componente da solução. Um alelo, por sua vez, está
associado a um possível valor que cada componente da solução pode assumir. Um mecanismo
de reprodução, baseado em processos evolutivos, é aplicado sobre a população com o objetivo
de explorar o espaço de busca e encontrar melhores soluções para o problema. Cada indivíduo é
avaliado por uma certa função de aptidão, a qual mensura seu grau de adaptação ao meio. Quanto
maior o valor da função de aptidão, mais o indivíduo está adaptado ao meio e maior é chance de
sobreviver e gerar descendentes.
A busca através do AG se inicia com uma população inicial, em geral gerada aleatoriamente,
{s1 , s02 , . . . , s0n } com n indivíduos no tempo 0. Em cada iteração a população do tempo t é submetida
0

a um processo de reprodução e os filhos gerados são submetidos ou não a um processo de mutação.


Ao fim da iteração o método define os indivíduos que irão fazer parte da população no tempo t + 1
e quais serão descartados.
O processo de reprodução ou cruzamento tem como objetivo recombinar 2 ou mais soluções,
a que chamamos de pais, afim de gerar soluções, filhos, com caracteríscas de cada um dos pais
envolvidos no processo. Um método se diferencia do outro pela maneira como escolhe os pais, ou
como recombina os pais para gerar os filhos.
4.2 Colônia de Formigas (Ant Colony) 27

Na fase de mutação uma porcentagem, geralmente baixa, dos filhos é selecionada para sofrer
alguma modificação que não é herdada de nenhum dos pais, por isso o nome mutação.
Ao final do processo de cruzamente e mutação temos uma população com os pais e os filhos,
em geral de tamanaho 2n. Dessa forma, devemos selecionar quem irá para a próxima geração. Uma
maneira simples é escolher os n melhores indivíduos, mas isso pode fazer o método convergir para
um ótimo local de baixa qualidade. Assim, é importante criar mecanismos que garantam que a
população terá diversidade. A Figura 4.1 apresenta o pseudocódigo do AG.

Figura 4.1: Pseudocódigo do Algoritmo Genético

4.2 Colônia de Formigas (Ant Colony)


Em geral, as formigas seguem o menor caminho entre o formigueiro e sua fonte de alimento.
Enquanto andam, as formigas depositam no solo uma substância chamada feromônio. Na presença
de feromônio, elas possuem certa tendência a seguir o caminho marcado. Essa tendência é baseada
na quantidade de feromônio presente em cada caminho: quanto maior concentração, maior a chance
da trilha ser seguida.
Na Figura 4.2 parte (a) vemos uma formiga caminhando aleatoriamente até uma fonte de
alimento. Ao longo do tempo várias formigas irão por caminhos aleatórios até a mesma fonte,
parte (b). Conforme o tempo passa, o caminho de menor tamanho acaba concentrando a maior
quantidade de feromônio e praticamente todas as formigas irão fazer o mesmo caminho como
podemos ver na parte (c).
O Algoritmo Colônia de Formigas, em inglês Ant Colony (ACO), se inspira em uma colônia
de formigas real para resolver problemas de otimização. O método funciona como uma busca
construtiva, no qual as formigas cooperam entre si fornecendo informações sobre o problema.
A cada iteração, cada formiga, individualmente, constrói uma solução para o problema. A
construção é probabilística, guiada por uma memória compartilhada pelas formigas nas iterações
anteriores e por eventuais informações heurísticas do problema. A memória é a trilha artificial de
feromônio. As informações heurísticas, que em geral são fixas, indicam a conveniência, para a
obtenção da solução do problema, de se tomar determinado caminho. A quantidade de feromônio
(variável), que indica quão desejável é um determinado caminho.
O método foi desenvolvido para resolver o Problema do Caixeiro Viajante [4] e passou por
diversas modificações para redução da complexidade e extensão a outros problemas. A Figura 4.3
apresenta o pseudocódigo do algoritmo ACO.
28 Capítulo 4. Metaheurísticas baseadas em Buscas Populacionais

Figura 4.2: Caminho feito por um conjunto de formigas - Fonte: [11]

Dorigo e Stützle [5] distinguem seis passos, sendo os quatro primeiros cruciais para o bom
funcionamento do ACO:
1. Representar o problema usando conjunto de componentes e transições, ou um grafo onde as
formigas irão operar
2. Definir o que será a trilha de feromônio
3. Definir o que será a informação heurística, associada ao problema, que afetará a decisão das
formigas
4. Sempre que possível, implementar uma busca local eficiente para o problema
5. Escolher/Adaptar algoritmos já existentes para o problema
6. Ajustar os parâmetros de acordo com aplicações similares já feitas previamente

4.3 Algoritmo Clonal Imunológico


A imunologia é o ramo da biologia responsável pelo estudo das reações que conferem resistência
às doenças. A origem desta ciência é atribuída a Edward Jenner que, em 1796, descobriu que a
vacínia* induzia a proteção contra varíola (*Agente infeccioso da varíola bovina). No sistema
imunológico existem duas linhas de defesa: Sistema Imune Inato e Sistema Imune Adaptativo.
O sistema imune inato é a primeira linha de defesa, disponível desde o nascimento. Quando
uma célula do sistema imune inato reconhece um patógeno, uma resposta imunológica é ativada.
Além disso, o sistema imune inato envia sinais estimuladores ao sistema imune adaptativo.
Um agente Patogênico pode ser um microorganismo como bactérias, vírus, fungos, protozoários,
helmintos e alguns tipos de vermes. Os agentes patogênicos são capazes de produzir doenças
infecciosas aos seus hospedeiros, sempre que estejam em circunstâncias favoráveis, inclusive do
meio ambiente. O agente patogênico pode se multiplicar no organismo do seu hospedeiro podendo
causar infecção e outras complicações.
4.3 Algoritmo Clonal Imunológico 29

Figura 4.3: Pseudocódigo do Algoritmo Colônia de Formigas

Um antígeno é toda molécula capaz de iniciar uma resposta imune, a qual começa pelo
reconhecimento pelos linfócitos e cumula com a produção de um anticorpo específico.
As células existentes no sistema imunológico (inato e adaptativo) possuem moléculas capazes
de reconhecer antígenos, conforme Figura 4.4.

Figura 4.4: Processo de reconhecimento dos antígenos

O sistema inato se adapta aos antígenos produzindo anticorpos específicos a um determinado


agente infeccioso. Essa produção, exemplificada na Figura 4.5, se baseia em alguns princípios
listados a seguir:
• Geração de diversidade (a partir de bibliotecas de genes, as células-B produzem anticorpos,
combinando aleatoriamente estes genes);
• Proliferação de anticorpos (as células- B que reconhecem o antígeno são proliferadas –
clonadas por sucessivas mitoses);
• Seleção por afinidade (maior afinidade, maior o número de clones das células-B );
• Esta proliferação resultará em células filhas (clones) que poderão sofrer mutação;
• Maturação de afinidade (mutação com taxa inversamente proporcional à afinidade);
30 Capítulo 4. Metaheurísticas baseadas em Buscas Populacionais

• Memória (algumas células-B são convertidas em células de memória com maior tempo de
vida)

Figura 4.5: Reprodução Clonal

A partir das ideias dos sistemas imunológicos reais foram desenvolvidos os sistemas imu-
nológicos artificiais. Estes sistemas Apareceram na década de 1990 como um novo paradigma
computacional inicialmente com as seguintes aplicações:
• Detecção de anomalias
• Reconhecimento de padrões
• Mineração de dados
• Segurança de computadores
• Detecção de falhas
A primeira aplicação em otimização foi proposta em 2002 por de Castro e Von Zuben [3].
O algoritmo, chamado CLONALG, utiliza os princípios de seleção clonal e maturação de afi-
nidade como os principais mecanismos para manipular uma população de soluções candidatas,
denominadas anticorpos.
As características importantes para o desenvolvimento de um bom algoritmo clonal imunológico
são:
• A taxa de proliferação de cada célula imune é proporcional à sua afinidade em relação
ao antígeno selecionado: quanto maior a afinidade, maior o número de clones gerados; e
vice-versa
• A mutação sofrida por cada célula imune durante a reprodução é inversamente proporcional
à afinidade do receptor da célula com o antígeno: quanto maior a afinidade, menor a taxa de
mutação e vice-versa
O pseudocódigo do Algoritmo Clonal Imunológico é apresentado na Figura 4.6. A geração
de soluções é realizada com aleatoriedade nas linhas 1 e 7. A seleção dos n melhores soluções,
linha 3, é feita com base na função objetivo. Na reprodução os melhores pais geram mais clones. A
hipermutação, linha 5, ocorre de maneira que os melhores clones mutam menos. Novas soluções
4.3 Algoritmo Clonal Imunológico 31

geradas para manter a diversidade.

Figura 4.6: Pseudocódigo do Algoritmo Clonal Imunológico


Referências

1 ARROYO, J. E. C. et al. Heurísticas e metaheurísticas para otimização combinatória


multiobjetivo. Repositório da Produção Científica e Intelectual da Unicamp, p. 3–20, 2002.
2 CLARKE, G.; WRIGHT, J. Scheduling of Vehicle Routing Problem from a Central Depot to
a Number of Delivery Points. Operations Research, v. 12, p. 568–581, 1964.
3 DE CASTRO, L. N.; VON JUBEN, F. J. Learning and optimization using the clonal selection
principle. IEEE Transactions on Evolutionary Computation, v. 6, n. 3, p. 239–251, 2002.
4 DORIGO, M.; GAMBARDELLA, L. M. Ant colonies for the traveling salesman problem.
IEEE Transactions on Evolutionary Computation, v. 1, n. 1, p. 53–66, 1997.
5 DORIGO, M.; STUTZLE, T. Ant Colony Optmization. [S.l.]: MIT Press, 2004.
6 ESAU, L.; WILLIAMS, K. On teleprocessing system design. Part II - A method for
aproximating the optimal networks. IBM System Journal, v. 5, n. 3, p. 142–147, 1964.
7 FEO, T. A.; RESENDE, M. G. C. A probabilistic heuristic for a computationally difficult set
covering problem. Operations Research Letters, v. 8, p. 67–71, 1989.
8 GLOVER, F. Future paths for integer programming and links to artificial intelligence.
Computers and Operations Research, v. 5, p. 553–549, 1986.
9 GOLDBERG, D. Genetic Algorithms in Search, Optimization and Machine Learning.
Berkeley: Addison-Wesley, 1989.
10 GOMES, B. N. et al. An Efficient Genetic Algorithm for the Design of Hub-and-Spoke
Networks. IEEE Communications Letters (Print), v. 17, p. 793–796, 2013.
11 GOSS, S. et al. Self-organized shortcuts in the Argentine ant. Naturwissenschaften, v. 76,
p. 579–581, 1989.
12 HANSEN, P. The steepest ascent mildest descent heuristic for combinatorial programming.
Proc. Congress on Numerical Methods in Combinatorial Optimization, Capri, Italy, 1986.
REFERÊNCIAS 33

13 MARTINS, A. X.; CASTRO, R. R. M.; SOUZA, M. J. F. Algoritmos Simulated Annealing e


GRASP para o planejamento de aulas de um departamento. Journal of Heuristics, v. 2,
p. 24–33, 2009.
14 MARTINS, A. X. et al. GRASP with hybrid heuristic-subproblem optimization for the
multi-level capacitated minimum spanning tree problem. Journal of Heuristics, v. 15,
p. 133–151, 2009.
15 METROPOLIS, N. et al. Equation of State Calculations by Fast Computing Machines.
Journal of Chemical Physics, v. 21, n. 1087, 1953.
16 MLADENOVIC, N.; HANSEN, P. A Variable Neighborhood Search. Computers and
Operations Research, v. 24, p. 1097–1100, 1997.
17 S. KIRKPATRICK, S.; GELATT JR, C. D.; VECCHI, M. P. Optimization by Simulated
Annealing. Science, v. 220, n. 4598, p. 671–680, mai. 1983.
18 SOUZA, M. J. F.; MARTINS, A. X.; ARAÚJO, C. R. Experiências com Simulated Annealing
e Busca Tabu na resolução do problema de alocação de salas. XXXIV Simpósio Brasileiro
de Pesquisa Operacional, Rio de Janeiro, p. 1–12, mar. 2002.
19 STÜTZLE, T. Local Search Algorithms for Combinatorial Problems Analysis,
Improvements, and New Applications. Darmstadt: PhD thesis, Darmstadt University of
Technology, Department of Computer Science, 1998.

Você também pode gostar