programa
El algoritmo hill climbing es uno de los primeros y más sencillos algoritmos de optimización en inteligencia artificial e informática. Pertenece a la familia de algoritmos de búsqueda local, que encuentran soluciones haciendo mejoras incrementales.
Su nombre nace de una analogía útil: imagina a un excursionista con los ojos vendados que intenta llegar a la cima de una colina. Como no puede ver el paisaje completo, solo puede notar el terreno inmediato a su alrededor. En cada paso, se mueve en la dirección que sube. Así funciona el algoritmo: evalúa soluciones cercanas y avanza iterativamente hacia las mejores, intentando encontrar la solución óptima (el pico de la colina).
En este artículo veremos a fondo el algoritmo hill climbing, sus variantes y cómo puedes implementarlo en Python. Si estás empezando en IA, no dejes de consultar nuestro itinerario de aprendizaje AI Fundamentals para cubrir lo básico.
¿Qué es un algoritmo hill climbing en IA?
Hill climbing es una forma sencilla de resolver problemas buscando la mejor respuesta posible, como un senderista que trata de alcanzar la cima de una montaña. En inteligencia artificial (IA), a menudo necesitamos elegir la mejor solución entre muchas posibles. A esto lo llamamos optimización.
Piensa en el juego de "frío o caliente" para encontrar un punto alto. Solo puedes comprobar si te acercas (mejor) o te alejas (peor) a medida que te mueves. Hill climbing funciona igual: mira las soluciones cercanas y avanza hacia las mejores.
Así funciona, en pasos sencillos:
- Empieza con cualquier solución posible
- Examina soluciones cercanas
- Si una solución cercana es mejor, pasa a ella
- Repite los pasos 2–3 hasta que no encuentres opciones mejores
Por ejemplo, si quieres enseñar a un robot a caminar, hill climbing podría:
- Empezar con movimientos aleatorios de las piernas
- Probar variaciones ligeras de esos movimientos
- Conservar los que hacen que el robot camine mejor
- Repetir hasta encontrar el patrón óptimo de marcha
Aunque hill climbing no siempre es el método más avanzado en IA, es un bloque fundamental para entender cómo los ordenadores resuelven problemas por sí solos, de forma similar al algoritmo minimax.
Tipos de algoritmos hill climbing
Hay tres tipos principales de algoritmos hill climbing, cada uno con su propia forma de buscar la mejor solución:
1. Hill climbing simple
El hill climbing simple es como dar el primer buen paso que encuentras. En esta versión:
- El algoritmo examina las soluciones cercanas una a una
- En cuanto encuentra una mejor, se mueve a ella
- No comprueba las demás opciones
- Es rápido, pero puede pasar por alto soluciones mejores que estén un poco más lejos
2. Hill climbing de mayor pendiente (steepest-ascent)
Esta versión es más exhaustiva que el hill climbing simple:
- Examina TODAS las soluciones cercanas antes de moverse
- Elige la mejor opción de entre todas las encontradas
- Tarda más tiempo, pero suele encontrar soluciones mejores
- Es como revisar con cuidado cada sendero antes de dar un paso
3. Hill climbing estocástico
Este tipo añade aleatoriedad para hacer la búsqueda más efectiva:
- En lugar de elegir siempre la mejor solución, selecciona aleatoriamente entre las mejores opciones
- Las soluciones mejores tienen más probabilidad de ser elegidas
- Esta aleatoriedad ayuda a evitar quedarse atascado en malos puntos
- Es como tomar a veces un camino distinto para ver adónde lleva
Cada tipo tiene sus fortalezas y encaja mejor con distintos problemas. El simple es rápido pero básico, el de mayor pendiente es exhaustivo pero más lento, y el estocástico añade una aleatoriedad útil para evitar atascos.
Cómo funciona el algoritmo hill climbing
Hill climbing mejora poco a poco, paso a paso, hasta encontrar la mejor solución que puede. Veamos sus partes principales.
1. Punto de partida
Todo algoritmo hill climbing necesita un punto de inicio. Es como elegir dónde empezar a subir la montaña. Puedes empezar al azar o usar lo que sabes del problema para escoger un buen inicio.
El punto de partida importa mucho: si es bueno, puedes llegar rápido a la mejor solución. Si es malo, puedes quedarte en una loma en vez de alcanzar la cima.
Por ejemplo, al entrenar redes neuronales, el inicio significa elegir los pesos iniciales de las conexiones entre neuronas. Puedes inicializarlos al azar (como empezar la ruta en un punto cualquiera) o usar técnicas como la inicialización de Xavier que proponen pesos iniciales inteligentes según la arquitectura.
Una buena inicialización ayuda a aprender más rápido y a encontrar mejores soluciones; una mala puede dejar a la red estancada con baja precisión.
2. Explorar soluciones cercanas
Una vez empieza la búsqueda, el algoritmo evalúa soluciones vecinas similares a la posición actual. Es como explorar los alrededores con pasos pequeños. Por ejemplo, si quieres optimizar una ruta de reparto entre ciudades y tu ruta actual es [A -> B -> C -> D], el algoritmo examinaría rutas parecidas como [A -> B -> D -> C] o [A -> C -> B -> D] para ver si reducen la distancia total. Cada pequeño cambio en la ruta representa una solución "vecina" que podría ser mejor que la actual.
Para comparar, el algoritmo usa una función objetivo: una fórmula matemática que asigna una puntuación a cada posible solución.
Esta función actúa como una brújula que indica qué direcciones son "cuesta arriba" (mejor) y cuáles "cuesta abajo" (peor). En una ruta de reparto, la función objetivo calcularía la distancia total: a menor distancia, mejor solución.
Así, si la ruta X tarda 100 millas y la Z 90, la Z tendría una mejor (menor) puntuación. El algoritmo sabrá que debe moverse hacia soluciones similares a la Z. La función objetivo convierte el problema complejo de optimizar rutas en un número simple que se puede comparar y minimizar.
3. Elegir el siguiente paso
Tras evaluar las soluciones cercanas, el algoritmo debe decidir adónde moverse. Compara las puntuaciones de las vecinas con la actual. Si encuentra una mejor, se desplaza allí. Las variantes de hill climbing toman esta decisión de distintas maneras:
- La versión simple toma la primera mejor que encuentra
- La cuidadosa revisa todas las cercanas y elige la mejor
- La aleatoria a veces elige opciones que no son la óptima inmediata, lo que ayuda a evitar atascos
4. Saber cuándo parar
El algoritmo necesita un criterio de parada. Suele detenerse cuando ocurre algo de esto:
- No encuentra soluciones mejores cerca
- Lleva demasiado tiempo ejecutándose
- Ha encontrado una solución suficientemente buena
A medida que trabaja, suele seguir un patrón: al principio encuentra mejoras rápido, como subir una pendiente pronunciada; luego se va frenando, con mejoras pequeñas, hasta que se detiene.
A veces el camino es directo y otras, con muchos sube y baja.
Ventajas y limitaciones de hill climbing en IA
Veamos qué lo hace útil y con qué problemas te puedes encontrar al usarlo.
Ventajas
Hill climbing es uno de los algoritmos de optimización más fáciles de entender y programar. Sigue una regla básica: "si algo es mejor, ve hacia allí". Es un gran punto de partida para muchos problemas.
Cuando el problema es claro, puede encontrar buenas soluciones rápido. No pierde tiempo explorando todo el espacio: simplemente sigue la subida.
No necesita mucha memoria ni potencia de cálculo. Solo debe recordar dónde está y mirar alrededor, lo que lo hace práctico para muchos casos reales.
Limitaciones
Como cualquier método, tiene sus contras:
1. Quedarse en colinas pequeñas
El mayor problema es atascarse en "máximos locales": pequeñas colinas cuando hay una montaña cerca. Una vez llega a la cima de esa loma, se para porque todo alrededor es peor, aunque existan soluciones mucho mejores en otro lugar.
2. El problema de la meseta
A veces el algoritmo cae en terreno plano (una meseta), donde todas las soluciones cercanas son igual de buenas. Es como buscar el punto más alto caminando por un campo de fútbol plano: ¡no sabes hacia dónde ir!
3. El problema de la arista
Imagina caminar por la cima de una arista estrecha. El algoritmo puede perder tiempo zigzagueando a los lados en lugar de avanzar hacia la cumbre. Pasa porque cada paso lateral parece tan bueno como seguir recto.
4. El punto de partida importa mucho
Dónde empiezas puede marcar una gran diferencia. Como en una ruta: si arrancas en el sitio equivocado, puede que nunca encuentres el pico más alto.
Estas limitaciones no lo invalidan: solo significan que hay que usarlo con cabeza. A veces podemos combinarlo con otras técnicas para superarlas, como veremos a continuación.
Estrategias para superar las limitaciones
Al usar hill climbing, hay varias estrategias eficaces para mitigar los problemas anteriores. Veamos dos enfoques que lo hacen más robusto.
Hill climbing con reinicios aleatorios
Una de las mejores formas de evitar colinas pequeñas es empezar desde distintos puntos. Este enfoque, llamado random-restart hill climbing, funciona tal cual suena: si te atascas, vuelves a empezar en otro lugar.
Es como buscar la montaña más alta en medio de la niebla. Si subes la primera colina que encuentras, quizá pases por alto una mucho más alta al lado. Pero si pudieras teletransportarte a distintos puntos y volver a intentarlo, aumentarías mucho las probabilidades de dar con la cima más alta.
Cómo funciona: primero ejecutas el hill climbing normal hasta que se atasca. En lugar de rendirte, guardas la mejor solución encontrada y empiezas de nuevo en un punto aleatorio. Repites varios intentos y, al final, te quedas con la mejor solución de todas.
La gracia de los reinicios aleatorios es que es simple pero efectivo. Cada reinicio te da una nueva oportunidad de encontrar la cima. Aunque tarda más que el hill climbing normal, aumenta mucho la probabilidad de hallar la mejor solución.
Recocido simulado (simulated annealing)
Aunque no es estrictamente hill climbing, el recocido simulado es una variación muy ingeniosa que resuelve muchos de sus problemas. Se inspira en cómo se enfrían y endurecen los metales: al enfriarse lentamente, los átomos encuentran posiciones mejores y el metal queda más resistente.
En este enfoque, el algoritmo a veces acepta soluciones peores a propósito, sobre todo al principio. Con el tiempo, se vuelve más exigente. Es como una pelota que rebota en una superficie irregular: al principio tiene energía para saltar colinas, pero al perderla, se asienta en un buen sitio.
Cómo funciona: al principio, puede aceptar una solución peor con una probabilidad relativamente alta. Esta probabilidad depende de cuánto peor sea y del tiempo transcurrido. Con el paso del tiempo, la probabilidad disminuye y el algoritmo actúa más como un hill climbing convencional.
Su gran ventaja es que puede escapar de colinas pequeñas y zonas planas, sobre todo al inicio. Al aceptar a veces soluciones peores, puede:
- Saltar fuera de máximos locales (colinas pequeñas)
- Atravesar mesetas (zonas planas)
- Navegar por aristas (picos estrechos)
- Explorar más el espacio de soluciones
Por ejemplo, al organizar muebles para ganar espacio: mover una silla puede empeorar temporalmente la distribución, pero permitir luego recolocar otras piezas en posiciones mucho mejores. El recocido simulado está dispuesto a probar estas configuraciones temporalmente peores, sobre todo al principio, para encontrar la mejor disposición global.
Estas estrategias muestran que no siempre la mejor forma de avanzar es dar el paso más obvio. Al añadir aleatoriedad y cierta "caótica" controlada, a menudo hallamos soluciones superiores a las que conseguiríamos siguiendo el camino recto.
Implementación de un hill climbing simple en Python
Ahora que sabemos cómo mejorar hill climbing con reinicios aleatorios y recocido simulado, apliquémoslo a un problema financiero real: la optimización de carteras.
La optimización de carteras ayuda a decidir cómo repartir el dinero entre distintas inversiones. El objetivo es lograr el mayor retorno posible manteniendo el riesgo bajo. Encontrar ese equilibrio es complejo: es como dar con la receta perfecta con muchos ingredientes.
En 1952, el economista Harry Markowitz propuso una forma inteligente de abordar el problema. Demostró que se puede reducir el riesgo combinando activos que no se mueven al unísono. Esto es la diversificación: no poner todos los huevos en la misma cesta.
Al construir una cartera, debemos calcular tres aspectos clave:
- Cuánto esperamos ganar (retorno esperado)
- Qué riesgo asumimos (riesgo de la cartera)
- Si el beneficio potencial compensa el riesgo (retorno ajustado por riesgo)
Hill climbing encaja bien porque cambios pequeños en el reparto del dinero suelen producir cambios pequeños en el rendimiento. Imagina una colina suave donde cada punto representa una asignación distinta; los puntos más altos son mejores combinaciones de inversión.
Para encontrar una buena cartera con hill climbing, vamos a:
- Empezar con una mezcla aleatoria de inversiones
- Probar mezclas ligeramente distintas y ver si mejoran
- Seguir mejorando hasta que no encontremos opciones superiores
- Usar la mejor mezcla encontrada
Usando hill climbing así, podemos ayudar a encontrar mejores carteras entre millones de combinaciones. Es como tener un asistente que prueba rápido muchas mezclas para equilibrar riesgo y retorno.
Primero, definamos la función objetivo, que mide el rendimiento de la cartera equilibrando retornos esperados y riesgo. Recibe una lista de pesos y devuelve una puntuación: cuanto más alta, mejor.
def objective_function(state):
"""
Portfolio optimization objective function that maximizes expected returns while minimizing risk.
The state represents portfolio weights for different assets.
Args:
state (list): List of portfolio weights for different assets (should sum to 1)
Returns:
float: Portfolio score combining returns and risk
"""
# Expected annual returns for assets (example values)
expected_returns = [0.1, 0.12, 0.18, 0.1, 0.15] # 8%, 12%, etc.
# Risk (volatility) for each asset
volatilities = [0.1, 0.2, 0.3, 0.2, 0.2] # 10%, 20%, etc.
# Validate input length matches expected returns/volatilities
if len(state) != len(expected_returns):
return float("-inf") # Return worst possible score for invalid states
# Calculate expected portfolio return
portfolio_return = sum(w * r for w, r in zip(state, expected_returns))
# Calculate portfolio risk (simplified, not using covariance matrix)
portfolio_risk = sum(w * v for w, v in zip(state, volatilities))
# Penalize if weights don't sum to 1 (invalid portfolio)
weight_sum_penalty = abs(sum(state) - 1) * 100
# Penalize negative weights (no short selling)
negative_weight_penalty = sum(abs(min(0, w)) for w in state) * 100
# Combine return and risk with risk aversion factor of 2
# Higher score is better: maximize return, minimize risk and penalties
score = (
portfolio_return
- 2 * portfolio_risk
- weight_sum_penalty
- negative_weight_penalty
)
return score
La función objective_function anterior nos ayuda a evaluar la calidad de una cartera concreta. Así funciona:
Primero recibe una lista de números que representa el porcentaje de dinero invertido en cada activo. Por ejemplo, con cinco activos, podríamos invertir un 20% en cada uno.
Usa dos piezas de información:
- Retornos esperados: cuánto esperamos ganar en cada activo (p. ej., 8% o 12% anual)
- Volatilidades: cuán arriesgado es cada activo: valores altos significan más variación (como las criptomonedas)
Luego la función:
- Calcula el retorno esperado total multiplicando el retorno de cada activo por su peso
- Estima el riesgo total con la volatilidad de cada activo
- Comprueba que los porcentajes suman 100% (deben hacerlo)
- Se asegura de que no haya pesos negativos (sin posiciones cortas)
Finalmente, combina todo en una única puntuación. Una puntuación mayor implica una cartera mejor. La puntuación sube con retornos altos y baja con mayor riesgo. También cae mucho si los pesos no suman 100% o si hay negativos.
Usaremos esta función para encontrar la mejor mezcla con el algoritmo hill climbing que verás a continuación. Si no entiendes todos los detalles, no pasa nada: lo clave es que nos dice qué tan buena es una combinación y nos guía hacia opciones mejores.
Ahora definamos una función para generar carteras vecinas haciendo pequeños ajustes en los pesos.
def get_neighbors(state):
"""
Generates neighboring states by making small adjustments to portfolio weights
Args:
state (list): Current portfolio weights
Returns:
list: List of neighboring portfolio weight configurations
"""
neighbors = []
step_size = 0.01 # Small adjustment to weights (1%)
for i in range(len(state)):
for j in range(len(state)):
if i != j:
# Transfer weight from asset i to asset j
neighbor = state.copy()
if neighbor[i] >= step_size: # Only transfer if enough weight available
neighbor[i] -= step_size
neighbor[j] += step_size
neighbors.append(neighbor)
return neighbors
La función get_neighbors es clave: genera asignaciones similares haciendo pequeños ajustes a los pesos actuales. Así opera:
Para cada par de activos, crea una nueva cartera transfiriendo un 1% de uno a otro. Por ejemplo, con cinco activos probará:
- Mover un 1% del activo 1 al 2
- Mover un 1% del activo 1 al 3
- Mover un 1% del activo 1 al 4
- Mover un 1% del activo 1 al 5
- Mover un 1% del activo 2 al 1, y así con todos los pares.
Incluye una verificación para transferir solo si el activo origen tiene al menos ese 1%, evitando pesos negativos.
Cada ajuste crea un "vecino": una cartera muy parecida a la actual, pero ligeramente distinta. El algoritmo evaluará estos vecinos para encontrar asignaciones mejores.
El paso del 1% equilibra bien exploración y control: uno mayor podría saltarse óptimos; uno menor haría la búsqueda demasiado lenta.
Ahora implementemos por fin un hill climbing simple:
def simple_hill_climbing(initial_state, max_iterations=1000):
"""
Implements Simple Hill Climbing algorithm
Args:
initial_state (list): Starting point for the algorithm
max_iterations (int): Maximum number of iterations to prevent infinite loops
Returns:
tuple: (best_state, best_value) found by the algorithm
"""
current_state = initial_state
current_value = objective_function(current_state)
for _ in range(max_iterations):
# Get neighboring states
neighbors = get_neighbors(current_state)
# Flag to check if we found a better neighbor
found_better = False
# Check neighbors one by one (Simple Hill Climbing)
for neighbor in neighbors:
neighbor_value = objective_function(neighbor)
# If we find a better neighbor, move to it immediately
if neighbor_value > current_value:
current_state = neighbor
current_value = neighbor_value
found_better = True
break
# If no better neighbor was found, we've reached a peak
if not found_better:
break
return current_state, current_value
La función parte de un estado inicial y se mueve iterativamente hacia vecinos mejores hasta alcanzar un máximo local o el límite de iteraciones.
Recibe dos parámetros:
initial_state: el punto de partida de la optimización, como una lista de valoresmax_iterations: un tope de seguridad para evitar bucles infinitos (por defecto, 1000)
El algoritmo funciona así:
- Empieza en el
initial_statey calcula su valor de la función objetivo - En cada iteración:
- Genera vecinos con
get_neighbors() - Evalúa cada vecino, uno por uno
- En cuanto encuentra uno mejor (valor objetivo mayor), se mueve a ese estado
- Si no encuentra ninguno mejor, ha alcanzado un máximo local y termina
La función devuelve una tupla con:
- El mejor estado encontrado (lista de valores)
- El valor de la función objetivo para ese estado
Esta variante "simple" es codiciosa: se mueve al primer vecino mejor que encuentra en lugar de evaluar todos para elegir el óptimo. Es más rápida, pero puede pasar por alto soluciones superiores.
Es útil para hallar óptimos locales, pero puede atascarse y no alcanzar el máximo global. Aun así, sigue siendo popular por su sencillez y eficiencia.
Probémoslo con una cartera de ejemplo:
# Example usage
initial_state = [0.15, 0.25, 0.1, 0.3, 0.2]
best_state, best_value = simple_hill_climbing(initial_state)
print(f"Initial State: {initial_state}")
print(f"Best State Found: {best_state}")
print(f"Best Value: {best_value}")
[OUT]:
Initial State: [0.15, 0.25, 0.1, 0.3, 0.2]
Best State Found: [0.9700000000000006, 0.009999999999999913, 1.0408340855860843e-17, 0.009999999999999858, 0.009999999999999969]
Best Value: -0.1053000000000444
La salida muestra los resultados del algoritmo al optimizar una cartera. Partiendo de pesos iniciales para cinco activos, encontró un nuevo conjunto que mejora el valor de la función objetivo. Aunque mejora la cartera inicial, probablemente sea un óptimo local, ya que el algoritmo se detiene en el primer pico que encuentra.
Aplicaciones de hill climbing en IA
Los algoritmos hill climbing tienen aplicaciones prácticas en muchas áreas de la inteligencia artificial y el aprendizaje automático. Veamos algunas:
1. Optimización de modelos de machine learning
Hill climbing ayuda a ajustar modelos de varias formas:
- Selección de características: encontrar el mejor subconjunto de variables
- Ajuste de hiperparámetros: optimizar parámetros como la tasa de aprendizaje o la profundidad de un árbol
- Entrenamiento de redes neuronales: afinar pesos y arquitectura
- Compresión de modelos: reducir tamaño manteniendo rendimiento
Por ejemplo, al seleccionar características para un modelo predictivo, hill climbing puede empezar con todas y quitar o añadir iterativamente según el desempeño, buscando un equilibrio entre precisión y complejidad.
2. Robótica y planificación de rutas
En robótica, hill climbing ayuda con:
- Planificación de movimiento: encontrar trayectorias eficientes
- Optimización de ángulos articulares: posiciones óptimas de brazos robóticos
- Ubicación de sensores: colocación óptima para máxima cobertura
- Gestión de batería: optimización del consumo energético
Un robot aspirador puede usar hill climbing para encontrar rutas de limpieza eficientes, ajustando su recorrido según cobertura y batería.
3. Procesamiento del lenguaje natural
NLP incluye:
- Resumen de textos: optimizar la selección de contenidos
- Word embeddings: afinar representaciones vectoriales
- Clustering de documentos: organizar en grupos óptimos
- Optimización en buscadores: mejorar la relevancia de resultados
Por ejemplo, en el resumen de textos, hill climbing ayuda a elegir frases que maximicen la información minimizando la redundancia.
4. Visión por computador
- Segmentación de imágenes: encontrar límites óptimos entre objetos
- Calibración de cámaras: ajustar parámetros para mejor calidad
- Detección de objetos: optimizar posiciones de cajas delimitadoras
- Emparejamiento de características: hallar puntos correspondientes entre imágenes
Un sistema de reconocimiento facial puede usar hill climbing para optimizar la alineación de rasgos en el preprocesado.
5. IA para juegos y toma de decisiones
Hill climbing ayuda en:
- Optimización de estrategias: encontrar jugadas ganadoras
- Asignación de recursos: optimizar la distribución en juegos de estrategia
- Comportamiento de NPC: mejorar la toma de decisiones de personajes no jugables
- Generación de niveles: crear niveles equilibrados e interesantes
Los motores de ajedrez a menudo usan variantes de hill climbing para evaluar y optimizar secuencias de movimientos.
6. Negocio y operaciones
Aplicaciones prácticas:
- Optimización de la cadena de suministro: rutas de reparto eficientes
- Planificación de recursos: turnos de personal o uso de máquinas
- Gestión de carteras: equilibrar inversiones
- Gestión de inventario: optimizar niveles de stock
Una empresa de reparto puede usar hill climbing para optimizar rutas continuamente según el tráfico y las prioridades.
Aunque hill climbing no siempre halla la solución absolutamente óptima, su sencillez y eficiencia lo hacen valioso en estos casos reales. Es especialmente útil cuando:
- Se necesitan soluciones rápidas
- El espacio de búsqueda es demasiado grande para explorarlo por completo
- Las soluciones aproximadas son aceptables
- El espacio de soluciones es relativamente suave
- Puede combinarse con otras técnicas para mejores resultados
Conclusión
Hill climbing es un algoritmo fundamental en inteligencia artificial que ofrece un enfoque directo y potente para problemas de optimización.
Hemos visto cómo esta idea de avanzar iterativamente hacia soluciones mejores se aplica a retos complejos en machine learning, robótica, PLN y operaciones de negocio.
Aunque tiene limitaciones, como atascarse en óptimos locales, estrategias como los reinicios aleatorios y el recocido simulado ayudan a sortear estos obstáculos con eficacia.
A medida que la IA avanza, hill climbing sigue siendo relevante no solo como herramienta práctica, sino también como base para comprender algoritmos de optimización más complejos. Su naturaleza intuitiva lo convierte en un excelente punto de partida para quienes se inician en IA, y su versatilidad asegura su uso continuo en aplicaciones reales.
Tanto si optimizas pesos de redes neuronales, planificas rutas de robots o gestionas carteras de inversión, los principios de hill climbing aportan claves sobre cómo los ordenadores pueden encontrar sistemáticamente soluciones mejores a problemas difíciles.
Si quieres aprender más sobre IA y sus algoritmos, echa un vistazo a estos recursos:
Preguntas frecuentes sobre el algoritmo hill climbing
¿Cuál es la diferencia entre hill climbing simple y hill climbing de mayor pendiente?
Hill climbing simple se mueve a la primera solución mejor que encuentra, mientras que hill climbing de mayor pendiente evalúa todas las soluciones vecinas antes de elegir la mejor. El simple es más rápido pero puede perder opciones superiores; el de mayor pendiente es más exhaustivo pero más lento. Piensa en el simple como tomar el primer sendero que sube, y en el de mayor pendiente como revisar todos los caminos antes de elegir el más empinado.
¿Cómo maneja hill climbing el atasco en máximos locales?
Hill climbing puede atascarse en máximos locales (colinas pequeñas) cuando no hay soluciones mejores inmediatas, aunque existan en otra parte. Para afrontarlo, se usan técnicas como reinicios aleatorios (empezar desde varios puntos al azar) y recocido simulado (aceptar a veces soluciones peores). Estas estrategias ayudan a explorar más el espacio de soluciones y a encontrar opciones superiores.
¿Cuándo debería usar hill climbing en lugar de otros algoritmos de optimización?
Hill climbing encaja mejor cuando: 1) el espacio de soluciones es relativamente suave, con mejoras graduales; 2) valen soluciones aproximadas rápidas; 3) el espacio es demasiado grande para una búsqueda exhaustiva; y 4) los recursos de cómputo son limitados. Es especialmente eficaz en ajuste de hiperparámetros, optimización de carteras y planificación de rutas. Para problemas muy complejos con muchos óptimos locales, valora algoritmos más sofisticados como algoritmos genéticos o recocido simulado.
¿Cómo puedo implementar hill climbing para mi problema específico?
Para implementarlo en tu problema necesitas definir tres piezas clave: 1) cómo representar una solución (estado), 2) una función objetivo que evalúe su calidad, y 3) un método para generar vecinos. En optimización de carteras, el estado son los pesos de inversión, la función objetivo evalúa retorno vs. riesgo y los vecinos son distribuciones de pesos ligeramente distintas. El artículo incluye una implementación en Python que puedes adaptar a tu caso.
