Anda di halaman 1dari 14

Implementao de

Otimizao Colnia de Formigas

Estfane G. M. de Lacerda

Departamento de Engenharia da Computao e Automao


UFRN
Introduo

Apresentaremos o Pseudo-Cdigo do Ant System. O cdigo pode


ser diretamente implementado em linguagens como C, Java e
Pascal. O cdigo uma adaptao do cdigo contido no livro:

M. Dorigo and T. Sttzle. Ant Colony Optimization. MIT Press.


2004.
Estruturas de Dados

real dist[n][n] // matriz distncia


real feromonio[n][n] // matriz feromnio
real info[n][n] // matriz combinando feromnio
// e informao heurstica

Comentrios:
I feromonio[i][j] contm ij ;
I dist[i][j] contm dij (a distncia entre as cidades i e j);
I info[i][j] contm (ij ) (ij ) .
Apesar de no ser necessrio, neste cdigo faremos estas
matrizes serem simtricas para facilitar a programao.
Estrutura de Dados para as Formigas
tipo_formiga = registro
real dist_percurso
real percurso[n+1]
booleano visitado[n]
fim registro

tipo_formiga formiga[m]

I Cada formiga representada por trs campos:


I dist_percurso: a distncia da viagem realizada pela formiga;
I percurso: um vetor contendo as cidades do percurso. Por
convenincia, a primeira cidade armazenada duas vezes (no
inicio e no fim do vetor);
I visitado: vetor cujo elemento i TRUE se a cidade i foi
visitada, e FALSE caso contrrio.
I Esta estrutura pode ser implementado com struct da
linguagem C
Algoritmo Principal

LeiaDadosProblema
ComputeMatrizDistancia
ComputeMatrizInfo
InicializeFormigas
InicializeParametros
enquanto (no terminar)
ConstruaSolucoes
BuscaLocal // opcional
AtualizeEstatisticas
AtualizeFeromonio
fim enquanto
Construindo as Solues (1/2)

procedimento ConstruaSolucoes
para k=1 at m
para i=1 at n
formiga(k).visitado(i) = FALSE
fim para
fim para
passo = 1
para k=1 at m
r = numero_randomico(1,n)
formiga(k).percurso(passo) = r
formiga(k).visitado(r) = TRUE
fim para
(continua)
Construindo as Solues (2/2)

(continuao)
enquanto (passo < n)
passo = passo + 1
para k=1 at m
ComputeRegraDecisao(k,passo)
fim para
fim enquanto
para k=1 at m
formiga(k).percurso(n+1) = formiga(k).percurso(1)
formiga(k).dist_percurso = ComputeDistPercurso(k)
fim para
fim procedimento ConstruaSolucoes
Computando a Regra de Deciso (1/2)

procedimento ComputeRegraDecisao(k,i)
c = formiga(k).percurso(i-1)
soma_probabilidades = 0.0
para j=1 at n
se formiga(k).visitado(j) ento
selecao_probabilidade(j) = 0
seno
selecao_probabilidade(j) = info(c,j)
soma_probabilidades = soma_probabilidades +
selecao_probabilidade(j)
fim se
fim para
(continua)
Computando a Regra de Deciso (2/2)

(continuao)
r = numero_aleatorio(0,soma_probabilidades)
j=1
p = selecao_probabilidade(j)
enquanto (p < r)
j=j+1
p = p + selecao_probabilidade(j)
fim enquanto
formiga(k).percurso(i) = j
formiga(k).visitado(j) = TRUE
fim procedimento ComputeRegraDecisao
Computando Estatsticas

procedimento AtualizeEstatisticas
para k=1 at m
se formiga(k).dist_percurso < melhor_distancia ento
copie(formiga(k).percurso, melhor_percurso)
melhor_distancia = formiga(k).dist_percurso
fim se
fim para
compute outras estatsticas
fim procedimento AtualizeEstatisticas

Notas:
I O principal objetivo deste procedimento salvar a melhor
soluo encontrada at a iterao corrente;
I O procedimento copie(a,b) copia vetor a para vetor b.
Atualizando o Feromonio (1/4)

procedimento AtualizeFeromonio
Evapore()
para k=1 at m
DepositeFeromonio(k)
fim para
ComputeMatrizInfo
fim procedimento AtualizeFeromonio
Atualizando o Feromnio (2/4)

procedimento Evapore
para i=1 at n
para j=1 at n
feromonio[i][j] = (1 ) * feromonio[i][j]
feromonio[j][i] = feromonio[i][j] // matriz simtrica
fim para
fim para
fim procedimento Evapore
Atualizando o Feromnio (3/4)

procedimento DepositeFeromonio(k)
= Q/formiga(k).dist_percurso
para i=1 at n
j = formiga(k).percurso(i)
l = formiga(k).percurso(i+1)
feromonio(j,l) = feromonio(j,l) +
feromonio(l,j) = feromonio(j,l)
fim para
fim procedimento DepositeFeromonio
Atualizando o Feromnio (3/4)

Exemplo de cdigo em scilab.

function DepositeFeromonio(k)
global FORMIGA // todas as variaveis globais
global N // so declaradas na funo
global FEROMONIO
global CONST_Q

DeltaTau = CONST_Q/FORMIGA(k).dist_percurso;
for i=1:N
j = FORMIGA(k).percurso(i);
l = FORMIGA(k).percurso(i+1);
FEROMONIO(j,l) = FEROMONIO(j,l) + DeltaTau;
FEROMONIO(l,j) = FEROMONIO(j,l);
end
endfunction

Anda mungkin juga menyukai