Construindo um sistema inteligente de recomendação com A*
Para desenvolver um sistema de recomendação em uma loja online, a ideia é modelar os produtos como nós de um grafo e utilizar o algoritmo A* para encontrar os caminhos mais promissores entre itens, levando em consideração a probabilidade de conversão como heurística.
1. Definição dos produtos
Criei uma classe Produto para representar cada item do sistema, contendo informações essenciais como nome, categoria e probabilidade de conversão. Esse último atributo será fundamental para orientar a recomendação.
2. Construção do grafo e do sistema
Em seguida, implementei a classe AStarRecommendation, responsável por montar um grafo onde cada produto se conecta aos demais. Isso permite explorar diferentes caminhos de recomendação entre os itens disponíveis.
3. Aplicação do algoritmo A*
O algoritmo A* foi utilizado para encontrar o melhor caminho entre dois produtos. Ele combina:
g(n): custo acumulado até o nó atual
h(n): heurística baseada na probabilidade de conversão
A função total é dada por:
f(n) = g(n) + h(n)
Com isso, o sistema prioriza caminhos que levam a produtos mais relevantes para o usuário.
4. Heurística utilizada
A heurística foi definida com base na probabilidade de conversão do produto. Quanto maior essa probabilidade, mais atrativo o produto se torna dentro da busca, ajudando a guiar o algoritmo para melhores recomendações.
5. Teste do sistema
Foram inseridos produtos com diferentes categorias e taxas de conversão, e o sistema foi testado buscando o melhor caminho entre um produto inicial e um produto alvo. O resultado foi uma sequência de recomendações mais alinhadas ao potencial de compra do usuário.
Código completo com a implementação desses conceitos.
import heapq
class Produto:
def __init__(self, nome, categoria, conversao):
self.nome = nome
self.categoria = categoria
self.conversao = conversao
def __repr__(self):
return f"{self.nome} ({self.categoria})"
class AStarRecommendation:
def __init__(self, produtos):
self.produtos = produtos
self.grafo = self.criar_grafo()
def criar_grafo(self):
grafo = {}
for p in self.produtos:
grafo[p] = [x for x in self.produtos if x != p]
return grafo
# Heurística: quanto maior a conversão, melhor
def heuristica(self, produto):
return -produto.conversao
def a_star(self, inicio, objetivo):
fila = []
heapq.heappush(fila, (0 + self.heuristica(inicio), 0, inicio))
visitados = set()
pais = {}
while fila:
_, g, atual = heapq.heappop(fila)
if atual in visitados:
continue
visitados.add(atual)
if atual == objetivo:
break
for vizinho in self.grafo[atual]:
if vizinho not in visitados:
custo_g = g + 1
f = custo_g + self.heuristica(vizinho)
heapq.heappush(fila, (f, custo_g, vizinho))
pais[vizinho] = atual
# reconstrução do caminho
caminho = []
atual = objetivo
while atual in pais:
caminho.insert(0, atual)
atual = pais[atual]
caminho.insert(0, inicio)
return caminho
# Testando o sistema
produtos = [
Produto("Notebook Gamer", "Eletrônicos", 0.95),
Produto("Mouse RGB", "Acessórios", 0.80),
Produto("Teclado Mecânico", "Acessórios", 0.85),
Produto("Monitor 144Hz", "Eletrônicos", 0.90),
]
recomendador = AStarRecommendation(produtos)
inicio = produtos[0]
objetivo = produtos[2]
caminho = recomendador.a_star(inicio, objetivo)
print("Recomendação gerada:")
for p in caminho:
print(p)