Un recogedor (“jardinero”) de béisbol corre hacia atrás para atrapar una pelota alta. Podríamos describir lo que hace como un problema de balística: velocidad inicial, ángulo de salida, resistencia del aire, viento cruzado, y una integración rápida para predecir el punto de caída. Salvo que él no hace nada de eso. Lo que hace es fijar la mirada en la pelota y moverse de modo que el ángulo de su mirada se mantenga constante. Nada más. Si el ángulo sube, retrocede; si baja, avanza. No calcula dónde va a caer la pelota, y ni siquiera necesita saberlo: llega igual.
Eso es una heurística, y conviene entender por qué no es una versión chapucera del cálculo correcto. Una heurística es un procedimiento que llega a una solución razonablemente buena con información limitada, tiempo limitado y recursos limitados. Un algoritmo exacto promete la mejor respuesta posible tras recorrer todo el espacio de soluciones. La heurística renuncia a esa promesa y a cambio se lleva algo que en el mundo real vale más: llega a tiempo. Es una apuesta calculada. Esto probablemente funcione, y funcionará antes de que deje de importar.
Lo que hay debajo es una condición de la que no escapa nadie: no somos omniscientes. Ningún organismo con energía finita y un plazo puede permitirse evaluar todas las variables antes de actuar. El depredador que se detiene a calcular la trayectoria perfecta de su presa se muere de hambre; el que aplica “persigue lo que huye” come, sobrevive, y transmite la regla. Herbert Simon, economista y uno de los padres de la inteligencia artificial, le puso nombre a esto en los años cincuenta y acabó ganando el Nobel de Economía por ello. Lo llamó satisficing, un cruce entre satisfy y suffice: no buscamos la opción óptima, sino la primera que supera el listón de lo aceptable, porque seguir buscando también cuesta. La racionalidad no es evaluarlo todo. Es saber cuándo parar.
Dos psicólogos israelíes, Daniel Kahneman y Amos Tversky, se dedicaron en los años setenta a catalogar los atajos que usa la mente humana, y de ahí nació la economía conductual entera (Kahneman recibiría el Nobel en 2002; Tversky había muerto años antes). Entre ellos, la heurística de disponibilidad (juzgar la probabilidad de algo por lo fácil que resulta recordar un ejemplo) o la de anclaje (quedarse pegado al primer número que oyes). Solemos contarlas como defectos, y ahí se cuela un malentendido. Los sesgos no son averías del sistema: son la factura del atajo. La disponibilidad funciona espléndidamente cuando lo que recuerdas con facilidad es lo que de verdad ocurre a menudo, que es como fue durante casi toda la historia de nuestra especie. Falla cuando alguien te llena la memoria de accidentes de avión en horario de máxima audiencia. La regla no se ha vuelto tonta; el entorno para el que se calibró ha cambiado bajo sus pies.
Los refranes son exactamente eso, heurísticas comprimidas y transmisibles. “Más vale pájaro en mano que ciento volando” codifica aversión al riesgo ante ganancias inciertas, lo que la economía conductual formalizaría siglos después. “Hasta el cuarenta de mayo no te quites el sayo” es un modelo climático que funciona sin meteorología. Son algoritmos aproximados heredados por vía oral, y su virtud es que ninguna generación tiene que rehacer el cálculo desde cero.
En computación, esta misma lógica dejó de ser una comodidad para volverse la única salida. Muchos problemas reales son NP-difíciles: el número de combinaciones crece tan rápido que ningún ordenador podría recorrerlas todas antes de que el universo se enfríe. Ahí no hay heroísmo que valga. O podas el espacio de búsqueda, o no hay respuesta.
El caso más elegante de esa poda se llama A* (se pronuncia “A estrella”), un algoritmo de búsqueda de rutas inventado en 1968 para que un robot llamado Shakey, el primero capaz de razonar sobre sus propios movimientos, decidiera cómo cruzar una habitación sin tardar una eternidad en pensarlo. Hoy es lo que usa el buscaminutos de tu GPS y lo que mueve a los enemigos de casi cualquier videojuego. La idea es simple: para decidir qué camino explorar antes que otro, suma dos cosas, el coste real de lo ya recorrido y una estimación de lo que queda por recorrer.
import heapq
def a_star(grafo, inicio, meta, heuristica):
abiertos = [(0, inicio)]
costo_real = {inicio: 0}
padres = {inicio: None}
while abiertos:
_, actual = heapq.heappop(abiertos)
if actual == meta:
camino = []
while actual:
camino.append(actual)
actual = padres[actual]
return camino[::-1]
for vecino, costo in grafo[actual].items():
nuevo_costo = costo_real[actual] + costo
if vecino not in costo_real or nuevo_costo < costo_real[vecino]:
costo_real[vecino] = nuevo_costo
prioridad = nuevo_costo + heuristica(vecino, meta)
heapq.heappush(abiertos, (prioridad, vecino))
padres[vecino] = actual
return None
Esa función heuristica, típicamente la distancia en línea recta hasta la meta, no calcula la ruta: la intuye. Y aquí viene lo que casi todo el mundo cuenta mal. Si la estimación nunca se pasa, es decir, si jamás promete que falta menos de lo que realmente falta (lo que se llama una heurística admisible), entonces A* devuelve el camino óptimo. No uno aceptable: el mejor. Lo que compra la corazonada no es una respuesta peor a cambio de rapidez, sino la misma respuesta explorando una fracción del grafo. Y hay una forma preciosa de comprobarlo: pon la heurística a cero, es decir, quítale al algoritmo toda intuición sobre hacia dónde queda la meta, y A* se convierte exactamente en el algoritmo de Dijkstra, el método clásico de 1956 que encuentra el camino más corto explorando en todas las direcciones a la vez, como una mancha de aceite que se extiende. Dijkstra también acierta siempre. Solo que mira debajo de muchísimas más piedras. La intuición, bien acotada, no degrada el resultado. Solo evita el trabajo inútil.
Otros métodos sí pagan el precio clásico. El recocido simulado, los algoritmos genéticos o las estrategias voraces en el problema del viajante entregan soluciones “suficientemente buenas” sin garantía de ser las mejores. Y ahí está la distinción que de verdad importa, y que se pierde cuando metemos todas las heurísticas en el mismo saco: unas sacrifican optimalidad, otras solo sacrifican exhaustividad. Saber cuál tienes entre manos es la diferencia entre un atajo y una chapuza.
Porque las heurísticas fallan, y fallan de una manera reconocible: cuando el entorno deja de parecerse a aquel para el que se afinaron. El negociador que abre con una cifra absurda está explotando tu anclaje. El ave migratoria que se orienta por el sol se pierde bajo una tormenta que dura una semana. El atajo no es sabio, solo está bien ajustado a un mundo concreto, y ese mundo puede cambiar.
Aun así, no hay alternativa, y ese es el punto. La heurística no es una versión degradada del razonamiento perfecto: es la forma nativa de razonar de cualquier sistema, biológico o artificial, que tiene que actuar con reloj, con presupuesto y sin verlo todo. Es decir, de cualquier sistema. Lo contrario de la heurística no es la certeza. Es quedarse quieto mientras la pelota cae.