import heapq
Classe Produto
class Produto:
def init(self, nome, categoria, probabilidade):
self.nome = nome
self.categoria = categoria
self.probabilidade = probabilidade # Valor entre 0 e 1
def __repr__(self):
return f"{self.nome} ({self.categoria})"
Classe que implementa o algoritmo A*
class AStarRecommendation:
def __init__(self):
self.produtos = {}
self.grafo = {}
# Adiciona um produto
def adicionar_produto(self, produto):
self.produtos[produto.nome] = produto
self.grafo[produto.nome] = {}
# Conecta todos os produtos entre si
def conectar_produtos(self):
nomes = list(self.produtos.keys())
for origem in nomes:
for destino in nomes:
if origem != destino:
# Custo baseado na diferença de probabilidade
custo = abs(
self.produtos[origem].probabilidade -
self.produtos[destino].probabilidade
)
self.grafo[origem][destino] = custo
# Heurística baseada na probabilidade de conversão
def heuristica(self, produto_atual, produto_objetivo):
return abs(
self.produtos[produto_objetivo].probabilidade -
self.produtos[produto_atual].probabilidade
)
# Algoritmo A*
def a_estrela(self, inicio, objetivo):
fila = []
heapq.heappush(fila, (0, inicio))
veio_de = {}
custo = {inicio: 0}
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, peso in self.grafo[atual].items():
novo_custo = custo[atual] + peso
if vizinho not in custo or novo_custo < custo[vizinho]:
custo[vizinho] = novo_custo
prioridade = novo_custo + self.heuristica(vizinho, objetivo)
heapq.heappush(fila, (prioridade, vizinho))
veio_de[vizinho] = atual
return None
==========================
Teste do sistema
==========================
sistema = AStarRecommendation()
produtos = [
Produto("Notebook", "Eletrônicos", 0.90),
Produto("Mouse", "Periféricos", 0.75),
Produto("Teclado", "Periféricos", 0.70),
Produto("Monitor", "Eletrônicos", 0.80),
Produto("Headset", "Áudio", 0.65)
]
for produto in produtos:
sistema.adicionar_produto(produto)
sistema.conectar_produtos()
caminho = sistema.a_estrela("Notebook", "Headset")
print("Melhor caminho encontrado:")
print(" -> ".join(caminho))