.., habiendo caminado largo
tiempo a través de arenas,
 rocas y de nieves,
descubrió una ruta.
 Y todas las rutas
van hacia la morada
 de los hombres.

Antoine de Saint-Exupéry



 +   Ficha Técnica
 +   Explicación Ejemplo
 +   Nótación de Grafos
 +   Ruta Optima y Bayes




El Problema de la Ruta Optima
Algoritmo de Dijkstra

José Enrique González Cornejo
01 de mayo 2009
 




Video Ruta Optima por Tramos

Introducción

El algoritmo de la ruta óptima por tramos o algoritmo de Dijkstra, es un método programación lineal que se utiliza para minimizar el costo total de desplazamientos, optimización de series de tareas de trabajo, procesos de ensamble y otras múltiples operaciones, donde está asociado un grafo completo.

Junto a este artículo se presenta una aplicación computacional, - y su código en Javascript -, que utiliza el algoritmo de Dijkstra para la toma decisiones por partes. En ese sistema de simulación asociado, el usuario puede elegir un parámetro (N° de puntos) y observar el grafo que se genera con poneraciones de números enteros positivos, la matriz adjunta y una solución.

La solución descrita se aproxima tomando decisiones en etapas sucesivas y de este modo es posible retomar la ruta en diferentes períodos, asumiendo que la métrica es constante (la el costo o distancia). Con el propósito de ilustrar una solución dinámica se anexan los apuntes "Algoritmo de Dijkstra con Teorema de Bayes ~ Ejercicio Robot Móvil"

Es decir, se asume que el entorno en el que opera el algoritmo se puede representar como un espacio discreto, donde cada nodo del grafo representa una posible ubicación y estado verificado del móvil del ejercicio. (Para la programación de un robot en un espacio tridemensional continuo, ver " Algebra de Lie - Aplicaciones ~ Formalización").

Se comienza con el famoso problema del vendedor viajero que está en una zona, donde existe un conjunto de puntos a visitar y se define una métrica, que puede ser la distancia el costo u otro a medida aplicable para calcular una solución de la ruta mediante la optimización por tramos.


Agente Viajero

Un agente debe visitar una Lista de Clientes diseminados en $N$ direcciones localizadas en una zona $XY$. Se conocen los costos  o distancias $d(i,j)$ para ir del CLIENTE $i$ al CLIENTE $j$.

Nótese que, se asume $d(i,j)=0$ cuando $i=j$. Es decir, la diagonal de la matriz asociada es $0$.

Los costos $d(i,j)$ pueden representar una reducción de una serie de factores, o puede cada factor ser tratado en forma individual con su unidad de medida (accesibilidad, distancia métrica, prioridad,.. etc), para posteriormente decidir en un modelo ponderado.

Es decir, el concepto distancia $d(i,j)$ puede representar costo, tiempo u otra medida que se requiera establecer entre los nodos.

Este es un problema de optimización combinatoria, se puede realizar por múltiples métodos de programación lineal (Ver Traveling Salesman Problem, TSP).

Se ha trabajado dos métodos computacionales:

    i) Uno por optimización de tramos, el cual presentamos a continuación, como así mismo simulamos el algoritmo DocIRS con un desarrollo de matrices de $4\times4$ hasta $200\times 200$ (Simulación) con valores enteros aleatorios, donde se puede seleccionar el orden de la matriz y decidir si se desea que la matriz sea simétrica o no. Una vez ejecutada la formulación, el sistema despliega la ruta óptima y su costo asociado. (Ver Algoritmo de Dijkstra con Teorema de Bayes ~ Robot Móvil)


    ii) Un segundo método por permutaciones (todo los posibles caminos, $(N-1)!$, lo hacemos por medio de un algoritmo aleatorio). Este último método "por permutaciones", - resulta ser experimentalmente más exacto-. Sin embargo, no lo utilizamos, dado que cuando el número de puntos es grande, entonces la cantidad de combinaciones es aún mayor. Por tanto, los tiempos de respuesta para lograr la Ruta Optima, son extensos (Por ejemplo, con sólo 10 puntos se tienen 362.880 posibles caminos). Además, este camino resultante es global, dado que se decide por el mínimo del costo total de cada combinación y no por etapas sucesivas. Es decir, presupone que para optimizar se debe realizar la ruta sólo de esa forma. (Ver Ejemplo Simple Permutaciones para la Ruta Optima y probar el Simulator de Permutaciones)

¿En qué orden se debe visitar a los CLIENTES para minimizar el costo total del desplazamiento?

Descripción de un Algoritmo de la Ruta Óptima

    1. Se elige un punto de partida. (En nuestro caso  rotularemos el origen siempre desde el $1$)

    2. Se decide ir seguidamente al CLIENTE más cercano.

    3. Se va seguidamente a otro CLIENTE, el más cercano (desde el punto de vista de la métrica en cuestión), que no haya sido visitado todavía, hasta que así se hayan visitado todos los CLIENTES, vuelve entonces al punto de partida.

    4. Se anota el costo obtenido del recorrido y se vuelve a comenzar eligiendo sucesivamente todos los CLIENTES de la lista como un punto de partida.



En síntesis, partimos del origen $1$, y buscamos todas las líneas que inciden en el punto y determinamos el mínimo costo entre los puntos conectados. Se guarda tramo y  se realiza recurrentemente el mismo ejercicio, a partir del punto de llegada, eliminando el tramo encontrado en los siguientes pasos.

Cuando uno entra en un punto ya ocupamos esa línea de entrada, de ahí, sólo nos queda seleccionar la línea de salida del punto (Ocupamos sólo 2 líneas por punto).

La ruta buscada es un ciclo, dado que se retorna al punto de partida rotulado con $1$. Se retorna al punto de partida, una vez que se haya pasado por todos los puntos agendados.

Si un punto es equidistante (en costo) de otro y si los costos son mínimos, el algoritmo programado no efectúa pruebas sucesivas con cada uno de los puntos, sino que escoge sistemáticamente aquel que esté primero en su orden.

Formalmente, si se considera una matriz de distancias $d_{ij}$ sobre un grafo completo $G$,



$$ X_{ij}=\begin{cases}1, & \text{si se usa }i\longrightarrow j\\ 0, & \text{si NO se usa }i\longrightarrow j \end{cases} $$

Donde $X_{ij}$ es una variable dicotómica de decisión y $d(i,j)$ la métrica o ponderación, entonces se puede ilustrar el modelo matemático de selección como:

$\text{Min}\sum d_{ij}X_{ij}$

Ejemplo con $7$ CLIENTES.

1. Lista seleccionada con su localización, dada




Grafo Completo $G_7$

Nótese que un grafo completo tiene $p=(n-1)$ líneas por punto, donde $n$ es el número de puntos. A continuación sus ponderaciones en su matriz adjunta.

2. La Matriz Adjunta $G_7$ con las distancias o costos entre las localizaciones establecidas,

La Matriz de distancias o costos $G_7$, señala el camino del orden de los clientes seleccionados en el Zona $XY$. Nótese que se asume la matriz como simétrica. Se marcan con fondo amarillo las celdas utilizadas en el cálculo de la ruta óptima.


Grafo Completo $G_7$, Ponderado


Valores Enteros Aleatorios entre 1 y 40 de Orden: $7\times7$
$d_{ij}$ 1 2 3 4 5 6 7
1 0            
2 37 0        
3 39 40 0        
4 37 36 23 0      
5 28 9 19 23 0    
6 33 13 17 5 31 0  
7 22 8 40 14 31 23 0

La Matriz $d(i,j)$ del ejemplo es simétrica.
(El costo es igual de ida y vuelta)
Nótese que la distancia o costo $d(i,j)$=0 cuando i = j.


3. La solución

Cadena que contiene la Ruta Optima y su valor total de la distancia o costo.

Solución en la Zona $XY$

Ruta Optima Resultante

$d_{ij}$ 1 2 3 4 5 6 7
1 0            
2 37 0        
3 39 40 0        
4 37 36 23 0      
5 28 9 19  23 0    
6 33 13 17  5 31 0  
7 22 8 40 14 31 23 0



 [22 7  [8 2  [9 5  [19 3  [17 6  [5 4  [37 1

Minimo$\sum [f_{i}]= 92$

 

4. Formalización del algoritmo utilizado

El algoritmo con que se resolvió el problema Ruta Óptima para Visitar CLIENTES, es mediante una técnica matemática llamada Programación Dinámica1 ,  dado que la solución se aproxima tomando decisiones en etapas sucesivas y de este modo es posible retomar la ruta en diferentes períodos, asumiendo que el costo o distancia es constante ($d(0,j) \forall j=1,2,\dots N$). Es decir, desde el origen hasta cualquier dirección  (o nodo) de la lista de CLIENTES a visitar. (ver Programación con Diseño Modular o Top-Down)

El problema se abordó, bajo las siguientes condiciones:

    i)   La solución se logra a través de una secuencia de decisiones, una en cada etapa.

    ii)  La secuencia de decisiones cumple con el principio del óptimo.

    iii) Definición recursiva de la solución.

    iv) Cálculo del valor de la solución óptima mediante una matriz temporal donde se almacenan la soluciones parciales

    v)  Construcción de la solución.

Sea $D$={$d(i,j)$}  la matriz cuadrada de orden $n$, donde cada $d(i,j)\in \mathbb R$ es el costo o distancia de ir desde $i$ hasta $j$. La matriz $D$ tiene un grafo completo2 $G$ asociado.

La diagonal de la matriz $D$ es cero. Es decir, $d(i,j)=0$  para $i=j$. La matriz del ejemplo es simétrica. Es decir, se han considerado sólo los valores  $d(i,j)$, donde $i>j$.

Sea $\unicode{123}p_{i}\unicode{125}$ el conjunto de los $n$ puntos (o nodos) del grafo $G$.($n\in \mathbb N$)

Sea el punto $p_{1}\in \unicode{123}p_{i}\unicode{125}$ el punto de partida. (Arbitrariamente lo localizamos en el rotulo $1$ del LISTA DE CLIENTES SELECCIONADOS).

Entonces, existen  $(n-1)!$ caminos que pasan una sola vez por cada punto $p_{i}$, con $p_{i}\ne p_{1}$.

Sea $Q=\unicode{123}q_{i}\unicode{125}$ el conjunto de todos los posibles caminos hamiltonianos3 que se pueden obtener sobre el grafo $G$, partiendo de $p_{1}$. (Nótese que en cada camino $q_i$, todos los puntos intermedios entre el primero y el ultimo, tiene sólo dos líneas que inciden: una línea que entra y otra que sale.)

Sea $C_{i}$, el costo de cada sumatoria $\sum d(i,j)$ que se obtiene de cada camino $q_i \in Q$.

Sea $F=\unicode{123}f_{i}\unicode{125}$ el conjunto de puntos asociados al camino que representa el $C_{m}=min(C_{i}, F)$. Es decir, $C_m$  $f_{1} → f_{2} →f_{3} →...f{n}$  (Nótese que $f_{1}=p_{1}$, i.e. $f_i$: la política de costo mínimo de la etapa. Donde se establece la siguiente restricción:
$f_{k+1}\ne f_{k} \land f_{k+1} \ne f_{k-1}\\ \land f_{k+1} \ne f_{k-2} \dots f_{k+1}\ne f_{1}$.

Entonces la relación recursiva dinámica se expresa como: Para cada uno de los
$f_{k+1}=$ min{$(d(i,j)$, $fk → \unicode{123}p_{i}\unicode{125}$/ bajo Restriccion}
$\iff \\ f(k,i) = min [d(i,j) + f(k-1,j)]$
para todos los arcos $(i,j)$ en la red, donde $i$ es el estado de inicio y $j$ estado destino.

Luego, $ \exists q_{0} \in Q \text{|} q_{k}=f_{k}i$, cuyo costo o distancia es $C_m$

function ruta_optima()
{
  /*ALGORITMO DE OPTIMIZACION DE RUTA EN JAVASCRIPT
  ///José Enrique González Cornejo, 01/05/2009

  ///(Ver Simulación)
  ///La función devuelve una cadena con un recorrido óptimo,   ///desde el punto de vista, del Método Por Tramos
  ///de José Enrique González Cornejo(DocIRS)
  ///con la siguiente sintaxis:
  ///a1-->d[a1][a2]-->....,an-->d[an][1]-->a1
  ///Se asume que vienen parámetros globales: numero_nodos, la matriz d[i][j]    cargada con sus correspondientes valores
*/

 var donde=new Array() /// Almacena el punto donde estamos situados
 var minimo=new Array() /// Almacena el valor mínimo d[i][j] seleccionado
 var v=new Array() /// Rotulación de los nodos. Por simplicacion del algoritmo v(j)=j
 var kkk=0 //Contador
 var MMM   //Comienza numero gande, se Almacena Mínimo
 var restriccion="," //Cadena donde se van guardando los nodos ya seleccionados.
 var m //iterador local
 var i //iterador local
 var j //iterador local
 var nodo_doble  //variable auxiliar para limpiar la duplicacion de rotulos en los tramos
 var ss //cadena resultante que contiene la serie de la ruta óptima ,a1,a2,a3,.....,an,a1
 //'==============
                donde[0] = 1
                v[1]=1
                for(var j=2;j<=numero_nodos;j++)
                {
                   v[j]=j
                }
                v[numero_nodos+1]=1
//'==============

do
 {
 MMM = Math.pow(10,20)

   i = donde[kkk]
   kkk = kkk + 1
   restriccion = restriccion + donde[kkk - 1] + ","

                for(var j=2;j<=numero_nodos;j++)
                {
                 
                 if(i!= j)
                 {
                   if(d[i][j] < MMM)
                   {
                      tt="," + j + ","
                                 if(InStr(restriccion, tt)==0)
                   {
                                MMM = d[i][j]
                                donde[kkk] = j
                   }
                  }
                 }
               

                }
                 
                if(MMM == Math.pow(10,20))
                 {minimo[kkk] = 0}
                    else
                 {minimo[kkk] = MMM}               

    }
    while (kkk<numero_nodos-1);
    /////////////////////////////
       ss = ""
       for(m = 0;m<=numero_nodos - 2;m++)
             {
              var punto1 = v[donde[m]]
              var punto2 = v[donde[m + 1]]
              ss = ss + punto1 + "-->[" + d[punto1][punto2] + "]-->" + punto2 + "-->"
             }

                for(var m=1;m<=numero_nodos;m++)
                {
                  nodo_doble = "-->" + m + "-->" + m + "-->"
                  ss = ss.replace(nodo_doble, "-->" + m + "-->")
                }

         ss = ss + "["+d[punto2][1]+"]-->1"

         return ss
 }

                 ss = ss + "["+d[punto2][1]+"]-->1"

                 return ss
     }



Explicación de la Rutina Computacional

Al concluir la rutina codificada en Javascript, donde el arreglo $f$ contiene las posiciones de los puntos del camino optimo $q \Rightarrow d(f[i],f[i+1])$  es la distancia o costo mínimo entre cada par de nodos $f[i]$ y $f[i+1]$ \$C_{m}= \sum f_{i}$ es el costo o distancia optima para cubrir el grafo G. Todos los otros valores resultantes y referenciales se expresan en función de esta secuencia.




Valores Utilizados en la Métrica

La simulación del algoritmo que asociamos al presente artículo, la realizamos con valores enteros aleatorios acotados. Sin embargo, el recurso de valores aleatorios también puede ser utilizado entre algunos puntos, donde no tenemos información certera acerca de la distancia, o costo que los separa (Las ponderaciones deben ser no negativas, por lo que, si es necesario, hay que normalizar primero los valores del grafo).

Por ejemplo, en caso de sólo conocer el intervalo del costo o distancia (u otra métrica) entre dichos puntos es posible simular estimaciones. Es decir, ahí se puede aplicar un método análogo a MonteCarlo para aproximar y llenar la matriz $d(i,j)$ que requiere el algoritmo como insumo, para buscar la ruta óptima.


Con grandes cantidades de nodos a visitar, se debe trabajar con matrices de magnitud mayor. A veces con matrices que representan diferentes métricas (distancias, costos, adyacencia, difcultad, tiempo,etc...) combinadas con diversas restricciones.


Canal Youtube
DocIRS-Oficial 




Notas Complementarias Adjuntas

1 La programación dinámica es un método para reducir el tiempo de ejecución de un algoritmo mediante la utilización de subproblemas superpuestos y subestructuras óptimas. Una subestructura óptima significa que soluciones óptimas de subproblemas pueden ser usadas para encontrar las soluciones óptimas del problema en su conjunto.

2 Un grafo completo implica que todos los nodos están conectados entre ellos o que a cada punto de G inciden n-1 líneas.


3 En el campo matemático de la teoría de grafos, un camino hamiltoniano en un grafo es un camino, una sucesión de aristas adyacentes, que visita todos los vértices del grafo una sola vez. Cuando un camino hamiltoniano cierra volviendo al punto de partida se le dice Ciclo Hamiltoniano.



Bibliografía:

- Harary Frank. Graph Theory, Addison-Wesley Publishing Company,1969
- Hamdy A. Taha. Operations Research, Macmillan Publishing,1976
- Edsger Dijkstra in 1959
- González Cornejo José Enrique,  Tratamiento Documental de Datos, Published by CIDE-REDUC 1990
- DocIRS,SII, DIPRES: Fondo de Modernizacion de la Gestión Pública, Informe Final, Propuesta "Optimización del Proceso de Presencia Fiscalizadora en Terreno,SII"
-
Programación con Diseño Modular o Top-Down

Artículos Relacionados
Logo DocIRS : Grafo conexo definido como árbol
Simulación Aleatoria de Algoritmo Por Tramos DocIRS para la Ruta Optima
Simulación Aleatoria de Algoritmo Por Permutaciones DocIRS para la Ruta Optima
Ejemplo Simple Permutaciones para la Ruta Optima
Logit: Función de distribución dicotómica para el Scoring
Geometrías Cualitativas
El Profesor Josegonzky resuelve ganar al hipnotizador
Modelo de estimación del factor Fc ~ Acerca de variables de entorno
Modelo Insumo-Producto, Costeo y Arquitectura de Negocios
Algoritmo Indicadores PMO
Fundamentos de los Lenguajes Estructurados.
Estimación de Precios de los Servicios-Productos DocIRS, Bajo el Modelo SAAS 
Complemento de Conceptos Matemáticos ~ Mínimos Cuadrados
Complemento de Conceptos Matemáticos ~ Regresión Múltiple
Complemento de Conceptos Matemáticos ~ Distancia de un Punto a una Recta
Descripción Algoritmo de Distribución Aleatoria de Suma 1
Algoritmo en Acción ~ Herramienta de Distribución Aleatoria de Suma 1