Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

[Projeto] Faça como eu fiz: construindo um sistema inteligente de recomendação

Uma implkementação de A* para exercício

import heapq

class Produto:
    def __init__(self, nome, categoria, probabilidade):
        self.nome = nome
        self.categoria = categoria
        self.probabilidade = probabilidade
    
    def __repr__(self):
        return self.nome


class AStarRecommendation:

    def __init__(self, grafo):
        self.grafo = grafo

    def buscar(self, inicio, objetivo):

        fila = []

        heapq.heappush(
            fila,
            (
                heuristica(inicio),  # f(n)
                0,                   # g(n)
                [inicio]
            )
        )

        melhor_custo = {
            inicio: 0
        }

        while fila:
            _, custo_atual, caminho = heapq.heappop(fila)

            no_atual = caminho[-1]

            if no_atual == objetivo:
                return caminho, custo_atual

            for vizinho, custo_aresta in self.grafo.get(no_atual, []):
                novo_custo = custo_atual + custo_aresta

                if ( vizinho not in melhor_custo or novo_custo < melhor_custo[vizinho] ):
                    melhor_custo[vizinho] = novo_custo
                    f = novo_custo + heuristica(vizinho)
                    novo_caminho = caminho + [vizinho]

                    heapq.heappush(
                        fila,
                        (
                            f,
                            novo_custo,
                            novo_caminho
                        )
                    )

        return None, None
    

def heuristica(produto):
    return 1 - produto.probabilidade


produto1 = Produto(
    "Produto 1",
    "Categoria A",
    0.50
)

produto2 = Produto(
    "Produto 2",
    "Categoria B",
    0.40
)

produto3 = Produto(
    "Produto 3",
    "Categoria C",
    0.70
)

produto4 = Produto(
    "Produto 4",
    "Categoria D",
     0.85
)


grafo = {
    produto1: [
        (produto2, 3),
        (produto3, 2)
    ],

    produto2: [
        (produto4, 4),
        (produto3, 2)
    ],

    produto3: [
        (produto1, 1),
        (produto2, 2)
        
    ],

    produto4: []
}



recomendador = AStarRecommendation(grafo)

caminho, custo = recomendador.buscar( produto1, produto4 )

print("Caminho:", caminho)
print("Custo:", custo)

2 respostas
solução!

Olá, Marcelo! Como vai?

Parabéns pela realização da atividade!

Você conseguiu apresentar uma implementação clara do algoritmo A*, aplicou o conceito de heurística de forma criativa com probabilidades e estruturou um grafo bem definido para testar o funcionamento.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Testar: variar os valores de probabilidade para observar como a heurística influencia o caminho escolhido.
  • Expandir: adicionar mais produtos e categorias para tornar o grafo mais complexo e realista.
  • Documentar: incluir comentários explicando cada parte do código, facilitando futuras revisões e compartilhamentos.

Ah uma pergunta: O que você considera mais interessante nesse exercício, entender a lógica do A* aplicada em recomendações ou explorar como ajustar a heurística para diferentes cenários?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Olá Daniel, seu feedback esta bem interessante. Eu fiz experimentações, fiz grafos mais complicados, observando a heuristica, eu não coloquei comentários porque geralmente aqui tem limitação de caracteres e quase sempre acabo removendo para caber.

Sobre a lógica, é sempre interessante estudar e ver formas diferentes de aplicar, eu já havia visto e, implementado esse algoritmo academicamente, o clássico exemplo de de um mapa da Romênia. quando estudei sobre algoritmos de busca, E se, me lembro, esta também no livro do Russel e Norwig, a curiosidade de explorar a heurística ou outros ajustes faz parte de entender e aprender.

Porém, eu não usuária este algoritmo especificamente pra esse problema dos produtos. Talvez usando NLP e similaridade de cosseno (baseado em conteúdo) em cima de embeddings ( acho que pode dar certo), Outrios algoritmos: Apriori, TF-IDF (baseado em conteúdo) Rede Neura baseada em grafos,Page Rank, filtragem colaborativa ou usar algo pronto de algum provedor.