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!

1
resposta

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

import heapq
class Produto:
    def __init__(self, nome, categoria, probabilidade_conversao):
        self.nome = nome
        self.categoria = categoria
        self.probabilidade_conversao = probabilidade_conversao

    def __repr__(self):
        return f"{self.nome} ({self.categoria})"
class AStarRecommendation:
    def __init__(self):
        self.produtos = {}
        self.grafo = {}

    def adicionar_produto(self, produto):
        self.produtos[produto.nome] = produto

    def construir_grafo(self):
        """
        Grafo simplificado:
        Cada produto se conecta a todos os outros.
        """
        for nome1 in self.produtos:
            self.grafo[nome1] = {}

            for nome2 in self.produtos:
                if nome1 != nome2:
                    produto_destino = self.produtos[nome2]

                    custo = 1 - produto_destino.probabilidade_conversao

                    self.grafo[nome1][nome2] = custo

    def heuristica(self, produto_nome):
        produto = self.produtos[produto_nome]

        return 1 - produto.probabilidade_conversao

    def astar(self, inicio, objetivo):
        fila = []
        heapq.heappush(fila, (0, inicio))

        veio_de = {}
        g_score = {produto: float('inf') for produto in self.produtos}
        g_score[inicio] = 0

        f_score = {produto: float('inf') for produto in self.produtos}
        f_score[inicio] = self.heuristica(inicio)

        while fila:
            _, atual = heapq.heappop(fila)

            if atual == objetivo:
                caminho = [atual]

                while atual in veio_de:
                    atual = veio_de[atual]
                    caminho.append(atual)

                caminho.reverse()
                return caminho

            for vizinho, custo in self.grafo[atual].items():
                g_temporario = g_score[atual] + custo

                if g_temporario < g_score[vizinho]:
                    veio_de[vizinho] = atual
                    g_score[vizinho] = g_temporario

                    f_score[vizinho] = (
                        g_temporario + self.heuristica(vizinho)
                    )

                    heapq.heappush(
                        fila,
                        (f_score[vizinho], vizinho)
                    )

        return None


produto1 = Produto("Notebook Gamer", "Eletrônicos", 0.90)
produto2 = Produto("Mouse Gamer", "Periféricos", 0.85)
produto3 = Produto("Teclado Mecânico", "Periféricos", 0.80)
produto4 = Produto("Headset", "Áudio", 0.75)
produto5 = Produto("Monitor", "Eletrônicos", 0.88)

sistema = AStarRecommendation()

for produto in [produto1, produto2, produto3, produto4, produto5]:
    sistema.adicionar_produto(produto)

sistema.construir_grafo()

inicio = "Notebook Gamer"
objetivo = "Headset"

caminho = sistema.astar(inicio, objetivo)

print("Melhor caminho encontrado:")
print(" -> ".join(caminho))


Melhor caminho encontrado:
Notebook Gamer -> Headset
1 resposta

Oi, Marcelo! Como vai?

Seu projeto ficou bem estruturado e mostra uma boa aplicação do algoritmo em um cenário de recomendação. Gostei de como você representou os produtos como objetos, construiu um grafo entre eles e usou a probabilidade_conversao para calcular custos e heurísticas, aproximando a lógica de busca de uma situação prática de recomendação.

Continue explorando essa relação entre grafos, custos e escolhas inteligentes, porque ela ajuda bastante a entender como sistemas podem buscar a melhor alternativa entre várias opções. Dica: para evoluir o teste, você pode mudar as probabilidades dos produtos e observar se o caminho recomendado também muda. O que aconteceria se o Headset tivesse uma probabilidade de conversão bem menor?

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