Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

Debido a la epidemia, la compañía simplemente despidió a nuestro equipo de negocios y yo soy un programador viejo despedido con honor.

Es difícil encontrar un trabajo de desarrollo. Después de todo, las personas menores de 35 años, así que estoy pensando en encontrar otra forma de conseguir un trabajo, como repartir alimentos. No importa cuánto grupo X, X también es una gran fábrica ~

Ahora que ha tomado una decisión, el primer paso es armar su mente y tomar el arma de la teoría ¿Cuál es la primera prioridad para la entrega de alimentos? ¡rápido! ! UI. Velocidad velocidad velocidad, las cosas importantes se dicen tres veces.

Cómo llegar al comerciante rápidamente y luego entregar rápidamente la comida al cliente, la clave es correr menos: este es el problema de la ruta más corta. A continuación, describiré cómo utilicé el algoritmo Dijkstra combinado con el mapa de Huilongguan para calcular la ruta más corta. camino.

Razones para elegir Longguan: 1. Las carreteras en Huilongguan están en muy buenas condiciones, básicamente horizontales y verticales, 2. Mi casa está aquí, y la entrega de comida está cerca de casa, y la carretera es familiar.

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan
El mapa de Huilongguan es como el anterior. Debido a que es un experimento, se seleccionan algunas áreas: desde el norte hasta Nanbei Road, al sur hasta la calle Tongcheng, al este desde la carretera auxiliar G6, al oeste hasta Wenhua East Road.

En mis dos artículos anteriores que describen el algoritmo de ruta más corta, los gráficos utilizados son similares:

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

Si se usa en un mapa, es algo inapropiado, porque no refleja bien la situación real, como se muestra a continuación:

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

En el diagrama esquemático, solo hay un lado A entre los dos puntos, pero en realidad, hay dos rutas entre los dos lugares, B y C, por lo que para que el diagrama esquemático sea más adecuado para la visualización, hay una variante diagrama:

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

Cada cuadrado representa un vértice y los pesos de los bordes de dos vértices adyacentes se valoran como 1.

Como se muestra en la figura anterior, el cuadro numérico azul representa el camino transitable y el cuadrado inglés rojo representa el intransitable. La combinación de pesos de los bordes de los vértices debe ser la siguiente:

1-2-1 ,1-16-1

2-1-1 ,2-3-1

3-2-1 ,3-4-1 ,3-17-1

4-3-1 ,4-5-1

5-4-1 ,5-6-1

...... ......

18-17-1, 18-19-1, 18-20-1, 18-21-1

Si el punto de partida es la puerta este del Distrito Norte de Jiayuan, Beidian, eso es 19, y el punto final es la puerta oeste de Longhuiyuan, eso es 5.

La ruta más corta disponible es 19-18-21-7-6-5 o 19-18-17-3-4-5, combinada con las condiciones reales de la carretera, como congestión, semáforos, carreteras de un solo sentido, etc. Corta ruta.

Suponiendo que Longxi Second Street está atascado en el tráfico durante todo el año, y el peso lateral se establece en 2, entonces el camino más corto debe ser el segundo.

Usé la herramienta de rango del mapa para obtener las siguientes distancias inexactas:

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

Tomando la intersección como punto, la distancia entre los dos puntos es como se muestra en la figura de arriba, en kilómetros.

Supongo que cada cuadrado representa 100 * 100 metros, entonces el diagrama esquemático es el siguiente:

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

No preguntes por qué es un círculo en lugar de un buen cuadrado, porque es mejor dibujar un círculo que un cuadrado ~~~

Ignore también los diferentes tamaños de los círculos, la unidad fija es de 100 * 100 metros.

Luego codificamos.

Primero, debemos construir los datos de peso de los bordes de los vértices, similares a 1-45-1 y 1-74-1.

Aquí utilicé la estructura HashBasedTable en Guava, a saber, Key1-Key2: Value.


Table<Integer, Integer, Integer> ppw = HashBasedTable.create();
ppw.put(1, 45, 1);
ppw.put(1, 74, 1);
ppw.put(45, 1, 1);
ppw.put(74, 1, 1);

En este gráfico, hay un total de 296 vértices y más bordes relacionados, y la entrada manual fallará, así que escribí un programa para generar el código correspondiente de acuerdo con el rango de vértices de entrada. Incluso esto es agotador.

Luego implemente el algoritmo de Dijkstra. El pseudocódigo es el siguiente, hay dos parámetros de entrada: punto inicial, punto final,


public void getShortestPath(Integer start, Integer end){
 1、构建到某一顶点最短路径的起点Map——parentMap
 2、构建已处理最短路径顶点Map——s;构建待处理最短路径顶点Map——w
 3、构建(顶点A-顶点B:边权)的Table——ppw
 4、遍历所有顶点{
  4.1将w转为优先队列,并取出最小值的顶点,将其从w挪入s,并以此为顶点(设为Key1)计算其相邻顶点的权重。
  4.2如果取出的最小值顶点就是终点,且最小值不是无穷大(在程序中用Integer.MAX_VALUE代替),说明已经计算到终点,不需要计算后面的点,直接跳出循环。
  4.3内循环遍历所有顶点(设为Key2),根据Key1-Key2从ppw中取出权重。
  4.4如果ppw取出为null,说明两顶点间无路径。
  4.5根据Key1、Key2的值、边权对Key2进行松弛操作。
 }
}

En este punto, se ha completado el código central y habrá métodos para ingresar pasajeros, comerciantes y clientes, llamar al código central y generar la ruta.

Los siguientes son los resultados de la prueba.

Suponiendo que el pasajero se encuentra en la intersección de Huilongguan West Street y Yuzhi East Road (es decir, 24), el comerciante está en la tienda de Beijing Hualian Tongcheng Street (es decir, 177), y el cliente está en la puerta norte del segundo distrito de Tianluyuan (es decir, 89), el resultado calculado de la siguiente manera:

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

Tome la ruta del comerciante al cliente como ejemplo, la ruta dada en el mapa es la siguiente:

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

El camino dado por el programa:

Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

Básicamente bastante consistente.

Por supuesto, este es solo un procedimiento muy simple, y hay muchas cuestiones prácticas que no se han considerado, como modos de viaje, congestión, semáforos, calles de un solo sentido, tramos prohibidos y tráfico tridimensional.

Por ejemplo, en el punto 26, la intersección de Tongcheng Street y Yuzhi East Road, esto es en realidad un puente. Si conduce de 175 a 236, es imposible tomar la ruta 175-26-236 y debe hacer un círculo.

En realidad, este artículo es sólo un registro del proceso de aprendizaje personal de combinar la teoría con la práctica. Las omisiones y los errores son inevitables.

De acuerdo, no hablemos de eso, solo la orientación teórica no es suficiente, actualizaré el equipo.
Puedo usar el algoritmo de Dijkstra para entregar comida en Huilongguan

Supongo que te gusta

Origin blog.51cto.com/15067227/2603623
Recomendado
Clasificación