Você está na página 1de 1

Algoritmo A* - Prof.

Joo Alberto Fabro


Utiliza as seguintes funes:
g = funo de avaliao do custo par chegar at o n !soma dos custos da aplicao de cada regra "ue leva do
estado inicial at este n.#
h$ = funo de avaliao "ue estima o custo para se chegar deste n at o estado final. %sta funo a
respons&vel pela parte 'heur(stica) do processamento. * chamada de h$ para indicar "ue uma apro+imao da
funo de avaliao e+ata h do custo para chegar deste n at o estado final.
f$ = g , h$ - * a avaliao global de um determinado n.
E as seguintes listas:
A.%/0123 ns "ue foram gerados e sofreram a aplicao da funo heur(stica4 mas "ue ainda no foram
e+aminados!isto 4 seus sucessores ainda no foram gerados#. A.%/012 na verdade uma fila de prioridades onde
os elementos com prioridade m&+ima so a"ueles onde a avaliao tem o valor mais promissor. 0cnicas padr5es "ue
manipulam filas de prioridades podem ser utili6adas para manipular esta lista.
F%78A9123 ns "ue :& foram e+aminados. Precisamos manter tambm estes ns na memria se "uisermos
efetuar uma busca em grafo em ve6 de em &rvore4 :& "ue sempre "ue um n gerado4 precisamos verificar se ele :& foi
gerado antes !se est& em A.%/0124 ou se :& esteve em A.%/0124 e agora est& em F%78A912#.
Algoritmo:
;# 7omece com A.%/012 contendo apenas o n inicial. Atribua < ao valor de g do n4 e seu valor de h$ para "ual"uer "ue
se:a!dado pela funo heur(stica#4 e atribua f$ = g , h$ . Atribua a F%78A912 a lista va6ia.
=# At ser encontrado um n-meta4 repita o seguinte procedimento3 se no houver nenhum n em A.%/0124 reporte fracasso e
saia. 7aso contr&rio4 pegue o n de A.%/012 com menor valor de f$. /emova-o de A.%/012. 7olo"ue-o em F%78A912.
>e:a se o ?%@81/-AB um n -meta. %m caso positivo4 encerre e reporte a soluo!?%@81/-AB se tudo o "ue
"uisermos for o n4 ou o caminho "ue foi criado entre o estado inicial e ?%@81/-AB se estivermos interessados no
caminho#. 7aso contr&rio4 gere os sucessores dee ?%@81/-AB mas ainda no a:uste ?%@81/-AB para apontar para eles.
!Precisamos primeiro ver se algum deles :& foi gerado.# Para cada 2C7%221/4 faa o seguinte3
!a# A:uste 2C7%221/ para apontar de volta para ?%@81/-AB. %stas liga5es para tr&s permitiro recuperar o caminho4
uma ve6 encontrada a soluo.
!b# 7ompute g!2C7%221/# = g!?%@81/-AB# , custo de sair de ?%@81/-AB e chegar a 2C7%221/.
!c# >e:a se 2C7%221/ igual a "ual"uer n em A.%/012!isto 4 se ele :& foi gerado4 mas ainda no processado#. %m
caso positivo4 chame a"uele n de AA0DE1. Cma ve6 "ue este n :& e+iste no grafo4 podemos desconsiderar
2C7%221/ e acrescentar AA0DE1 F lista de sucessores de ?%@81/-AB. Agora precisamos decidir se a ligao com o
pai de AA0DE1 deve ser ou no rea:ustada para apontar para ?%@81/-AB. %la deve ser rea:ustada se o caminho "ue
encontramos para chegar a 2C7%221/ for mais barato "ue o atual melhor caminho at AA0DE1!:& "ue 2C7%221/ e
AA0DE1 so4 na realidade4 o mesmo n#. Portanto4 ve:a se mais barato chegar a AA0DE1 via seu pai atual ou a
2C7%221/ via ?%@81/-AB3compare os valores de g. 2e AA0DE1 for mais barato!ou se o preo for o mesmo#4 ento
no precisaremos fa6er nada. 2e 2C7%221/ for mais barato4 ento rea:uste a ligao com o pai de AA0DE14 para
apontar para ?%@81/-AB4 registre o novo caminho mais barato em g!AA0DE1# e atuali6e f$!AA0DE1#.
!d# 2e 2C7%221/ no estava em A.%/0124 ve:a se est& em F%78A912. %m caso positivo4 chame o n em F%78A912
de AA0DE1 e acrescente AA0DE1 F lista de sucessores de ?%@81/-AB. >erifi"ue se o novo caminho ou o caminho
antigo melhor4 como na etapa =!c# e a:uste corretamente a ligao com o pai e os valores de g e f$. 2e tivermos acabado
de encontrar um melhor caminho para AA0DE14 precisamos propagar a melhoria aos sucessores de AA0DE1. %sat
operao um pouco delicada. AA0DE1 aponta para seus sucessores. 7ada sucessor4 por sua ve64 aponta para seus
sucessores4 e assim por diante4 at "ue cada ramificao acabe com um n "ue ainda este:a em A.%/012 ou "ue no
tenha sucessores. Portanto4 para propagar um novo custo a todos os sucessores4 faa caminhamento em profundidade da
&rvore4 comeando em AA0DE14 mudando o valor de g em cada n !e portanto tambm o valor de f$#4 e encerrando cada
ramificao "uando encontrar um n sem sucessores ou um n para o "ual um caminho melhor ou e"uivalente :& tenha
sido encontrado!*#. %sta condio f&cil de ser verificada. A ligao de cada n com o pai aponta para o melhor pai
conhecido. Ao momento da propagao4 verifi"ue se o pai aponta para o n do "ual vocG est& vindo. 2e sim4 continue.
7aso contr&rio4 ento o valor de g :& reflete o melhor caminho do "ual ele parte. %nto a propagao pode parar por
a"ui. ?as poss(vel "ue4 com o novo valor de g sendo propagado aos sucessores4 o percurso em "ue vocG este:a torne-se
melhor do "ue o caminho atravs do pai atual. %nto compare os dois. 2e o caminho atravs do pai atual ainda for
melhor4 encerre a propagao. 2e o caminho atravs do "ual vocG est& propagando agora for melhor4 rea:uste o pai e
prossiga com a propagao.
!e# 2e 2C7%221/ no estava nem em A.%/012 nem em F%78A9124 ento colo"ue-o em A.%/012 e acrescente-o F
lista de sucessores de ?%@81/-AB. 7ompute f$!2C7%221/# = g!2C7%221/# , h$!2C7%221/#.
!*# %ssa 2egunda verificao garante "ue o algoritmo termine mesmo "ue ha:a ciclos no grafo. 2e houver um ciclo4 "uando
um dado n for visitado pela 2egunda ve64 o caminho no ser& melhor "ue na primeira ve64 portanto4 a propagao acabar&.

Você também pode gostar