@Caina também fritei a cabeça com essa resposta, mas pelo que entendi estamos com uma cabeça maio "dijkstra" para solução, na real achei que aula ficou BEEEEM vaga sobre o assunto e não teve aprofundamento necesssário para que possamos entender.
Vou mesclar o que entendi com o Gemini + NotebookLM para e ai podemos ver se fui na linha correta.
O A* combina duas coisas:
- o custo real para se mover entre os nós
- e a heurística (com o valor que atribuimos a cada nó)
Ele não escolhe um caminho apenas pela heurística. Ele usa a seguinte fórmula para decidir: f(n) = g(n) + h(n)
que está lá no comentário do código. O g(n)
é o custo real do caminho desde o nó inicial (Produto A) até o nó atual (n)
, no código, cada "passo" entre um produto e outro tem um custo de 1 (pois não temos peso atribuído na aresta). O h(n)
é a heurística, tipo o que ele vai pensar, ou seja, uma estimativa de custo do nó atual (n) até o objetivo (Produto C). No código, a heurística proposta é baseada na probabilidade de conversão. O algoritmo A* sempre vai explorar o nó que tiver o menor valor de f(n)
Ai simuland o algoritmo començando no produto A o algoritmo avalia os caminhos possíveis: ir para Prduto B ou ir direto para Produto C.
Para ir ao nó B:
* g(B) = 1 (custo real para sair de A e chegar em B, valor da aresta)
* h(B) = 8 (heurística do nó B, obs: tirei o decimal)
* f(B) = 1 + 8 = 9
Para ir ao nó C (direto):
* g(C) = 1 (custo real para sair de A e chegar em C)
* h(C) = 7 (heurística do nó C)
* f(C) = 1 + 7 = 8
Neste cenário hipotético, o algoritmo escolheria o caminho A -> C porque f(C) é 8, que é menor que f(B) que é 9. Mas lembra que a função heuristica faz uma "negativação dos valores" que faz com que escolha f(B) e ai por fim ir para f(C). Na A* tem essa heuristica que meio que funciona como uma "bússola", dando ao algoritmo uma noção de direção.
---
config:
layout: fixed
---
flowchart LR
a(("A 0.9")) o--o b(("B 0.8")) & c(("C 0.7")) & d(("D 0.6"))
b o--o c & d
c o--o d