Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Proyecto] "Haz lo que hicimos en el aula"

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
1 respuesta

Hola Jairo, espero que estés bien

¡Qué bueno que estás trabajando en el proyecto! Parece que has seguido correctamente los pasos para implementar el algoritmo A* para recomendaciones de productos. La lógica de priorizar el producto con la mayor probabilidad de conversión está bien aplicada en tu heurística.

En tu código, el sistema está configurado para siempre priorizar el camino con la mayor probabilidad de conversión, lo cual es precisamente lo que se espera en este tipo de implementación. La función de heurística que has utilizado (-producto.probabilidad_conversion) asegura que los productos con mayor probabilidad de conversión sean priorizados.

El resultado que obtuviste muestra que el camino recomendado va directamente del producto inicial al objetivo, lo cual es correcto dado que el objetivo tiene la mayor probabilidad de conversión. El costo total acumulado de 1 indica que solo un paso fue necesario para llegar al objetivo, lo cual tiene sentido en este contexto.

Si deseas experimentar más, podrías intentar modificar la lista de productos o sus probabilidades de conversión para ver cómo cambia el camino recomendado. También podrías agregar más lógica para manejar casos donde los caminos no sean tan directos.

Espero que esto te haya aclarado las dudas. ¡Espero haber ayudado y buenos estudios!