Búsqueda local y recocido simulado: un viajante por las capitales regionales checas
El problema de optimización, el problema del viajante, la ascensión de colinas con el vecindario 2-opt, los mínimos locales y los reinicios, el recocido simulado, la temperatura y el esquema de enfriamiento — sobre una ruta por trece capitales regionales con un óptimo conocido.
Serie Fundamentos de IA Parte 26 de 52
- Mapa de la inteligencia artificial: qué es cada cosa y cómo encaja todo
- Breve historia de la inteligencia artificial: de Turing a los modelos de lenguaje
- Datos, modelo, entrenamiento, inferencia: los conceptos básicos en un solo ejemplo
- Cómo leer la notación matemática: símbolos, subíndices, sumatorios y cuantificadores
- Conjuntos y relaciones: las piezas con las que se construyen las definiciones en IA
- Funciones y aplicaciones: por qué todo modelo de IA es una función
- Lógica y demostraciones: las reglas con las que se razona en IA
- Grafos y árboles: la estructura sobre la que se apoyan la búsqueda y las redes neuronales
- Álgebra lineal para aprendizaje automático: vectores, matrices y por qué la IA sobre todo multiplica
- Derivadas, gradiente y regla de la cadena: cómo sabe un modelo en qué dirección aprender
- Descenso de gradiente: cómo aprende un modelo
- Qué es la probabilidad: del lanzamiento de un dado a los axiomas de Kolmogórov
- Probabilidad condicionada y teorema de Bayes: cómo cambiar una estimación cuando te enteras de algo nuevo
- Variable aleatoria y función de distribución: una sola función que lo dice todo sobre la distribución
- Función de densidad y función de probabilidad: por qué una variable continua tiene probabilidad cero en cada punto
- Esperanza, varianza y covarianza: dónde está una distribución, qué anchura tiene y qué se relaciona con qué
- Resumen de las distribuciones de probabilidad: Bernoulli, binomial, Poisson, uniforme, normal y exponencial
- Ley de los grandes números y teorema central del límite: por qué las medias se comportan de forma tan predecible
- Estadística y estimación de parámetros: máxima verosimilitud, MAP e intervalos de confianza
- Teoría de la información: entropía, entropía cruzada y divergencia KL, el origen de las funciones de pérdida
- Búsqueda en el espacio de estados: BFS, DFS, UCS y A* con animaciones
- Juegos y adversarios: minimax, poda alfa-beta y Monte Carlo tree search
- Satisfacción de restricciones: backtracking, propagación de restricciones y AC-3 con un sudoku y un mapa de regiones checas
- Lógica y sistemas basados en conocimiento: encadenamiento hacia delante y hacia atrás, resolución y sistemas expertos
- Planificación: STRIPS, el mundo de bloques, heurísticas a partir de la relajación y la planificación en los agentes de IA
- Búsqueda local y recocido simulado: un viajante por las capitales regionales checas
- Algoritmos genéticos: población, cruce, mutación y selección en una mochila para la excursión
- Estrategias evolutivas y programación genética: de la regla de un quinto a la ley de Kepler
- Optimización por colonia de hormigas: cómo un rastro de feromona encuentra un camino corto
- Optimización por enjambre de partículas: inercia, experiencia propia y experiencia del enjambre
- Neuroevolución: evolución de los pesos y la forma de las redes neuronales, y el algoritmo NEAT
- Conjuntos difusos y funciones de pertenencia: cómo escribir «algo cálido»
- Lógica difusa y probabilidad: por qué «algo cálido» no significa «probablemente cálido»
- Lógica difusa: t-normas, implicaciones y reglas SI–ENTONCES
- Control difuso: Mamdani y Sugeno, del ventilador al péndulo invertido sobre un carro
- Agrupamiento difuso: el algoritmo fuzzy c-means y los puntos entre clusters
- Sistemas neuro-difusos (ANFIS): reglas difusas que aprenden de los datos
- Cadenas de Markov: matriz de transición, distribución estacionaria y PageRank
- Modelos ocultos de Márkov: el algoritmo de Viterbi y el casino deshonesto
- Redes bayesianas: por qué está mojada la hierba y qué significa eso para el aspersor
- El filtro de Kalman: cómo estimar a partir de mediciones imprecisas dónde está un coche y a qué velocidad va
- Tipos de aprendizaje automático: supervisado, no supervisado, semisupervisado y más
- Prompts, contexto y RAG: cómo darle a un modelo la información correcta
- Autocodificadores variacionales (VAE): imágenes nuevas a partir de un espacio latente continuo
- Redes generativas adversarias (GAN): el falsificador contra el detective
- Modelos de difusión: cómo el ruido puro se convierte en una imagen
- Procesos de decisión de Markov: estados, acciones, recompensas y ecuaciones de Bellman
- Q-learning y DQN: aprender el valor de las acciones, de la tabla a la red neuronal
- Gradiente de la política y PPO: aprender directamente la política
- Cómo funciona un agente de IA: un modelo de lenguaje en un bucle con herramientas
- Programación con agentes de IA: encargo, pruebas y revisión
- Evaluación y seguridad de los sistemas de IA: cómo medir y cómo vigilar
Temario completo de la serie 52 de 83 temas publicados
- Por qué la ascensión de colinas se queda atascada en un mínimo local y cuándo ayudan los reinicios aleatorios.
- Cómo el recocido simulado acepta pasos peores y por qué la temperatura y el esquema de enfriamiento importan tanto.
- Dónde vive hoy la misma idea — del diseño de chips a la temperatura de los modelos de lenguaje.
Conviene conocer antes: Búsqueda en el espacio de estados: BFS, DFS, UCS y A* con animaciones
El herrero que quiere una hoja resistente no deja que el metal al rojo se enfríe de golpe: lo enfría despacio. Así los átomos tienen tiempo de encontrar una disposición regular con la menor energía. Si enfriara el metal de una vez, los átomos se quedarían congelados donde estuvieran y la hoja sería frágil. En 1983 unos físicos se dieron cuenta de que exactamente eso les pasa también a los algoritmos que buscan la mejor solución: si solo van «cuesta abajo», se congelan en el primer hoyo. Así nació el recocido simulado — y con él una de las ideas más útiles de la optimización.
Con esta parte empieza el módulo sobre algoritmos inspirados en la naturaleza. Continúa la parte Búsqueda en el espacio de estados, donde la ascensión de colinas y el recocido aparecieron por primera vez.
1. El problema de optimización
Definición — problema de optimización y vecindario
Se da un conjunto de soluciones factibles S y una función objetivo f : S → ℝ. Buscamos s* = argmins ∈ S f(s) — la solución con el menor valor (en la maximización, al revés).
Un vecindario es una aplicación N : S → 2S que asigna a cada solución el conjunto de soluciones «vecinas», las que se obtienen de ella con un pequeño cambio. Una solución s es un mínimo local si f(s) ≤ f(s′) para todo s′ ∈ N(s), y un mínimo global si se cumple para todo s′ ∈ S.
A diferencia de un laberinto, no nos interesa el camino hacia la solución, sino la solución misma: la ruta más corta, el mejor horario, la distribución más barata. La función objetivo dice lo buena que es una solución. El vecindario dice qué son los «pequeños retoques» — y un mínimo local es una solución que ningún pequeño retoque puede mejorar, aunque cerca pueda haber otra mucho mejor.
2. El problema del viajante
Un viajante tiene que recorrer las trece capitales regionales de Chequia, pasar por cada una exactamente una vez y volver al punto de partida. ¿Qué ruta es la más corta? Las distancias las medimos en línea recta.
Definición — problema del viajante (TSP)
Se dan n ciudades y las distancias d(i, j). Una solución es una permutación cíclica π de las ciudades; su longitud es f(π) = ∑k=1n d(πk, πk+1), donde πn+1 = π1.
Hay (n − 1)! / 2 circuitos distintos (sin importar dónde ni en qué sentido empiezan). La versión de decisión del problema es NP-completa.
Para 13 ciudades hay 239 500 800 rutas posibles. Para veinte ya son más de 60 000 billones. Probarlas todas es imposible, y nadie conoce un algoritmo que en general encuentre la ruta más corta de forma sustancialmente más rápida que en tiempo exponencial.
número de circuitos = n! / (n · 2) = (n − 1)! / 2
- n!
- todos los órdenes en que se pueden enumerar n ciudades — ese es el número de permutaciones; pero cada circuito aparece contado entre ellas varias veces
- n
- un circuito no tiene principio: Praha → Brno → … → Praha es el mismo recorrido que Brno → … → Praha → Brno. Cada circuito puede empezar en cualquiera de las n ciudades, de ahí n veces menos
- 2
- la distancia de ida es la misma que la de vuelta, así que un circuito recorrido al revés es el mismo recorrido con la misma longitud
Ejemplo — la distancia en línea recta de Praha a Brno
Las ciudades vienen dadas por la latitud φ y la longitud λ en grados. Dentro de Chequia basta una proyección plana aproximada: un grado de latitud mide 110,57 km y un grado de longitud 111,32 · cos φ0 km, donde φ0 = 49,8° es el centro del país (los meridianos convergen hacia el polo). Entonces
d(i, j) = √( (71,85 · Δλ)2 + (110,57 · Δφ)2 ).
Praha (50,08° N, 14,42° E), Brno (49,20°, 16,61°)
Δλ = 2,19° → 71,85 · 2,19 = 157,35 km hacia el este
Δφ = −0,88° → 110,57 · 0,88 = 97,30 km hacia el sur
d = √(157,352 + 97,302) = √(24 759 + 9 467) = √34 226 ≈ 185,0 km
Frente al cálculo exacto sobre una esfera, el error a estas distancias ronda el 1 %; para comparar rutas no importa.
Trece ciudades son todavía pocas para calcular el óptimo de forma exacta — con la programación dinámica de Held–Karp sobre subconjuntos de ciudades, que necesita 2n · n2 pasos en lugar de (n − 1)!. El circuito más corto mide 1 060,4 km. Gracias a ello veremos con exactitud lo cerca del óptimo que llega cada uno de los algoritmos siguientes:
Algoritmo — programación dinámica de Held–Karp (1962)
Numeremos las ciudades 0, …, n − 1 y empecemos en la ciudad 0. Para cada conjunto de ciudades M ∋ 0 y cada ciudad j ∈ M, sea D(M, j) la longitud del camino más corto que sale de 0, pasa exactamente por las ciudades de M y termina en j. Entonces
D({0}, 0) = 0, D(M, j) = mink ∈ M ∖ {j} [ D(M ∖ {j}, k) + d(k, j) ],
y la longitud del circuito óptimo es minj ≠ 0 [ D(todas las ciudades, j) + d(j, 0) ]. Hay como mucho 2n · n valores de D, y cada uno es el mínimo de como mucho n números.
n = 13: 213 · 132 = 8 192 · 169 = 1 384 448 pasos
recorrer todos los órdenes desde un inicio fijo: 12! = 479 001 600 — unas 346 veces más
Cómo hayas pasado por Plzeň, Karlovy Vary y Ústí no importa para el resto del viaje, salvo dos cosas: qué ciudades llevas ya a tus espaldas y dónde estás ahora mismo. Basta, pues, con recordar el camino más corto para cada uno de esos pares, no todos los órdenes. Para 13 ciudades es rápido, pero 2n sigue creciendo de forma exponencial — para 60 ciudades la tabla tendría más de 1019 filas.
3. Ascensión de colinas y el vecindario 2-opt
Definición — el movimiento 2-opt
Un movimiento 2-opt quita del circuito dos aristas no adyacentes (a, b) y (e, f) y las sustituye por las aristas (a, e) y (b, f) — es decir, invierte el orden de las ciudades entre b y e. La longitud cambia en Δ = d(a, e) + d(b, f) − d(a, b) − d(e, f). El vecindario de una ruta por n ciudades tiene (n − 1)(n − 2) / 2 movimientos.
Donde una ruta se cruza consigo misma, casi seguro que es más larga de lo necesario. El movimiento 2-opt deshace el cruce: corta la ruta en dos puntos y da la vuelta a uno de los trozos. El cambio de longitud se calcula con cuatro distancias; no hace falta recalcular toda la ruta.
Δ = d(a, e) + d(b, f) − (d(a, b) + d(e, f))
- Δ
- cuánto se alarga el circuito; un Δ negativo significa que se acorta. Tanto la ascensión de colinas como el recocido deciden según su signo, por eso necesitamos calcularlo de forma barata
- d(a, e) + d(b, f)
- las dos aristas nuevas con las que volvemos a unir los extremos cortados — se suman porque la ruta las gana
- d(a, b) + d(e, f)
- las dos aristas que hemos cortado — se restan porque desaparecen de la ruta. El tramo entre b y e solo se recorre al revés y las distancias son simétricas, así que su longitud no cambia y no aparece en la fórmula
Algoritmo — ascensión de colinas (descenso más pronunciado)
Empieza desde una solución aleatoria s. Repite: encuentra s′ ∈ N(s) con la menor f(s′); si f(s′) < f(s), pasa a s′; si no, termina — s es un mínimo local.
Pruebas todas las formas de deshacer cruces, eliges la que más acorta la ruta y repites. Cuando ya ninguna ayuda, te detienes. Para trece ciudades son 66 movimientos por paso.
def delta(c, i, j): # movimiento 2-opt: invierte c[i..j]
a, b = c[i - 1], c[i]
e, f = c[j], c[(j + 1) % len(c)]
return d(a, e) + d(b, f) - d(a, b) - d(e, f)
def horolezec(c):
n = len(c)
while True:
tahy = [(i, j) for i in range(1, n - 1) for j in range(i + 1, n)]
i, j = min(tahy, key=lambda t: delta(c, *t)) # descenso más pronunciado
if delta(c, i, j) >= 0: # nada acorta la ruta
return c # mínimo local
c = c[:i] + c[i:j + 1][::-1] + c[j + 1:]
La primera ciudad la dejamos en su sitio (i ≥ 1) — un circuito no tiene principio, así que moverla no aportaría nada nuevo. Para n = 13, los pares 1 ≤ i < j ≤ 12 dan exactamente 12 · 11 / 2 = 66 movimientos.
Desde un circuito aleatorio de 2 402 km, la ascensión de colinas llega en 8 pasos a 1 065,8 km — y ahí se detiene. Al óptimo le faltan solo 5 km, pero ya ningún movimiento 2-opt por sí solo acorta la ruta. El escalador está en un mínimo local y no lo sabe:
4. Dónde se atasca el escalador
De cien inicios aleatorios, la ascensión de colinas terminó en el óptimo 61 veces. En los 39 casos restantes se quedó atascada en otro sitio, en el peor de ellos en 1 162,6 km — cien kilómetros más. Las trampas son tres:
- Mínimo local — un hoyo del que todo paso lleva cuesta arriba.
- Meseta — todos los vecinos son igual de buenos, así que el escalador no sabe adónde ir.
- Cresta — existe una buena dirección, pero no coincide con ningún movimiento individual; solo se llega a ella pasando por soluciones peores.
Ejemplo — por qué el escalador no sale de 1 065,8 km
La ascensión de colinas desde el primer inicio terminó en el circuito Zlín → Ostrava → Olomouc → Pardubice → Hradec Králové → Liberec → Ústí nad Labem → Karlovy Vary → Plzeň → Praha → České Budějovice → Jihlava → Brno → Zlín. Calculamos Δ para los 66 movimientos 2-opt: uno de ellos (invertir todo salvo la primera ciudad) da el mismo circuito en sentido contrario y Δ = 0; todos los demás alargan la ruta. El más barato de ellos invierte el par Pardubice – Hradec Králové:
a = Olomouc, b = Pardubice, e = Hradec Králové, f = Liberec
Δ = d(a, e) + d(b, f) − d(a, b) − d(e, f)
= 122,9 + 95,9 − 116,8 − 83,0 = +19,0 km
Así que cualquier movimiento individual alarga la ruta al menos 19,0 km — y eso que el óptimo es solo 5,4 km más corto. El camino hacia él pasa por circuitos peores, y esos el escalador no los acepta nunca.
El remedio más sencillo son los reinicios aleatorios: lanzar al escalador de nuevo desde otro punto y quedarse con el mejor resultado. Si un inicio tiene éxito con probabilidad 0,61, de cinco inicios al menos uno tendrá éxito con probabilidad 1 − 0,395 ≈ 99 %. Para un problema pequeño basta. En uno grande hay millones de hoyos y harían falta demasiados reinicios.
Pr = 1 − (1 − p)r
- Pr
- la probabilidad de que al menos uno de los r inicios encuentre el óptimo — la calculamos mediante el complemento, porque «al menos uno» tiene muchas formas, mientras que «ninguno» solo una
- 1 − p
- la probabilidad de que un inicio fracase (en nuestro caso 0,39 de cien intentos)
- r
- el número de inicios en el exponente: los inicios son independientes (cada uno tiene una semilla aleatoria distinta), así que las probabilidades de fracaso se multiplican
5. Recocido simulado
Algoritmo — recocido simulado
Empieza desde una solución aleatoria s con una temperatura inicial T0. En cada iteración:
- elige un vecino aleatorio s′ ∈ N(s) y calcula Δ = f(s′) − f(s);
- si Δ ≤ 0, pasa a s′; si no, pasa a él con probabilidad e−Δ/T (el criterio de Metropolis);
- baja la temperatura según el esquema de enfriamiento, por ejemplo T ← α · T con 0 < α < 1.
Devuelve la mejor solución que hayas visto por el camino.
Un escalador que de vez en cuando se permite un paso en la dirección equivocada. Al principio, mientras «hace calor», da muchos pasos así — salta de hoyo en hoyo y explora todo el paisaje. A medida que se enfría, se vuelve cada vez más prudente, y al final ya solo desciende al valle más profundo que ha encontrado por el camino. Un empeoramiento pequeño lo acepta con más facilidad que uno grande.
P(aceptar) = min(1, e−Δ / T)
- P(aceptar)
- la probabilidad con la que pasamos al vecino propuesto; en el programa sorteamos u de forma uniforme en [0, 1) y aceptamos el movimiento cuando u < P
- min(1, …)
- para una mejora (Δ ≤ 0) la exponencial es ≥ 1 y una probabilidad no puede pasar de 1 — así que un paso mejor se acepta siempre, igual que en la ascensión de colinas
- Δ
- cuánto peor es el vecino, en km. Está en el exponente con signo negativo, así que cada kilómetro más de empeoramiento multiplica la probabilidad por el mismo número menor que 1 — los empeoramientos grandes son exponencialmente más raros que los pequeños
- T
- la temperatura, en las mismas unidades que Δ (km). Divide a Δ y con ello fija la escala: un empeoramiento de T km pasa con probabilidad 1/e ≈ 0,37 a cualquier temperatura. Una T alta hace «pequeños» los empeoramientos grandes; T → 0 los prohíbe todos
La regla para aceptar un paso peor viene de la física: en 1953 Nicholas Metropolis y sus colegas la usaron para simular átomos en equilibrio térmico, donde la probabilidad de un estado con energía E es proporcional a e−E/kT. Para la optimización la adaptaron de forma independiente en 1983 Kirkpatrick, Gelatt y Vecchi, de IBM — y dos años después, también de forma independiente, el físico eslovaco Vladimír Černý, precisamente sobre el problema del viajante.
import math, random
def zihani(c, T0=200, Tk=0.5, K=10_000):
alfa = (Tk / T0) ** (1 / K) # enfriamiento geométrico
T, delka = T0, delka_okruhu(c)
nej, nej_delka = c, delka
for k in range(K):
i, j = sorted(random.randint(1, len(c) - 1) for _ in range(2))
if i != j: # i = j: ningún movimiento
D = delta(c, i, j)
if D <= 0 or random.random() < math.exp(-D / T):
c = c[:i] + c[i:j + 1][::-1] + c[j + 1:]
delka += D
if delka < nej_delka:
nej, nej_delka = c, delka
T *= alfa
return nej
Así es en la realidad: las seis primeras iteraciones de nuestra ejecución y seis iteraciones de su mitad. p es la probabilidad de aceptación min(1, e−Δ/T), u el número sorteado; un movimiento que empeora pasa cuando u < p.
| k | T | Δ (km) | p | u | Aceptado | Longitud (km) |
|---|---|---|---|---|---|---|
| 1 | 200,0 | −310,0 | 1,000 | — | sí | 1 941,4 |
| 2 | 199,9 | +26,5 | 0,876 | 0,293 | sí | 1 967,9 |
| 3 | 199,8 | −49,2 | 1,000 | — | sí | 1 918,7 |
| 4 | 199,6 | −111,2 | 1,000 | — | sí | 1 807,5 |
| 5 | 199,5 | +146,6 | 0,480 | 0,144 | sí | 1 954,1 |
| 6 | 199,4 | −127,8 | 1,000 | — | sí | 1 826,3 |
| 5001 | 10,0 | +147,3 | 4,0 · 10−7 | 0,065 | no | 1 060,4 |
| 5002 | 10,0 | +86,2 | 1,8 · 10−4 | 0,838 | no | 1 060,4 |
| 5003 | 10,0 | — (i = j) | — | — | no | 1 060,4 |
| 5004 | 10,0 | +73,0 | 6,6 · 10−4 | 0,660 | no | 1 060,4 |
| 5005 | 10,0 | +82,4 | 2,6 · 10−4 | 0,747 | no | 1 060,4 |
| 5006 | 10,0 | +212,1 | 5,8 · 10−10 | 0,262 | no | 1 060,4 |
Al principio, con T ≈ 200, pasa incluso un movimiento que alarga la ruta 146,6 km — la probabilidad es 0,48 y salió u = 0,14. A mitad de la ejecución T = 10 y la ruta ya está en el óptimo; los movimientos que la alargarían 70 kilómetros o más tienen una probabilidad inferior al uno por mil y se rechazan todos. A veces los dos números aleatorios caen en el mismo sitio (i = j) y la iteración no propone nada — en toda la ejecución ocurrió 824 veces.
Teorema — la distribución de Boltzmann (formulación actual)
Si mantenemos fija la temperatura T y proponemos los vecinos de forma simétrica (el vecino s′ se propone desde s con la misma probabilidad que s desde s′ — en 2-opt se cumple, porque el mismo movimiento (i, j) lleva también de vuelta), el proceso de Metropolis es una cadena de Markov cuya distribución estacionaria es
πT(s) = e−f(s)/T / Z(T)
- πT(s)
- con qué frecuencia, tras vagar mucho tiempo a la temperatura T, nos encontramos en la solución s
- e−f(s)/T
- el peso de una solución: cuanto más corta la ruta f(s), mayor. Es exactamente el peso que equilibra el criterio de Metropolis — el cociente de los pesos de dos vecinos es e−Δ/T
- Z(T)
- la suma de los pesos de todas las soluciones; dividimos por ella para que las probabilidades sumen 1
Demostración (condición de equilibrio detallado): para vecinos con f(s′) = f(s) + Δ, Δ > 0, el flujo de s a s′ es proporcional a π(s) · e−Δ/T y el flujo de vuelta a π(s′) · 1. Para π = πT ambas expresiones valen e−f(s′)/T / Z, los flujos se igualan y la distribución ya no cambia.
óptimo (1 060,4 km) frente a la trampa del escalador (1 065,8 km): cociente de frecuencias e5,38/T
T = 100: 1,06 T = 10: 1,71 T = 1: 217 T = 0,5: 47 089
A temperatura alta, el recocido está casi con la misma frecuencia en el óptimo que en la trampa cinco kilómetros más larga — no los distingue. A medida que baja la temperatura, el peso se desplaza hacia las rutas más cortas: con T = 1 el óptimo es doscientas veces más frecuente, con 0,5 casi cincuenta mil veces. El enfriamiento va «afilando» así la distribución hasta que solo queda el valle más profundo. El problema es que solo alcanza el equilibrio una cadena que tiene tiempo de sobra para vagar — de ahí el enfriamiento lento.
6. Temperatura y esquema de enfriamiento
¿Qué probabilidad tiene un paso que alarga la ruta 20 km? Depende de la temperatura:
| Temperatura T | 200 | 50 | 10 | 2 | 0,5 |
|---|---|---|---|---|---|
| e−20/T | 0,905 | 0,670 | 0,135 | 0,000 05 | ≈ 4 · 10−18 |
A 200 pasa casi cualquier paso que empeora; a 0,5, ninguno — en ese momento el recocido se comporta como la ascensión de colinas. El esquema de enfriamiento decide cuánto tiempo «vaga» el algoritmo y cuánto «desciende». La salida más barata de la trampa del escalador (+19,0 km, ver más arriba) pasaría con T = 50 con probabilidad 0,68, con T = 10 con 0,15 y con T = 2 prácticamente nunca.
Tk = T0 · αk, α = (TK / T0)1/K
- Tk
- la temperatura en la iteración k-ésima — determina qué empeoramientos se aceptan todavía en ese momento
- T0
- la temperatura inicial; se elige de modo que al principio pase la mayoría de los empeoramientos — aquí 200 km, más que un movimiento 2-opt típico sobre una ruta aleatoria
- α
- el coeficiente de enfriamiento, justo por debajo de 1; lo calculamos a partir de la temperatura final TK y del número de iteraciones K, para que la ejecución termine exactamente donde queremos
- k
- el número de iteración en el exponente: cada iteración multiplica la temperatura por el mismo número, así que en el mismo número de iteraciones la temperatura baja siempre en la misma proporción — de 200 a 100 se tarda lo mismo que de 1 a 0,5
α = (0,5 / 200)1/10 000 = 0,00250,0001 = 0,999401
la temperatura se reduce a la mitad cada ln 0,5 / ln α ≈ 1 157 iteraciones
T1 000 = 109,9, T3 000 = 33,1, T5 000 = √(200 · 0,5) = 10,0
Teorema — convergencia del recocido
Si la temperatura baja lo bastante despacio, de forma logarítmica: Tk = c / ln(k + 1) con una constante c lo bastante grande, la probabilidad de que el recocido termine en el mínimo global tiende a uno al crecer el número de iteraciones (Hajek, 1988).
«Lo bastante grande» significa exactamente c ≥ d*, donde d* es la profundidad del mínimo local no global más profundo: lo mínimo que tiene que subir un camino que sale de él antes de llegar a una solución mejor.
si bastara c = 20 km, la temperatura 0,5 no llegaría hasta ln(k + 1) = 20 / 0,5 = 40,
es decir, tras k ≈ e40 ≈ 2,4 · 1017 iteraciones — unos mil millones de veces más que todos los 239 500 800 circuitos
Si enfrías infinitamente despacio, encontrarás el óptimo con seguridad. Pero el enfriamiento logarítmico es tan lento que tardaría más que buscar en todo. Por eso en la práctica se enfría de forma geométrica — rápido, sin garantías, pero con resultados que normalmente bastan.
7. Recocido sobre las capitales regionales
Lancemos el recocido sobre el mismo problema: 10 000 iteraciones, con la temperatura bajando de forma geométrica de 200 a 0,5. El mapa muestra cómo era la ruta al principio y tras 1 000, 3 000, 5 000 y 10 000 iteraciones:
Tras mil iteraciones la ruta sigue siendo caótica (1 985 km) — a temperatura alta el recocido acepta casi todo. Tras tres mil ya tiene forma (1 159 km), y tras cinco mil está en el óptimo, 1 060,4 km. De los 1 498 movimientos aceptados, 695 fueron de empeoramiento; la ascensión de colinas no habría hecho ni uno solo de ellos. El gráfico muestra cómo la longitud de la ruta salta arriba y abajo hasta que baja la temperatura:
El paso de vagar a descender se ve también en el número de movimientos aceptados en cada millar de iteraciones: 597, 411, 232, 104, 35, 35, 26, 21, 26, 11. En el primer millar, cuando T está entre 200 y 110, se acepta más de la mitad de las propuestas. A partir del quinto millar (T por debajo de 20), ya solo decenas; de ellas, 37 fueron de empeoramiento, y 26 de estas, pequeñas, de menos de 3 km.
Y no es la suerte de una sola ejecución: de cien ejecuciones con semillas distintas, 98 terminaron en el óptimo y las otras dos a menos de 3 km. Frente al 61 % de la ascensión de colinas desde un solo inicio, la diferencia es grande.
8. Cuándo compensa el recocido
Para ser justos: el recocido hizo 10 000 iteraciones, y la ascensión de colinas desde un inicio, solo unas seiscientas evaluaciones. En un problema pequeño, la ascensión de colinas con reinicios habría obtenido lo mismo por el mismo coste. La diferencia se ve en un problema mayor. Tomemos 60 ciudades colocadas al azar y demos a ambos algoritmos el mismo presupuesto — 200 000 movimientos 2-opt evaluados:
| Algoritmo | Longitud de la mejor ruta |
|---|---|
| Ascensión de colinas con reinicios aleatorios | 2 312,5 km |
| Recocido simulado (tres ejecuciones) | 2 209,8 – 2 269,8 km |
La ascensión de colinas solo cupo dos veces en el presupuesto: con 60 ciudades el vecindario tiene 1 711 movimientos y el descenso más pronunciado los examina todos en cada paso. El recocido prueba un movimiento aleatorio cada vez y reparte el mismo presupuesto en explorar todo el paisaje. Cada una de sus tres ejecuciones terminó mejor que la ascensión de colinas.
9. El recocido en la inteligencia artificial y más allá
- Diseño de chips y horarios. La colocación de componentes en un chip fue una de las primeras grandes aplicaciones del recocido en los años ochenta; hoy se sigue usando para horarios, rutas de vehículos o la distribución de almacenes.
- Entrenamiento de redes neuronales. El descenso de gradiente estocástico calcula el gradiente a partir de un pequeño lote de datos, así que cada paso es un poco aleatorio — igual que el recocido, puede escaparse de un hoyo poco profundo. Los esquemas de tasa de aprendizaje que la van reduciendo poco a poco se llaman incluso cosine annealing (recocido coseno).
- La temperatura de los modelos de lenguaje. Cuando un modelo de lenguaje elige la siguiente palabra, divide las puntuaciones de las palabras por una temperatura T y con la función softmax las convierte en probabilidades proporcionales a ez/T — la misma fórmula de Boltzmann. Una temperatura alta significa un texto más creativo y arriesgado; una baja, uno más prudente y predecible.
- Recocido cuántico. Ordenadores especializados (por ejemplo, D-Wave) buscan el mínimo de energía físicamente, aprovechando fenómenos cuánticos. Si son más rápidos que los algoritmos clásicos, y cuándo, sigue siendo objeto de investigación.
Ejemplo — la temperatura al elegir la siguiente palabra
Un modelo da a tres candidatas a siguiente palabra las puntuaciones z = (2, 1, 0). La probabilidad de la i-ésima palabra es pi = ezi/T / ∑j ezj/T — la distribución de Boltzmann de la sección sobre el recocido, solo que con la «energía» −z.
T = 1: (e2, e1, e0) = (7,39; 2,72; 1), suma 11,11 → 0,665; 0,245; 0,090
T = 0,5: (e4, e2, 1) = (54,6; 7,39; 1), suma 62,99 → 0,867; 0,117; 0,016
T = 2: (e1, e0,5, 1) = (2,72; 1,65; 1), suma 5,37 → 0,506; 0,307; 0,186
Una temperatura más baja desplaza la probabilidad hacia la mejor candidata (con T → 0 siempre gana ella); una más alta la reparte también entre palabras menos probables — igual que el recocido a temperatura alta acepta también rutas peores.
10. Resumen
- Un problema de optimización busca la solución con el mejor valor de la función objetivo; la búsqueda local se mueve por el vecindario de la solución actual.
- La ascensión de colinas va siempre al vecino mejor y se queda atascada en un mínimo local — en las capitales regionales, en 39 de 100 inicios. Los reinicios aleatorios ayudan en problemas pequeños.
- El recocido simulado acepta también pasos peores, con probabilidad e−Δ/T; al bajar la temperatura pasa de la exploración al descenso.
- En las capitales regionales encontró el óptimo en 98 de 100 ejecuciones; en un problema mayor superó a la ascensión de colinas con el mismo presupuesto.
- La misma fórmula de Boltzmann vive en la temperatura de los modelos de lenguaje, y la idea del enfriamiento, en los esquemas de aprendizaje de las redes neuronales.
¿Quieres probarlo tú? Pide a un agente de IA que escriba un recocido para una ruta tuya — por ejemplo, por los lugares que quieres visitar en vacaciones — y mira qué pasa si enfrías demasiado rápido.
¿Lo ves de otra manera? Escribe a support@coden-app.com.