ELAI S.r.l.

¿El vehículo más cercano es siempre la mejor opción? De la predicción de IA a la asignación

Tres vehículos y tres solicitudes muestran por qué elegir localmente puede empeorar el plan: restricciones, prueba del óptimo y errores de predicción.

¿El vehículo más cercano es siempre la mejor opción? De la predicción de IA a la asignación

Predecir bien no significa decidir bien

Un servicio logístico recibe tres solicitudes a la vez. Un modelo de IA estima cuánto tardaría cada vehículo en llegar a cada cliente. En el primer ejemplo, las estimaciones son incluso exactas. ¿Basta con elegir repetidamente la pareja vehículo-cliente más cercana? No: asignar un vehículo a una solicitud lo deja fuera de las demás. Una elección conveniente por separado puede consumir un recurso mucho más útil en otro lugar. El problema no tiene por qué estar en el modelo predictivo, sino en la regla que convierte sus estimaciones en acciones.

Resumen. Construimos un caso reproducible sobre una línea, comparamos la elección voraz con la asignación de coste mínimo y demostramos su optimalidad mediante una cota inferior verificable. Añadimos una incompatibilidad vehículo-solicitud que convierte una decisión localmente sensata en un callejón sin salida y estudiamos cómo los errores de coste cambian la decisión. Distinguimos predicción, optimización y viabilidad. No usamos datos de flotas ni clientes reales, ni medimos rendimiento de IA o ahorros empresariales.

Un ejemplo lo bastante pequeño para comprobarlo

Imaginemos una carretera recta transitable en ambos sentidos. V1, V2 y V3 están en los kilómetros 0, 3 y 8; las solicitudes A, B y C, en 1, −2 y 10. El signo negativo indica una posición a la izquierda del origen. Suponemos velocidad constante de 1 km/min, sin tráfico y servicio inmediato al llegar. Cada vehículo recibe exactamente una solicitud y cada solicitud exactamente un vehículo. No construimos una ruta con varias paradas.

Para obtener el coste cᵢⱼ tomamos la distancia absoluta entre posiciones y la dividimos por la velocidad. Con la velocidad elegida, kilómetros y minutos tienen el mismo valor numérico. La matriz contiene todos los tiempos alternativos, no nueve viajes que se ejecutarán. Seleccionaremos solo tres celdas, una por fila y una por columna.

VehículoA (min)B (min)C (min)
V11210
V2257
V37102

La elección voraz y el coste de la oportunidad perdida

Definamos la regla local con precisión: entre todas las parejas disponibles elegimos la más barata y retiramos ese vehículo y esa solicitud. Es una estrategia voraz, o greedy, porque no reconsidera las decisiones anteriores. Empieza con V1→A, coste 1, y después V3→C, coste 2. Quedan V2 y B, coste 5. El total es 8 minutos-vehículo, suma de los tres tiempos; no son ocho minutos transcurridos si viajan simultáneamente.

Probemos V1→B, V2→A y V3→C: 2+2+2=6. La primera asignación cuesta un minuto más, pero permite a V2 llegar a A en dos minutos en vez de a B en cinco. Pagamos uno para ahorrar tres: mejoramos el total en dos minutos-vehículo. El contraejemplo refuta que elegir siempre el mínimo local produzca el mínimo global; no demuestra que toda decisión voraz sea mala ni que esa mejora porcentual se repita en una flota real.

Escribir el problema hace visibles sus restricciones

Sea xᵢⱼ igual a 1 si asignamos el vehículo i a la solicitud j, y 0 en caso contrario. Minimizamos la suma de costes de las celdas elegidas. Dos grupos de restricciones impiden asignar dos veces un vehículo o dejar una solicitud sin atender:

min Σᵢ Σⱼ cᵢⱼ xᵢⱼ Σⱼ xᵢⱼ = 1 ∀i Σᵢ xᵢⱼ = 1 ∀j xᵢⱼ ∈ {0,1}

Σ significa sumar sobre los índices indicados; ∀ significa «para cada uno». Cada fila y columna debe contener exactamente una elección. El objetivo es el tiempo total, no el del cliente peor atendido, el beneficio ni la equidad. Cambiar el objetivo puede cambiar la solución. Aunque en este ejemplo el plan de coste 6 también mejora el tiempo máximo, esa coincidencia no hace intercambiables suma y máximo en general.

Con tres vehículos existen 3!=6 asignaciones completas. La exclamación indica factorial: tres opciones para el primero, dos para el segundo y una para el tercero. El programa enumera todas y encuentra costes 6, 8, 16, 18, 22 y 22. El mínimo no depende de un intento afortunado. Enumerar cuesta O(n·n!) si sumamos n costes por permutación: es transparente con tres vehículos, pero no debe trasladarse así a grandes flotas.

Cómo demostrar que seis es realmente el mínimo

También podemos dar una prueba más compacta que la lista completa. A cada vehículo le asignamos un número uᵢ y a cada solicitud uno vⱼ, de modo que uᵢ+vⱼ nunca supere cᵢⱼ. No son precios facturados, sino cantidades matemáticas auxiliares. En cualquier plan completo, su suma es una cota inferior del coste, porque cada vehículo y cada solicitud aparecen exactamente una vez.

uᵢ + vⱼ ≤ cᵢⱼ Σᵢ Σⱼ cᵢⱼ xᵢⱼ ≥ Σᵢ uᵢ + Σⱼ vⱼ u = [2, 3, 2], v = [−1, 0, 0] Σu + Σv = 6

Comprobemos la primera fila: u₁+v da [1,2,2], sin superar [1,2,10]. La segunda da [2,3,3], bajo [2,5,7]; la tercera [1,2,2], bajo [7,10,2]. Todo plan cuesta al menos 6. Ya tenemos uno que cuesta 6: ninguno puede ser mejor. El −1 es válido porque estas cantidades no son tiempos físicos. Es un certificado dual: una prueba del óptimo verificable mediante nueve comparaciones y una suma, sin confiar en el nombre de un algoritmo.

El certificado demuestra optimalidad respecto a la matriz y las restricciones escritas. No demuestra que los tiempos previstos sean correctos ni que estén incluidas todas las restricciones operativas. Importa cuando un agente de IA llama «óptimo» a un plan: ¿respecto a qué datos, objetivo y decisiones permitidas? Una prueba matemática impecable puede describir un problema operativo equivocado.

Cuando una elección local deja una solicitud sin vehículo

Añadamos una restricción hipotética: V2 no puede atender B, por ejemplo porque carece de un requisito técnico del servicio. Es un parámetro del caso, no un juicio sobre una persona. Imponer x₂B=0 es más claro que inventar un tiempo enorme esperando que el algoritmo lo evite. Si un coste finito sigue permitido, podría seleccionarse en un caso difícil.

La regla voraz sigue eligiendo V1→A y V3→C, y se detiene ante la única pareja restante, ahora prohibida. El programa indica plan incompleto, no coste infinito de un servicio ejecutado. Sin embargo, V1→B, V2→A y V3→C sigue siendo viable y cuesta 6. Falla la secuencia de decisiones irrevocables, no la existencia de solución. Una reparación debe permitir reasignar decisiones anteriores.

Si los tiempos se predicen, ¿qué error cambia el plan?

Hasta ahora la geometría daba tiempos exactos. Para un análisis separado de sensibilidad, tratamos los tiempos como costes previstos y modificamos solo V2→A, llamando λ minutos al nuevo valor. No afirmamos que ese cambio aislado proceda de la misma carretera ideal: es una actualización abstracta de la predicción con las otras celdas fijas. El plan voraz original sigue costando 8 y el que intercambia A y B cuesta λ+4. Empatan en λ=4: por debajo gana el intercambio y por encima el otro plan.

Sensibilidad sintética de un coste. La línea negra muestra el mínimo verificado enumerando las seis asignaciones para cada λ. El cruce a cuatro minutos cambia la decisión; no supone una mejora del modelo de IA.
Sensibilidad sintética de un coste. La línea negra muestra el mínimo verificado enumerando las seis asignaciones para cada λ. El cruce a cuatro minutos cambia la decisión; no supone una mejora del modelo de IA.

Leemos el gráfico siguiendo la rama inferior. El barrido utiliza 101 valores entre 0 y 10 minutos, con paso 0,1, y comprueba todas las asignaciones, no solo las dos dibujadas. Un cambio pequeño puede ser irrelevante lejos del cruce y decisivo cerca de él. El error medio de tiempos por sí solo no describe la estabilidad de decisiones: importa dónde cae el error respecto a alternativas casi equivalentes.

Una cota sencilla para errores en todas las parejas

Volvamos a la matriz inicial. La mejor asignación cuesta 6 y la segunda 8: la diferencia Δ es 2 minutos-vehículo. Supongamos que cada coste cambia como máximo ε minutos en valor absoluto. Un plan con n asignaciones cambia como máximo nε; al comparar dos planes, su diferencia cambia como máximo 2nε. Una condición suficiente para mantener el ganador es:

Δ > 2nε n = 3, Δ = 2 ⇒ ε < 1/3 min

La interpretación es conservadora: si cada error queda por debajo de un tercio de minuto, ninguna alternativa puede cerrar toda la diferencia según esta cota. No es un umbral necesario: contamos errores en parejas compartidas por dos planes, que se cancelan al compararlos. Limitar cada coste es además una hipótesis fuerte; no se deduce de un error medio bajo. Hay que verificarla o sustituirla por un modelo de incertidumbre adecuado.

El código fija ε=0,3 minutos y comprueba las 2⁹=512 combinaciones extremas de los nueve errores, cada uno +ε o −ε. El ganador no cambia. Una diferencia lineal de costes alcanza sus extremos en los vértices de esta caja de incertidumbre: la comprobación tiene sentido para el modelo declarado, no es una prueba aleatoria con 512 clientes. No estimamos probabilidades de éxito ni la distribución de errores reales.

Del ejemplo didáctico a un sistema operativo

Los problemas grandes utilizan algoritmos de asignación, no enumeración factorial. SciPy 1.18.0 documenta linear_sum_assignment también para matrices rectangulares mediante una variante Jonker–Volgenant. Leímos definición, restricciones y notas de la API; no ejecutamos SciPy ni reproducimos el artículo citado. Python estándar y el certificado explícito verifican nuestro resultado.

Las solicitudes que llegan con el tiempo cambian el problema: esperar puede mejorar el emparejamiento, pero retrasar a un cliente. Varias paradas introducen rutas y dependencias entre viajes. Capacidad, ventanas temporales, recarga, turnos y requisitos de servicio necesitan formulaciones adicionales. Actualizar una matriz no basta si el vehículo ya salió: hay que distinguir decisiones modificables de compromisos ejecutados. Analizamos un único instante de asignación, sin esos efectos dinámicos.

La respuesta y lo que permite comprobar el código

El vehículo más cercano puede ser correcto para un cliente e incorrecto para el conjunto. Aquí renunciar a un minuto local evita tres en otro lugar; con una incompatibilidad, incluso evita dejar una solicitud sin vehículo. La IA puede estimar costes, pero el sistema también debe representar restricciones y comparar planes completos. La calidad predictiva y la calidad de decisión están conectadas mediante ese paso, no son equivalentes. No hace falta un modelo mayor para corregir un algoritmo que ignora alternativas.

El código breve enumera seis planes y verifica el certificado. El archivo completo añade la regla voraz, la pareja prohibida, el barrido de λ y las 512 perturbaciones. Los empates se ordenan de forma determinista; no hay generación aleatoria ni semilla. Conservamos todas las permutaciones, por lo que representarlas usa memoria O(n·n!), además de la matriz O(n²). El gráfico procede de resultados guardados, no de imágenes generativas. Ejecutar el programa permite comprobar el mejor valor y por qué fallan las alternativas.

Referencia técnica y reproducibilidad

SciPy 1.18.0 — scipy.optimize.linear_sum_assignment.

from itertools import permutations
C = [[1, 2, 10], [2, 5, 7], [7, 10, 2]]
plans = sorted((sum(C[i][j] for i, j in enumerate(p)), p)
               for p in permutations(range(3)))
print(plans)
u, v = [2, 3, 2], [-1, 0, 0]
assert all(u[i] + v[j] <= C[i][j] for i in range(3) for j in range(3))
assert sum(u) + sum(v) == plans[0][0] == 6

Código, datos e instrucciones · JSON. Cálculos didácticos ejecutados con Python 3.14.0; figuras con Matplotlib 3.11.2. Análisis asistido por IA, sin afirmar revisión por pares ni humana. Portada original ImageGen ilustrativa: no documenta personas, sedes ni instalaciones de EL-AI. Fuentes consultadas el 3 de octubre de 2026.