Criei um codigo, simulando uma loja de bebe, com alguns produtos, inserindo o conceito de upsell e as orientações do exercicio.
import heapq
class Produto:
def init(self, nome, tamanho, cor, categoria, conversao_probabilidade):
self.nome = nome
self.tamanho = tamanho
self.cor = cor
self.categoria = categoria
self.conversao_probabilidade = conversao_probabilidade
def __repr__(self):
return f"{self.nome} ({self.tamanho}, {self.cor}, {self.categoria})"
class AStarRecommendation:
def init(self, produtos, heuristica):
self.produtos = produtos
self.heuristica = heuristica # Função heurística
self.grafo = self.criar_grafo()
def criar_grafo(self):
# Criando um grafo simplificado de produtos, onde cada produto se conecta ao próximo
grafo = {}
for produto in self.produtos:
grafo[produto] = [p for p in self.produtos if p != produto]
return grafo
def a_star(self, inicio, objetivo):
fila_prioridade = []
heapq.heappush(fila_prioridade, (0 + self.heuristica(inicio), 0, inicio)) # f = g + h
visitados = set()
caminhos = {}
while fila_prioridade:
_, g, atual = heapq.heappop(fila_prioridade)
if atual in visitados:
continue
visitados.add(atual)
if atual == objetivo:
break
for vizinho in self.grafo[atual]:
if vizinho not in visitados:
h = self.heuristica(vizinho)
heapq.heappush(fila_prioridade, (g + 1 + h, g + 1, vizinho)) # g é o custo acumulado
caminhos[vizinho] = atual
# Recuperando o caminho
caminho = []
produto = objetivo
while produto in caminhos:
caminho.insert(0, produto)
produto = caminhos[produto]
return caminho
def heuristica(produto):
# Quanto maior a probabilidade de conversão, mais atraente é o produto
return -produto.conversao_probabilidade # Vamos minimizar a heurística (quanto menor, melhor)
Criando os produtos
body = Produto("Body", "RN", "Branco", "Roupa de Bebê", 0.9)
body_calca = Produto("Body + Calça", "RN", "Branco", "Roupa de Bebê", 0.8)
produtos = [body, body_calca]
Criando o sistema de recomendação
recomendador = AStarRecommendation(produtos, heuristica)
Definindo o produto de início e o objetivo
inicio = produtos[0] # Body
objetivo = produtos[1] # Body + Calça
Buscando o melhor caminho entre dois produtos
caminho_recomendado = recomendador.a_star(inicio, objetivo)
Exibindo a recomendação
print("Caminho recomendado:")
for p in caminho_recomendado:
print(p)