Rehice el script que dieron en clase y agregué el costo total acumulado. El camino siempre va a ir directo porque siempre va a priorizar el mínimo, asi que sin importar qué agregues, si el objetivo es el de mayor probabilidad de conversión, siempre irá al objetivo.
import heapq
class Producto:
def __init__(self, nombre, categoria, probabilidad_conversion):
self.nombre = nombre
self.categoria = categoria
self.probabilidad_conversion = probabilidad_conversion
def __repr__(self):
return f"{self.nombre} ({self.categoria})"
def __lt__(self, otro):
return self.probabilidad_conversion > otro.probabilidad_conversion
class AStarRecommendation:
def __init__(self, productos, heuristica):
self.productos = productos
self.heuristica = heuristica
self.grafo = self.crear_grafo()
def crear_grafo(self):
grafo = {}
for producto in self.productos:
grafo[producto] = [p for p in self.productos if p != producto]
return grafo
def a_star(self, inicio, objetivo):
fila_prioridad = []
heapq.heappush(fila_prioridad, (0 + self.heuristica(inicio), 0, inicio))
visitados = set()
caminos = {}
costos = {inicio: 0}
while fila_prioridad:
_, g, actual = heapq.heappop(fila_prioridad)
if actual in visitados:
continue
visitados.add(actual)
if actual == objetivo:
break
for vecino in self.grafo[actual]:
if vecino not in visitados:
nuevo_g = g + 1
h = self.heuristica(vecino)
heapq.heappush(fila_prioridad, (nuevo_g + h, nuevo_g, vecino))
if vecino not in costos or nuevo_g < costos[vecino]:
costos[vecino] = nuevo_g
caminos[vecino] = actual
camino = []
producto = objetivo
while producto in caminos:
camino.insert(0, producto)
producto = caminos[producto]
costo_total = costos.get(objetivo, 0)
return camino, costo_total
def heuristica(producto):
return -producto.probabilidad_conversion
productos = [
Producto("Laptop Gamer", "Computacion", 0.85),
Producto("Mouse Inalambrico", "Perifericos", 0.60),
Producto("Monitor 4K", "Computacion", 0.75),
Producto("Teclado Mecanico", "Perifericos", 0.55),
Producto("Auriculares BT", "Audio", 0.40),
]
recomendador = AStarRecommendation(productos, heuristica)
inicio = productos[4] # Auriculares BT
objetivo = productos[0] # Laptop Gamer
camino, costo_total = recomendador.a_star(inicio, objetivo)
print(f"Inicio: {inicio}")
print("\nCamino recomendado:")
for p in camino:
print(f" -> {p}")
print(f"\nCosto total acumulado: {costo_total}")
Output:
Inicio: Auriculares BT (Audio)
Camino recomendado:
-> Laptop Gamer (Computacion)
Costo total acumulado: 1