3. DISEÑO DE LA BÚSQUEDA TABÚ
3.2. Diseño de la Búsqueda Tabú
3.2.2. Movimiento λ-opt
El movimiento λ-opt, formalmente conocido como operador λ-intercambio, es un algoritmo de búsqueda local que elimina λ arcos (λ>1) y reconecta los λ segmentos restantes. Las posibilidades que ofrece el diseño que se presenta en este documento son λ = {0,2,3}. Con λ = 3, el algoritmo, implícitamente, también realiza las posibles reconexiones que se darían con λ = 2, así que suele ser la opción más elegida. En caso de λ = 0, esta heurística se obvia y se ejecuta la Búsqueda Tabú.
El algoritmo de Mole & Jameson, a pesar de proporcionar una solución correcta, puede que no establezca el mejor orden posible de entre las ciudades que elige. La aplicación de un movimiento opt explora la mejor combinación de visita a los clientes atendidos en una ruta cuando se eliminan λ arcos (contabilizar todos las posiciones posibles es demasiado caro computacionalmente hablando).
En caso de solicitar la ejecución de este operador, siempre se aplicará dentro del algoritmo de M&J tras conformar definitivamente una ruta. Opera de la siguiente manera:
Paso 1. Verifica que el número de ciudades en la ruta es mayor que dos (el depot no se incluye).
Paso 2. En caso de λ = 2, se elige la siguiente combinación de par de arcos (no contiguos). Si λ = 3, los
arcos sí pueden ser contiguos. Una vez elegidos, se eliminan de la ruta.
Figura 14. Pseudocódigo de formación de eliminación de arcos en operador λ-intercambio
Desde pri_arco=1,…,n_arcos-2
Desde seg_arco=pri_arco+2,…n_arcos Elimina (pri_arco,seg_arco)
permitido para cada una de las rutas anteriores, tanto en un orden de visita (en el sentido de las agujas del reloj) como el contrario (véase figura 13).
Paso 4. Se chequea si el mejor coste hallado en el paso 3 es el mejor hasta el momento. Se actualiza el mejor coste y movimiento si así fuera.
Paso 5. Si quedan combinaciones de arcos por eliminar vuelta al paso 5. Si no, se modifica la ruta de partida (la hallada por M&J) en caso de que el coste se haya mejorado y finaliza el algoritmo.
3.2.3.Búsqueda Tabú
El diseño de la Búsqueda Tabú (BT) de tres listas que se presenta en este trabajo es en esencia una fusión de las tácticas definidas en el algoritmo de Osman y Taburoute más una serie de ampliaciones en forma de métodos de intensificación y diversificación que se adaptan a las características del problema VRP: memoriza “estados” de soluciones, inserta o intercambia ciudades según el número de iteraciones sin mejorar e incorpora la capacidad de aceptar soluciones no válidas con la intención de hallar soluciones admisibles tras un conjunto de movidas indeterminado.
La BT posee una terminología muy específica que cada autor redefine en base a criterios propios como, por ejemplo, la definición de movimiento tabú. Puesto que la riqueza de acepciones es extensa, se presenta a continuación el modelo completo para evitar comprensiones erróneas.
La BT entra en juego cuando ya se ha resuelto el problema VRP (M&J más movimiento opt) y se posee pues una solución admisible en la que se asignan grupos de ciudades en orden a distintos
vehículos de la flota. Este conjunto de rutas se recogen en R = {r1,…,rh}. Cada ruta, ri, está compuesta,
a su vez, por un conjunto finito de ciudades V = {v1,…,vn}. La BT realiza intercambios para rebajar el
coste de la solución.
En un intercambio es un movimiento en el que intervienen un par de ciudades, vi y vj, (i≠j) que
pertenecen, respectivamente, a un par de rutas, rq y rp, (q≠p). El intercambio se define como el
movimiento de vi a rp y de vj a rq. Dicho intercambio garantiza que las nuevas posiciones de vi y vj son
las que resultan en un menor coste de rp y rq, respetando las ventanas de tiempo y el máximo tiempo de
operación del vehículo asignado a ambas rutas. Estos intercambios tienen una notación propia en este
trabajo, representada mediante {vi,rq,vj,rp}, aunque las inserciones también la usan. Los movimientos
se realizan sobre una solución, es decir, el conjunto de rutas asignadas a la flota que ha resuelto el problema HF-VRPTW.
Existen dos movimientos denominados mejor movimiento y movimiento parcial que aseguran el mejor coste posible en un alcance determinado. Para conocer el rango de actuación, es necesario describir todas las combinaciones de pares rutas-ciudades que realiza la BT. Se articulan de la siguiente manera:
Figura 15. Pseudocódigo de formación de movimientos en BT.
El movimiento parcial se define como aquel que, fijados los valores {vi,rq,vj,rp}, encuentra las
posiciones de las ciudades vi en rp y de vj en rq cuyo coste es menor. Y mejor movimiento contiene el
movimiento una vez que han sido exploradas todas las rutas con todas las combinaciones posibles entre ciudades. Cada vez que se realiza este proceso completo, es decir, que se ha recorrido la solución al completo se dice que el algoritmo ha terminado una iteración.
Tras cada iteración, la BT modifica siempre la solución con la información en mejor movimiento y lo almacena en una lista tabú cuyo tamaño ha sido declarado previamente. Si el coste total de la solución ha sido mejorado respecto a las anteriores, este mejor movimiento junto con su coste se guarda en otra entidad denominada mejor movimiento absoluto.
Cuando se realizan los movimientos parciales, la BT comprueba en primer lugar que el movimiento parcial no es movimiento tabú. Se interpreta que un movimiento es tabú cuando en un movimiento al
menos una de las ciudades implicadas (vi ó vj) ya ha sido previamente intercambiada o insertada. De
esta forma tal vez se limita en exceso la movilidad de los nodos, pero si se considerara la pareja de ciudades y no las ciudades en sí, el algoritmo puede caer en bucles indeseados y dejar de explorar el espacio de soluciones. En un caso sencillo, si se tienen dos rutas con dos ciudades cada una, R = {{0- 1-2-0}, {0-3-4-0}}, podría darse la siguiente consecución de intercambios:
Figura 16. Bucle en BT
Si un movimiento es tabú y su coste es superior al mejor coste hallado en todas las iteraciones, entonces se descarta. Si, por el contrario, es tabú y su coste es inferior al mejor coste hallada anteriormente entonces se acepta y se guarda en mejor movimiento. Esto es lo que se llama criterio de aspiración.
A grandes rasgos, este es el funcionamiento general de la BT para una solución de partida. Sin embargo, es necesario ampliar los métodos de búsqueda para escudriñar con aún más detalle el espacio de soluciones.
3.2.4.Ampliaciones
En el apartado 5.2.3., se ha planteado el funcionamiento de una BT que posee una sola lista tabú y no contempla mecanismos de diversificación e inadmisibilidad. Sin embargo, la BT que se implementa en este trabajo tiene tres listas que trabajan en paralelo y ofrece la posibilidad de aceptar soluciones no admisibles así como desplazarse en el espacio de soluciones gracias a un método de diversificación por inserción de ciudades entre rutas.
{0,1,1,3} {0,3,1,4} {0,4,1,1} Desde rp=1,…,rp=t, t≠h
Desde vi=1,…,vi=l
Desde vj=1,…,vj=m, m≠l
como el movimiento admisible en el que se extrae una ciudad vi de una ruta rq y se inserta en rp, pero,
al contrario que en un intercambio, ninguna ciudad de rp se transfiere a rq. Tras una efectuar una
inserción, la solución siempre es admisible (respeta todas las restricciones del VRP). Queda
representado por la cuádrupla {vi,rq,vj,rp}, y la casilla de la ciudad correspondiente a la ruta de donde
no se extrae ninguna adquiere el valor -1. Por ejemplo, {1,-1,3,4} indicaría que se extrae la ciudad 4 de la ruta 3 y se inserta en la ruta 1. Las inserciones son los movimientos que proveen a esta BT de un mecanismo de diversificación
La intensificación, por el contrario, se efectúa solo con intercambios de dos tipos: admisibles y no admisibles. Dentro del contexto de BT, se define un intercambio como admisible si tras desplazar el par de ciudades a sus rutas de destino, la demanda total de los clientes en todas y cada una de las rutas de la solución no excede la capacidad de los vehículos que las atienden. Ambos intercambios, tanto si son admisibles como no admisibles siempre respetan las restricciones de las ventanas de tiempo y del máximo tiempo en ruta de los vehículos. Existe una lista tabú para cada tipo de intercambio, llamadas inter y NAinter (No Admisible).
La diversificación e intensificación interactúan por medio de las tres listas tabú: inser, inter y NAinter. El paso de un método a otro queda definido por una serie de parámetros que puede amoldarse a cada problema VRP.
Gráficamente, el significado pasar de un método a otro es bastante intuitivo. Cuando se ejecuta un proceso de diversificación se está dando un salto en el espacio de soluciones en busca de nuevos mínimos, pues se supone que ya no es posible hallar mejores rutas en la zona anterior. Tras realizar este salto, se explora minuciosamente el espacio próximo al punto actual para encontrar valles (puntos de menor coste que sus vecinos). Este fenómeno se puede observar en la figura 13.
Cada segmento rojo simboliza el desplazamiento en el espacio de soluciones tras una iteración (puede ser para mejorar o empeorar el coste). El conjunto de segmentos rojos se produce mientras que el algoritmo se encuentra en una fase de intensificación. Después de un cierto número de iteraciones sin hallar un mejor resultado, la BT modifica la solución actual con una inserción, que se representa como un salto en el espacio (línea azul). Esta es la consecución de pasos que efectúa la BT desde un punto de vista gráfico.
tienen su origen en una interacción entre las 3 listas tabú, que queda definida en el siguiente diagrama de flujo.
el caso que se descarte esta opción, el algoritmo operaría de forma semejante, aunque, como es obvio, ignoraría dichas soluciones.
Aquellas instrucciones que no se describen con una asignación o comparación sencilla, poseen un funcionamiento interno que merece mostrarse en detalle. Punto por punto, estas son las principales características:
• INICIO
La BT parte de la solución inicial calculada por el algoritmo M&J y mejorada, después, por el λ- intercambio. Se heredan pues todos los datos de los que se disponía en pasos anteriores.
• Buscar Mejor_NAIntercambio y Mejor_Intercambio
Este paso es el responsable de examinar todos los intercambios posibles entre las ciudades a las que se le ha asignado un vehículo para su abastecimiento. Se asume que la posibilidad de considerar soluciones no admisibles es aceptada. De lo contrario, habría que tomar la misma definición que se va a mostrar, pero obviando aquellas partes en las que las soluciones no admisibles entren en juego. En este punto de la BT ya se ha obtenido una solución (solución_inter). Sobre ella se aplicará el método de intensificación con el objetivo de refinar los resultados de partida (rebajar el coste de solución_inter). Se opera de la siguiente manera:
Paso 1. Se examinan todas las combinaciones posibles entre ciudades. Es decir, se forman todos los
movimientos mostrados en la figura 15.
Paso 2. Desde el punto de vista de la carga, se cataloga el movimiento como admisible o no admisible
(NA). Esto quiere decir que se comprueba, primero, que al extraer la ciudad vi e insertarla en rp, la
demanda total de rp no excede la capacidad del vehículo que la atiende. Y, segundo, se verifica que al
extraer la ciudad vj e insertarla en rq, la demanda total de rq no excede la capacidad del vehículo que la
abastece. De cumplirse ambos puntos, el movimiento se clasifica como admisible, y sólo con que uno de ellos no se cumpla, el movimiento se declara inadmisible. Obsérvese que las comprobaciones son a posteriori, es decir, que si por cualquier motivo se parte de una solución sobrecargada pero al hacer el intercambio, todas y cada una de las rutas de solución_inter se reconfiguran y sus demandas pueden ser atendidas por sus respectivos vehículos, el movimiento se considerará admisible. Este último caso rara vez se produce, pues en un intercambio intervienen sólo dos rutas. De ahí que si cualquier otra ruta está sobrecargada, es imposible hacer admisible el movimiento.
Paso 3. Se elige la mejor posición de vi como de vj en sus nuevas rutas respectivas, acotando
previamente los puntos posibles de inserción mediante una verificación por el límite superior de la ventana de tiempo. De esta manera, la BT ahorra tiempo computacional, al no comprobar todas y cada una de las posiciones en la nueva ruta.
En un intercambio {vi,rq,vj,rp}, la forma en la que se insertan ambas ciudades en sus nuevas rutas es
j
2. Se sitúa a vi en la posición k-ésima de la ruta.
3. Las ciudades que quedan entre la posición k y la vacante dejada por vj, se desplazan en sentido
desde la posición k a vj.
4. Dependiendo de la posición relativa k respecto a la posición libre de vj, se considera que la
inserción de vi es factible o no. El criterio queda definido en las ecuaciones que siguen.
( ) ( 1) ( ) ( ) ( ) ( ) , ( ) , ( ) , ( ) i pos k i pos k pos k i v v pos k j v v pos k j v v pos k j e l siv pos v e l siv pos v e l siv pos v + ≤ < ≤ = ≤ > (1.2)
Nótese que este criterio simplemente restringe el número de posiciones y sólo asegura que al posicionar vi en k, las ciudades desde k+1 hasta el depot puedan ser atendidas. Sin embargo, puede
darse el caso en el que una ciudad situada desde k-1 hasta el depot tenga un valor et > lvi, con t={k-1,k-
2,…,0}, inhabilitando así la posición de vi en k. No obstante, en el paso siguiente este caso y otros
inadmisibles se descartan.
Paso 4. Posteriormente se determinan, con total certeza, las posiciones admisibles de vi e vj por
ventana de tiempo y máximo tiempo en ruta del vehículo y, de entre ellas, se elige la que redunda en un menor coste. Se computa el coste total de solución_inter con este movimiento {vi,rq,vj,rp} y se
compara con mejor_intercambio en el caso de movimientos admisibles y con mejor_NAintercambio en el caso de los no admisibles, actualizándolos en caso de mejora y de no ser tabú (a no ser que cumplan el criterio de aspiración). A la hora de determinar si un intercambio es tabú, ya sea admisible o no admisible, se compara con los registrados hasta dicha iteración en ambas listas, para evitar que la BT entre en un bucle “cruzado”. Vuelta al paso 1.
• Modificar Solución_Inter con Mejor_(NA)Intercambio. Actualiza (NA)Inter
Se aplica definitivamente el mejor intercambio a solución_inter y se registra en su respectiva lista tabú (NAinter si el mejor fue mejor_intercambio o inter si el mejor fue mejor_NAintercambio). Si no hubo mejora respecto al mejor resultado admisible registrado hasta dicha iteración, se incrementa max_sin_mejora.
• Inicializar listas NAinter e Inter
Se borran todos los intercambios y mejores movimientos registrados durante las iteraciones anteriores, ya que se considera que tras la inserción el cambio en la solución es radical y, por tanto, hay que refinar las nuevas búsquedas de mínimos sin tener ningún tipo de memoria.
• Buscar Mejor Inserción
Se procede de manera similar a lo descrito en Buscar Mejor_NAIntercambio y Mejor_Intercambio, sin embargo, existen ciertas diferencias pues la búsqueda en este caso sólo posee una lista tabú y los movimientos desempeñados son exclusivamente inserciones. Al tratarse de inserciones, sólo se consideran aquellas que son admisibles en carga y tiempo (ventanas y tiempo máximo en ruta). Una
es admisible.
Este módulo siempre parte de la solución guardada en Solución_Inser y sobre ella efectúa la siguiente BT:
Paso 1. Se establecen todas las posibles inserciones de una ciudad en el resto de rutas disponibles, de
forma que:
Figura 19. Pseudocódigo de formación de inserciones en BT
Paso 2. Del movimiento propuesto en Paso 1, {vi,rq,vj,rp}, se extraen {vi,rq,-1,rp} y {-1,rq,vj,rp} que
representan respectivamente la inserción de vi en rp y la de vj en rq. Se comprueban que dichas
inserciones no violen la restricción de carga en la ruta de destino. Si alguna de ellas la cumple, se prosigue en el paso 3, si, por el contrario, ninguna de las dos la satisface se vuelve al paso 1. Obsérvese que en este caso, al contrario de lo que sucede en Buscar mejor_NAintercambio y mejor_intercambio, no hace falta comprobar que la solución al completo sea admisible, pues todas las rutas de solucion_Inser siempre lo son, así que basta con chequear la ruta destino (la ruta de partida tendrá menos carga después de la inserción).
Paso 3. Se dirime cuál(es) de las dos inserciones posibles, {vi,rq,-1,rp} y {-1,rq,vj,rp}, son admisibles.
A continuación, se elige la mejor posición de vi en rp y/o de vj en rq, acotando previamente los puntos
posibles de inserción mediante una verificación por el límite superior de la ventana de tiempo. De esta manera, la BT ahorra tiempo computacional, al no comprobar todas y cada una de las posiciones en la nueva ruta.
En una inserción {vi,rq,-1,rp}, la forma en la que se inserta vi en rp viene determinada por los siguientes
pasos:
1. Se sitúa a vi en la posición k-ésima de rp
2. Las ciudades de rp que quedan entre la posición k y el depot (considerado como punto final de
la ruta, no punto inicial) se desplazan hacia este último.
3. Se considera como posiciones posibles de vi a rp aquellas que cumplen la condición:
( )
i pos k
v v
e ≤l (1.3)
Nótese que este criterio simplemente restringe el número de posiciones y sólo asegura que al posicionar vi en k, las ciudades desde k+1 hasta el depot puedan ser atendidas. Sin embargo, puede
darse el caso en el que una ciudad situada desde k-1 hasta el depot tenga un valor et > lvi, con t={k-1,k-
2,…,0}, inhabilitando así la posición de vi en k. No obstante, en el paso siguiente este caso y otros
inadmisibles se descartan.
Desde rq=1,…,rq=h
Desde rp=1,…,rp=t, t≠h Desde vi=1,…,vi=l
Desde vj=1,…,vj=m, m≠l
Movimiento (vi,rq,-1,rp) Movimiento (-1,rq,vj,rp)
i j
máximo tiempo en ruta del vehículo y, de entre ellas, se elige la que redunda en un menor coste. Se computa el coste total de solución_Inser con estas inserciones, {vi,rq,-1,rp} y {-1,rq,vj,rp}, y se compara
con mejor_insercion, actualizándola en caso de mejora y de no ser tabú (a no ser que cumpla el criterio de aspiración).
4.
IMPLEMENTACIÓN
En el apartado anterior se introdujo la resolución del problema VRP y el desarrollo de la sistemática de la Búsqueda Tabú a través de diagramas de flujo y operaciones lógicas de alto nivel. En este nuevo punto, se pretende dar forma y concretar la estrategia desde un punto de vista de programación, incluyendo así la extensa implementación de todos los pasos, su agrupación en archivos, clases, bloques y funciones, la interacción entre ellos y la estructura de datos en general. En resumen, se presenta la traducción de algoritmos y mecánicas matemáticas a un entorno de programación en alto nivel, como es el lenguaje C++.
Todo el código que recoge la Búsqueda Tabú está escrito en C++Builder, un entorno de desarrollo de aplicaciones en C++ para Windows propiedad de la empresa Borland. C++Builder tiene un diseño sencillo y fácil de usar que permite desarrollar programas con interfaz gráfica de forma cómoda y rápidamente. Para este trabajo, en concreto, se usa la versión 5.0.
Figura 20. Ventana principal de C++Builder
Desde un punto de vista funcional, la aplicación desarrollada puede entenderse como una caja negra que realiza tres pasos secuencialmente:
1. Lee un fichero de entrada con todos los datos que definen el problema VRP bajo estudio (flota,
clientes, distancias, tiempos, etc) más una serie de parámetros de entrada definidos por el usuario (función objetivo, tipos de algoritmo, tiempo de ejecución, etc).
2. Analiza los parámetros y ejecuta el algoritmo M&J, movimiento opt y Búsqueda Tabú según
hitos más importantes durante la ejecución.
Estos tres puntos se detallan a lo largo de esta sexta sección. El apartado 6.1. se orienta a detallar la funcionalidad del código al completo, mientras que en el apartado 6.2. se muestra la interfaz gráfica,