2
respostas

Implementação Completa do Sistema A* para Recomendação de Produtos

Estrutura básica
python
class Produto:
def init(self, nome, categoria, prob_conversao):
self.nome = nome
self.categoria = categoria
self.prob_conversao = prob_conversao # 0 a 1

class AStarRecommendation:
- grafo: dicionário produto -> lista de (vizinho, custo)
- produtos: dicionário nome -> objeto Produto
Passos principais
Etapa O que faz

  1. Criar produtos Instanciar objetos com nome, categoria e probabilidade de conversão

  2. Construir grafo Conectar produtos entre si (grafo completo)

  3. Heurística h = 1 - prob_conversao (quanto maior a conversão, menor o h)

  4. Algoritmo A* Encontra o melhor caminho entre dois produtos
    Código essencial do A*
    python
    def encontrar_melhor_caminho(self, inicio, objetivo):
    fronteira = [(0, inicio)] # (custo_estimado, produto)
    custo_ate_agora = {inicio: 0}
    caminho = {inicio: None}

    while fronteira:
    produto_atual = heapq.heappop(fronteira)[1]

    if produto_atual == objetivo:
    return reconstruir_caminho(caminho, inicio, objetivo)

    for vizinho, custo in self.grafo[produto_atual]:
    novo_custo = custo_ate_agora[produto_atual] + custo
    if vizinho not in custo_ate_agora or novo_custo < custo_ate_agora[vizinho]:
    custo_ate_agora[vizinho] = novo_custo
    caminho[vizinho] = produto_atual
    estimativa = novo_custo + self.heuristica(vizinho, objetivo)
    heapq.heappush(fronteira, (estimativa, vizinho))

Exemplo de uso
python
sistema = AStarRecommendation()

Adicionar produtos

sistema.adicionar_produto(Produto("iPhone", "Eletrônicos", 0.75))
sistema.adicionar_produto(Produto("Fone Bluetooth", "Acessórios", 0.60))

Conectar produtos

sistema.conectar_todos()

Encontrar caminho

caminho = sistema.encontrar_melhor_caminho("iPhone", "Fone Bluetooth")

Saída: ['iPhone', 'Fone Bluetooth']

Resumo visual do funcionamento
text
Produto A (h=0.25) ----custo----> Produto B (h=0.30)
│ │
└────────── A* ────────────────────┘

f(n) = g(n) + h(n)
Onde: g = custo real | h = 1 - prob_conversao
Principais vantagens
✅ Busca informada (heurística guia o caminho)
✅ Produtos com alta conversão são priorizados
✅ Encontra o caminho mais curto/eficiente
✅ Permite personalização por usuário

2 respostas

Olá, Marcus. Como vai?

Excelente contribuição! É fascinante ver a aplicação de um algoritmo clássico de busca, como o A*, em um contexto moderno de sistemas de recomendação. Sua abordagem de transformar a probabilidade de conversão em uma heurística é muito inteligente, pois inverte a lógica de "sucesso" para uma métrica de "custo" que o algoritmo consegue otimizar.

Para complementar sua explicação técnica, vale ressaltar por que a escolha da função $f(n) = g(n) + h(n)$ é tão poderosa nesse cenário:

  • O Custo Real $g(n)$: Representa o esforço ou a distância entre os produtos (pode ser baseado em similaridade de categorias ou preço).
  • A Heurística $h(n)$: Ao usar $1 - prob_conversao$, você garante que o algoritmo seja atraído por produtos com maior potencial de fechamento de venda, funcionando como um "ímã" para a conversão.

Uma sugestão interessante para quem for replicar seu código é garantir que a heurística seja admissível. No contexto do A*, isso significa que $h(n)$ nunca deve superestimar o custo real para chegar ao objetivo. No seu caso, como as probabilidades estão entre 0 e 1, a lógica se mantém sólida e consistente.

Caso os alunos queiram expandir seu exemplo, uma implementação prática de reconstruir_caminho seria:

def reconstruir_caminho(caminho, inicio, objetivo):
    atual = objetivo
    rota = []
    while atual is not None:
        rota.append(atual)
        atual = caminho[atual]
    rota.reverse()
    return rota

Esse tipo de estrutura é a base para o que grandes e-commerces fazem ao sugerir "quem comprou este item também se interessou por este", criando um grafo de navegação otimizado para o usuário.

Espero que possa ter lhe ajudado!

Obrigado pelo seu feedback !