Estfane G. M. de Lacerda
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]
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)
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