Gire el algoritmo de búsqueda de tabú (búsqueda de tabú) para resolver el problema de la ruta del vehículo con una explicación detallada de la ventana de tiempo (con código Java)

El siguiente artículo es de Data Magician, autor Zhou Hang

Para descargar el código relevante y los ejemplos en este artículo, preste atención al número público [sonido del simio del programa], la respuesta de fondo [TSVRPJAVA] no incluye []

Prólogo

Hola a todos!

Al ver que 9102 está por terminar, Xiao Bian también se siente cada vez más ansioso:

¿Por qué te sientes tan Cai este año?

Tan rápido antes de que llegara la semana del examen, escribí este artículo sobre el algoritmo de búsqueda tabú para resolver VRPTW, sosteniendo temporalmente los pies del Buda, pretendiendo aprender algo este año.

Este artículo viene con una explicación detallada del código Java, que se modifica a partir del código C ++ escrito por personas mayores anteriores:

Productos secos | Diez minutos para dominar el algoritmo de búsqueda tabú para resolver el problema de enrutamiento del vehículo con ventanas de tiempo (con código C ++ y comentarios de código detallados)

El nuevo código incorpora los criterios de desacato originales olvidados , cambia algunos códigos redundantes a llamadas de función y agrega comentarios a gran escala. Es adecuado para estudiantes que no han probado VRPTW (sí, soy yo mismo).

El ejemplo de cálculo está en el formato anterior, por lo que se recomienda examinar lo anterior antes de leer detenidamente el código de este artículo.

¡Comencemos a compartir hoy!

Introducción a VRPTW

El problema VRPTW se puede describir de la siguiente manera: supongamos que un centro de distribución proporciona servicios de distribución a varias ubicaciones de clientes en las ubicaciones geográficas circundantes que tienen diferentes requisitos para el tiempo de entrega de los productos. Entre ellos, los vehículos utilizados por el centro de distribución son todos del mismo modelo (es decir, tienen la misma capacidad y velocidad); el centro de distribución tiene restricciones sobre el tiempo de entrada y salida de los vehículos. Nuestra tarea es encontrar la ruta que minimice la suma de las rutas de viaje de todos los vehículos.

Una introducción más detallada de VRPTW puede referirse al tweet anterior:

Productos secos | 10 minutos para dominar CPLEX para resolver el modelo matemático VRPTW (con código JAVA y proceso de instalación de CPLEX)

Para mantener la independencia del artículo, y al mismo tiempo para facilitar explicaciones posteriores, aquí hay un ejemplo de modelado (las referencias están marcadas al final del artículo):

Todas las rutas de vehículos solicitadas deben cumplir los siguientes requisitos:

Sobre esta base, la ruta con el tiempo total más corto para cada vehículo (debido a que la velocidad del vehículo es la misma, el tiempo más corto es equivalente a la distancia más corta). (Algunos vehículos no están permitidos)

Sobre Tabu Search

El algoritmo de búsqueda tabú (abreviado como TS) se origina a partir de la imitación de la función de la memoria humana y es una metaheurística. Comienza con una solución inicial factible, explora una serie de direcciones de búsqueda específicas (movimientos) y selecciona los movimientos que maximizan el valor de una función objetivo específica. Para evitar caer en la solución óptima local, la búsqueda tabú registra la información del proceso de búsqueda que se ha experimentado, guiando así la siguiente dirección de búsqueda.

La búsqueda tabú es una manifestación de la inteligencia artificial y una extensión de la búsqueda local. La búsqueda tabú se basa en la búsqueda local, configurando una lista tabú para tabular algunas operaciones que se han realizado y utilizando criterios de desacato para desbloquear algunas soluciones excelentes.

Para el contenido específico del algoritmo de búsqueda tabú, consulte los tweets anteriores:

Productos secos | ¿Qué tipo de algoritmo puede hacer que las personas estén tan desesperadas?

Artículos secos | Diez minutos de revisión rápida búsqueda tabú (versión c ++)

TS resuelve VRPTW

Para los algoritmos de búsqueda de vecindario, el operador de búsqueda y la función de evaluación adoptada son cruciales. A continuación se presenta el operador de inserción y la función de evaluación para VRPTW en el código en detalle.

Insertar operador:

Función de evaluación:

Descripción general del algoritmo

Código Java detallado

Para descargar el código relevante y los ejemplos en este artículo, preste atención al número público [sonido del simio del programa], la respuesta de fondo [TSVRPJAVA] no incluye []

El código se divide principalmente en las siguientes categorías:

Principal, la función principal;
CustomerType, almacena la información del nodo del cliente;
RouteType, almacena la información de ruta del vehículo;
Parámetro, almacena la variable global;
EvaluateRoute, método de ruta de proceso;
InitAndPrint, método de inicialización y salida correspondiente;
TS, método de búsqueda tabú.

A continuación, se introducen por separado.

Principal: La entrada del programa.
CustomerType: clase de cliente. Para cada cliente en la figura, cree una clase de cliente, almacene su propio número, ruta del vehículo, ubicación de coordenadas, ventana de tiempo de acceso, duración del servicio y demanda.

Tipo de ruta: tipo de ruta, que registra la capacidad de transporte total, la longitud total de la ruta, la violación total de la restricción de la ventana de tiempo y la secuencia de nodos de clientes en una sola ruta.

Parámetro: clase de parámetro, las variables sobre VRPTW y TS se almacenan aquí, y los datos se modifican aquí.

EvaluateRoute: la función de verificación es una prueba de la solución resultante.

Dado que las soluciones generadas por el operador de inserción no satisfacen todas las restricciones, la mejor solución generada por la búsqueda local necesita determinar si las restricciones de ventana de tiempo y las restricciones de capacidad se satisfacen antes de decidir si es una solución factible.

En el proceso de verificar la solución óptima local, modifique los valores de los coeficientes de penalización Alfa y Beta.

La función UpdateSubT actualiza la cantidad de violaciones de la ventana de tiempo en cada punto del cliente en una ruta del vehículo. El resultado se obtiene atravesando toda la ruta y acumulando.

La función Calcular calcula el valor de la función objetivo, y la parte de penalización se acumula y multiplica por el coeficiente de penalización.

InitAndPrint: según la distancia calculada.

Lea el estudio del archivo (modifique el estudio aquí, recuerde modificar los parámetros en la clase Parameter al mismo tiempo) e inicialice cada ruta de las rutas de solución actuales [], los puntos inicial y final son centros de distribución.

La distancia entre clientes se registra y se almacena en la matriz Graph.

La construcción construye la solución inicial. La solución inicial se construye de acuerdo con el pseudocódigo anterior, y los nodos se seleccionan aleatoriamente cada vez (similar a interrumpir la secuencia de números ordenados).

Encuentre la ubicación que cumpla con la restricción de capacidad para el nodo y el tiempo de apertura de la ventana de tiempo cumpla con los requisitos, e inserte el nodo. Recuerde actualizar la ruta a la que pertenece el nodo al insertar el nodo. Inicialice la violación de la ventana de tiempo.

Finalmente, agregue una función CheckAns para verificar si la solución de salida cumple con la restricción de la ventana de tiempo y si la distancia calculada es correcta.

TS: Primero hay dos funciones auxiliares, addnode y removenode, que son la parte de ejecución del operador de inserción.

Ahora que todo está listo, solo se lo debo al viento. Solo necesito integrar todas las herramientas de acuerdo con la rutina de búsqueda tabú y construir un marco de código.

Como utilizamos la matriz de rutas [] para almacenar la solución actual, parte de los datos deben almacenarse antes de la operación de inserción, y la operación de restauración debe realizarse después de calcular la función objetivo.

Al actualizar la tabla tabú, la fórmula para el tamaño de paso tabú se puede cambiar de manera flexible.

Recuerde juzgar la solución óptima local y luego seleccione la solución óptima global factible.

Ejemplo de cálculo

Utilizamos los datos de prueba estándar de salomón c101.txt para las pruebas. (El ejemplo de cálculo se puede descargar en el área de mensajes)

Número de vehículo = 25 ;

Capacidad = 200 ;

Pruebe el número de nodos 25, 50 y 100 respectivamente. Las soluciones exactas son:

CustomerNumber = 25 :

CustomerNumber = 50 :

CustomerNumber = 100 :

Se puede ver que la precisión de nuestro código sigue siendo muy buena ~~

Por supuesto, no descartamos la mala suerte y obtenemos una solución muy pobre. No creas que tu personaje puede ajustar manualmente el número de iteraciones de IterMax.

¡El contenido de este problema ya casi está aquí! Feliz

Aquí para recordar a todos que en el proceso de aprendizaje de algoritmos heurísticos, la capacidad de escribir código es muy importante. VRPTW es un buen portador. Se recomienda que los lectores que tienen tiempo para aplicar el conocimiento del algoritmo aprendido practiquen. ¡El editor aprenderá y progresará contigo!

Hasta la próxima ヾ ( ̄ ▽  ̄) Bye Bye

Referencias

Cordeau, JF, Laporte, G. y Mercier, A.. (2001) Una heurística de búsqueda tabú unificada para problemas de enrutamiento de vehículos con ventanas de tiempo. Revista de la Operational Research Society **,  52 (8), 928-936.

Código de referencia:

Productos secos | Diez minutos para dominar el algoritmo de búsqueda tabú para resolver el problema de enrutamiento del vehículo con ventanas de tiempo (con código C ++ y comentarios de código detallados)

Supongo que te gusta

Origin www.cnblogs.com/dengfaheng/p/12672771.html
Recomendado
Clasificación