Este artigo não cita fontes confiáveis. Ajude a inserir referências. Conteúdo não verificável pode ser removido.—Encontre fontes: ABW  • CAPES  • Google (N • L • A) (Setembro de 2013)
O Simulated Annealing é aplicado ao problema do Caixeiro Viajante. Existem 125 nós em 5 blocos. O número de combinações possíveis é cerca de 1,5e+207.

Recozimento simulado (ou Simulated Annealing) é uma meta-heurística para otimização que consiste numa técnica de busca local probabilística, e se fundamenta numa analogia com a termodinâmica.

A metaheurística usada é uma metáfora de um processo térmico, dito recozimento ou annealing, utilizado em metalurgia para obtenção de estados de baixa energia num sólido. O processo consiste de duas etapas: na primeira, a temperatura do sólido é aumentada para um valor próximo de 1100°C, que é a temperatura de início de transformação da fase perlítica em austenita; na segunda, o resfriamento deve ser realizado lentamente até que o material se solidifique, sendo acompanhado e controlado esse arrefecimento. Nesta segunda fase, executada lentamente, os átomos que compõem o material organizam-se numa estrutura uniforme com energia mínima. Isto resulta em que os átomos desse material ganhem energia para se movimentarem livremente e, ao arrefecer de forma controlada, dar-lhes uma melhor hipótese de se organizarem numa configuração com menor energia interna, para ter uma redução dos defeitos do material, como resultado prático.

De forma análoga, o algoritmo de Arrefecimento Simulado substitui a solução atual por uma solução próxima (i.e., na sua vizinhança no espaço de soluções), escolhida de acordo com uma função objetivo e com uma variável (dita Temperatura, por analogia). Quanto maior for , maior a componente aleatória que será incluída na próxima solução escolhida. À medida que o algoritmo progride, o valor de é decrementado, começando o algoritmo a convergir para uma solução ótima, necessariamente local.

Uma das principais vantagens deste algoritmo é permitir testar soluções mais distantes da solução atual e dar mais independência do ponto inicial da pesquisa.

Descrição

Esta técnica começa sua busca a partir de uma solução inicial qualquer. O procedimento principal consiste em um loop ou laço que a cada iteração, gera aleatoriamente um único vizinho s’ da solução corrente s.

A cada geração de um novo vizinho s’ de s, é testada a variação ∆ do valor da função objetivo, isto é, ∆ = f (s’) – f (s), onde temos as seguintes situações:

A temperatura T assume inicialmente um valor elevado, . Após um número fixo de iterações (o qual representa o número de iterações para o sistema atingir o equilíbrio térmico em uma dada temperatura), a temperatura é gradativamente diminuída por uma razão de resfriamento α, tal que Tn ← α * Tn -1, sendo 0 < α < 1. Como esse procedimento se dá no início, há uma chance maior de se escapar de mínimos locais e, à medida que T se aproxima de zero, o algoritmo se comporta como o método de descida, uma vez que diminui a probabilidade de se aceitar movimentos que possa piorar (T → 0 => e-∆/T → 0).

O procedimento é finalizado quando a temperatura chega a um valor próximo de zero e nenhuma solução que piore o valor da melhor solução seja mais aceita, ou seja, quando o sistema estiver estável. A solução obtida quando o sistema encontra-se nesta situação evidencia o encontro de um mínimo local.

Algoritmos baseados em Simulated Annealing geralmente incluem reaquecimento seguido de um novo processo de resfriamento, utilizado quando a quantidade de movimentos consecutivamente rejeitados é alta. É também comum trabalhar nas temperaturas mais altas com taxa de resfriamento menor e aumentá-la quando a temperatura reduzir.

Pseudo-código

Antes de apresentar o algoritmo, vejam-se os identificadores neles utilizados:

Além dos indicadores acima, consideremos as seguintes funções:

Pseudo-Código Simulated Annealing
Inicio
/* Entradas do Algoritmo */
Ler (S0, M, P, L, α)
/* Inicialização das variáveis */
S = S0
T0 = TempInicial()
T = T0
j = 1
/*Loop principal – Verifica se foram atendidas as condições de termino do algoritmo*/
Repita

i = 1
nSucesso = 0
/*Loop Interno – Realização de perturbação em uma iteração*/
Repita
Si = Perturba(S)
∆Fi = f(Si) – f(S)
/*Teste de aceitação de uma nova solução*/
Se (∆fi ≤ 0) ou (exp(-∆fi/T) > Randomiza()) então
S= Si
nSucesso = nSucesso + 1
Fim-se
i = i + 1
Até (nSucesso ≥ L) ou (i > P)
/*Actualização da Temperatura*/
T = α.T
/*Actualização do Contador de iterações*/
j = j + 1

Até (nSucesso = 0) ou (j > M)
/*Saída do Algoritmo*/
Imprima(S)

Veja também

Este artigo sobre informática é um esboço. Você pode ajudar a Wikipédia expandindo-o.vde