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