Solución recursiva al problema del morral uno-cero
Clase 15 de 16 • Curso de Complejidad Algorítmica con Python
Resumen
¿Qué es el problema del morral?
El problema del morral o "knapsack problem" es un desafío clásico en la programación y teoría de algoritmos. Imagina que eres un ladrón a punto de entrar a un museo o una casa. Tu dilema es que solo tienes una mochila en la cual llevarte los objetos de valor y estos objetos pesan más de lo que puedes acarrear. Debes decidir qué elementos llevar para obtener el mayor valor posible de tu botín. Este problema se convierte en una cuestión de optimización, que busca maximizar el valor total de los artículos que puedas "empaquetar" en la mochila, respetando un límite de peso.
En esta clase, nos concentramos en una variante específica conocida como "0-1 Knapsack Problem", que limita a las decisiones binarias: o tomas un artículo o lo dejas.
¿Cómo se puede resolver el problema del morral?
Algoritmos codiciosos
Un enfoque posible, aunque no idóneo para el 0-1 Knapsack, son los algoritmos codiciosos. Estos funcionan tomando primero los elementos de valor más alto o eficiencia antes que otros, llenando la mochila con el preciado "oro" antes de agregar la "plata" y, finalmente, el "arroz" como lastre. Los algoritmos codiciosos son efectivos donde los elementos pueden subdividirse; sin embargo, nuestro problema no permite tal flexibilidad.
Algoritmo recursivo
La solución implementada en esta clase emplea una función recursiva que evalúa cada caso posible:
- Casos base: La recursividad se detiene si ya no quedan elementos para considerar o si la mochila está llena al tope.
- Elección de inclusión: Decide si incluir un elemento en la mochila. Evalúa el valor del elemento contra el espacio disponible.
- Evaluación del mejor resultado: Usamos la función
max
de Python para comparar los valores obtenidos al incluir o no un elemento, regresando el máximo alcanzable.
Implementación del código en Python
A continuación, se detalla cómo se estructura este algoritmo:
def morral(tamano_morral, pesos, valores, n):
if n == 0 or tamano_morral == 0:
return 0
if pesos[n-1] > tamano_morral:
return morral(tamano_morral, pesos, valores, n-1)
return max(
valores[n-1] + morral(tamano_morral-pesos[n-1], pesos, valores, n-1),
morral(tamano_morral, pesos, valores, n-1)
)
valores = [60, 100, 120]
pesos = [10, 20, 30]
tamano_morral = 50
n = len(valores)
resultado = morral(tamano_morral, pesos, valores, n)
print(resultado)
¿Cómo analizar la complejidad algorítmica?
La complejidad algorítmica del problema del morral es esencial para entender su eficiencia. En el caso de este algoritmo recursivo, cada pieza del conjunto se resuelve aproximadamente dos veces, resultando en una complejidad de tiempo exponencial, O(2^n)
, donde n
es el número de objetos. Esta característica hace que la variante recursiva básica sea ineficaz para grandes conjuntos de datos.
¿Por qué es importante dominar este problema?
El problema del morral no es solo un ejercicio académico; ofrece un paradigma que se aplica ampliamente en situaciones reales. Problemas de optimización similares surgen en logística, planificación de recursos y muchas áreas donde se maniobran restricciones o limitaciones físicas. Con una mejor comprensión y habilidad para identificar estos problemas, los desarrolladores pueden aplicar estos algoritmos para generar soluciones óptimas y eficientes.
¡Anímate a seguir explorando!, y recuerda que cada nuevo algoritmo que domines amplía tus herramientas para resolver problemas del mundo real.