Explicación detallada del algoritmo A * (excelente)

Visión de conjunto

Aunque las personas que dominan el algoritmo A * piensan que es fácil, para los principiantes, el algoritmo A * sigue siendo muy complicado.

El área de búsqueda

Suponemos que alguien quiere moverse del punto A al punto B, pero los dos puntos están separados por una pared. Como se muestra en la Figura 1, el verde es A, el rojo es B y el azul del medio es la pared.
Escriba la descripción de la imagen aquí
Figura 1

Debería haber notado que dividimos el área de búsqueda en cuadrículas cuadradas. Este es el primer paso en la búsqueda de rutas, simplificando el área de búsqueda, tal como lo hicimos aquí. Este método particular reduce nuestra área de búsqueda a una matriz bidimensional. Cada elemento de la matriz representa una cuadrícula y su estado es transitable (walkalbe) y no transitable (inaccesible). Calculando qué cuadrados hay que recorrer de A a B, se encuentra el camino. Una vez que se encuentra el camino, el personaje se mueve desde el centro de un cuadrado al centro de otro cuadrado hasta llegar al destino.

El punto central del cuadrado se llama "nodos". Si lee otros artículos sobre los algoritmos de búsqueda de caminos A *, encontrará que la gente suele hablar de los nodos. ¿Por qué no describirlo simplemente como un cuadrado? Porque podemos dividir el área de búsqueda en otras deformaciones múltiples en lugar de cuadrados, como hexágonos, rectángulos o incluso deformaciones múltiples arbitrarias. Los nodos se pueden colocar en cualquier polígono, se pueden colocar en el centro de múltiples deformaciones o en los lados del polígono. Usamos este sistema porque es el más simple.

Una vez que reducimos el área de búsqueda a un conjunto de nodos cuantificables, como hicimos anteriormente, el siguiente paso que debemos hacer es encontrar el camino más corto. En A *, comenzamos desde el punto de partida, verificamos los cuadrados adyacentes y luego expandimos hasta encontrar el objetivo.

Comenzamos nuestro viaje de búsqueda de caminos así:

  1. Comience desde el punto de partida A y agréguelo a una lista abierta que consta de cuadrados (lista abierta). Esta lista abierta es un poco como una lista de compras. Por supuesto, solo hay un elemento en la lista abierta, que es el punto de partida A, y se agregarán más elementos más adelante. La cuadrícula en la lista Abierta indica que la ruta puede o no pasar por el camino. Básicamente, la lista abierta es una lista a cuadros.

  2. Compruebe las casillas adyacentes al punto de partida A (ignore las casillas ocupadas por los muros, las casillas ocupadas por el río y las casillas ocupadas por otro terreno ilegal), y seleccione la transitable o alcanzable entre ellas El cuadrado también se agrega a la lista abierta. Establezca el punto de partida A en el padre (nodo principal o cuadrado principal) de estos cuadrados. Cuando estamos rastreando la ruta, el contenido de estos nodos principales es muy importante. Te lo explicaré más tarde.

  3. Quite A de la lista abierta y agréguelo a la lista cerrada (lista cerrada) Cada cuadro de la lista cerrada no necesita preocuparse ahora.

Como se muestra en la siguiente figura, el cuadrado verde oscuro es el punto de partida y su marco exterior es azul brillante, lo que indica que el cuadrado se ha agregado a la lista de cierre. Es necesario comprobar los cuadrados negros adyacentes, y su marco es de color verde brillante. Cada cuadrado negro tiene un puntero gris que apunta a su nodo principal, aquí está el punto de partida A.
Escriba la descripción de la imagen aquí
Figura 2 .

A continuación, debemos seleccionar un cuadrado adyacente al punto de inicio A de la lista abierta y repetir los pasos anteriores más o menos como se describe a continuación. ¿Pero qué cuadrado elegir? El que tiene el valor F más pequeño.

Clasificación de ruta

La clave para calcular los cuadrados que componen el camino es la siguiente ecuación:

F = G + H

Aquí,

G = El costo de moverse desde el punto de partida A al cuadrado especificado, a lo largo del camino generado para llegar al cuadrado.

H = El costo estimado de moverse desde el cuadrado especificado hasta el punto final B. Esto a menudo se conoce como heurística, lo cual es un poco confuso. ¿Por qué se llama así? Porque es una suposición. No sabremos la distancia real hasta que encontremos el camino, porque hay varias cosas (como paredes, agua, etc.) en el camino. Este tutorial le enseñará un método para calcular H, también puede encontrar otros métodos en Internet.

Nuestro camino se genera así: recorriendo repetidamente la lista abierta y seleccionando el cuadrado con el valor F más pequeño. Este proceso se describe en detalle más adelante. Primero veamos cómo calcular la ecuación anterior.

Como se mencionó anteriormente, G es el costo de moverse desde el punto de partida A hasta el cuadrado especificado. En este ejemplo, el costo del movimiento horizontal y vertical es 10, y el costo del movimiento diagonal es 14. Estos datos se utilizan porque la distancia real del movimiento diagonal es la raíz cuadrada de 2, o aproximadamente 1,414 veces el costo del movimiento horizontal o vertical. 10 y 14 se utilizan para simplificar. La relación es correcta, evitamos cálculos abiertos y decimales. No es que no tengamos esta habilidad o que no nos gusten las matemáticas. El uso de estos números también puede hacer que la computadora sea más rápida. Más adelante descubrirá que si no utiliza estas técnicas, el algoritmo de búsqueda de rutas será muy lento.

Dado que calculamos el valor G a lo largo del camino hacia el cuadrado especificado, la forma de calcular el valor G del cuadrado es encontrar el valor G de su padre y luego sumar 10 o según si el padre está en línea recta o diagonal. 14. A medida que salgamos del punto de partida y obtengamos más cuadrados, este método se volverá más claro.

Hay muchas formas de estimar el valor de H. Aquí usamos el método de Manhattan para calcular el número de cuadrados desde el cuadrado actual horizontal o verticalmente hasta el objetivo, ignorando el movimiento diagonal y luego multiplicamos el total por 10. Se llama método Manhattan porque es muy parecido a contar la cantidad de bloques que cruza de un lugar a otro y no puede cruzar los bloques en diagonal. Es importante calcular H para ignorar los obstáculos en el camino. Esta es una estimación de la distancia restante, no un valor real, por lo que se llama heurística.

Agregue G y H para obtener F. El resultado de nuestro primer paso se muestra en la siguiente figura. Cada cuadrado está marcado con el valor de F, G, H, al igual que el cuadrado a la derecha del punto de partida, la esquina superior izquierda es F, la esquina inferior izquierda es G y la esquina inferior derecha es H.
Escriba la descripción de la imagen aquí
imagen 3

Bien, ahora veamos algunos de los cuadrados. En el cuadro marcado con letras, G = 10. Esto se debe a que solo hay un cuadrado desde el punto de partida en la dirección horizontal. Los cuadrados superior, inferior e izquierdo directamente adyacentes al punto de partida tienen valores G de 10 y los cuadrados diagonales tienen valores G de 14.

El valor H se obtiene estimando la distancia de Manhattan desde el punto de inicio hasta el punto final (cuadrado rojo), solo se realiza el movimiento horizontal y vertical y se ignoran las paredes a lo largo del camino. De esta manera, hay una distancia de 3 cuadrados desde el cuadrado a la derecha del punto de inicio hasta el punto final, entonces H = 30. Hay 4 cuadrados desde el cuadrado sobre este cuadrado hasta el punto final (tenga en cuenta que solo se calculan las distancias horizontal y vertical), entonces H = 40. Para otros cuadrados, puede usar el mismo método para saber cómo se deriva el valor H.

El valor F de cada cuadrado, nuevamente, simplemente agregue el valor G y el valor H directamente.

Para continuar buscando, seleccionamos el nodo (cuadrado) con el valor F más pequeño de la lista abierta, y luego realizamos las siguientes operaciones en el cuadrado seleccionado:

  1. Sáquelo de la lista abierta y colóquelo en la lista cerrada.

  2. Marque todos los cuadrados adyacentes a él, ignore los cuadrados en la lista cerrada o inaccesibles (como paredes, agua u otro terreno ilegal), si los cuadrados no están en el espacio abierto, colóquelos Únase a la lista abierta.

Establezca nuestro cuadrado seleccionado como el padre de estos cuadrados recién agregados.

  1. Si un cuadrado adyacente ya está en la lista abierta, verifique si este camino es mejor, es decir, si llegar a ese cuadrado por el cuadrado actual (el cuadrado que seleccionamos) tiene un valor G menor. Si no es así, no haga nada.

Por el contrario, si el valor de G es menor, establezca el padre de ese cuadrado en el cuadrado actual (el cuadrado que seleccionamos) y luego vuelva a calcular los valores F y G de ese cuadrado. Si aún está confundido, consulte la imagen a continuación.
Escriba la descripción de la imagen aquí
Figura 4

Ok, veamos como funciona. De nuestros primeros 9 cuadrados, 8 más están en la lista abierta y el punto de partida se coloca en la lista cerrada. Entre estos cuadrados, el cuadrado a la derecha del punto de partida tiene el valor F más pequeño de 40, por lo que elegimos este cuadrado como el siguiente cuadrado a procesar. Su marco está resaltado con líneas azules.

Primero, lo movemos de la lista abierta a la lista cerrada (por eso está resaltado con una línea azul). Luego verificamos el cuadrado adyacente a él. El cuadrado a la derecha es la pared, que ignoramos. El cuadrado a la izquierda es el punto de partida, que también se ignora en la lista de cierre. Los otros 4 cuadrados adyacentes están en la lista abierta Necesitamos verificar si el camino a través de este cuadrado es mejor y usar el valor G para determinar. Miremos el cuadrado de arriba. Ahora tiene un valor G de 14. Si llegamos allí a través del cuadrado actual, el valor G será 20 (donde 10 es el valor G para llegar al cuadrado actual, más el valor G 10 que se mueve desde el cuadrado actual al cuadrado superior). Obviamente, 20 es mayor que 14, por lo que esta no es la ruta óptima. Si miras la imagen, lo entenderás. Es mejor moverse en diagonal desde el punto de partida a ese cuadrado que moverlo horizontalmente y luego verticalmente.

Después de comprobar los cuatro cuadrados adyacentes en la lista abierta, no se encuentra un camino mejor a través del cuadrado actual, por lo que no hacemos ningún cambio. Ahora que hemos comprobado todos los cuadrados adyacentes del cuadrado actual y los hemos procesado, es hora de seleccionar el siguiente cuadrado para procesar.

Así que volvemos a recorrer nuestra lista abierta, y ahora solo tiene 7 cuadrados, debemos elegir el que tenga el valor F más pequeño. Lo interesante es que esta vez hay dos cuadrados con valores F de 54. ¿Cuál deberías elegir? No importa. En términos de velocidad, es más rápido elegir el cuadrado que se agrega en último lugar a la lista abierta. Esto conduce a la preferencia de usar los cuadrados recién encontrados primero al acercarse al objetivo durante el proceso de búsqueda de ruta. Pero esto no es importante. (El tratamiento diferente de los mismos datos hace que las dos versiones de A * encuentren diferentes caminos de igual longitud).

Seleccionamos el cuadrado en la parte inferior derecha del punto de partida, como se muestra en la figura siguiente.
Escriba la descripción de la imagen aquí
Figura 5

Esta vez, cuando revisamos los cuadrados adyacentes, encontramos que el cuadrado de la derecha es una pared, así que ignóralo. Lo mismo ocurre con lo anterior.

También ignoramos un cuadrado debajo de la pared. ¿por qué? Porque si no cruza la esquina, no puede moverse directamente del cuadrado actual a ese cuadrado. Primero debes bajar y luego moverte a ese cuadrado para doblar la esquina. (Nota: la regla de cruzar la esquina es opcional y depende de cómo se coloquen sus nodos)

Esto deja 5 cuadrados adyacentes. Los dos cuadrados debajo del cuadrado actual no se han agregado a la lista abierta, así que agréguelos y establezca el cuadrado actual como su padre. De los 3 cuadrados restantes, 2 ya están en la lista de cierre (uno es el punto de partida, el otro es el cuadrado sobre el cuadrado actual, el marco exterior está resaltado), los ignoramos. El último cuadrado, que es el cuadrado a la izquierda del cuadrado actual, verificamos si hay un valor G más pequeño para llegar allí a través del cuadrado actual. No. Así que estamos listos para seleccionar el siguiente cuadro a procesar de la lista abierta.

Repita este proceso hasta que el punto final también se agregue a la lista abierta, como se muestra en la figura siguiente.
Escriba la descripción de la imagen aquí
Imagen 6

Tenga en cuenta que el padre del cuadrado 2 cuadrados por debajo del punto de partida es diferente al anterior. Anteriormente, su valor G era 28 y apuntaba al cuadrado de la esquina superior derecha. Ahora su valor G es 20 y apunta al cuadrado directamente encima de él. Esto sucede en algún lugar del proceso de búsqueda de ruta, cuando se usa la nueva ruta, el valor G se verifica y se vuelve más bajo, por lo que el nodo principal se restablece y los valores G y F se recalculan. Aunque este cambio no es importante en este ejemplo, en muchos casos, este cambio provocará un cambio enorme en los resultados de la búsqueda de rutas.

Entonces, ¿cómo determinamos el camino real? Es muy simple, comience desde el final, presione la flecha para moverse al nodo principal, de modo que regrese al punto de partida, este es su camino. Como se muestra abajo. Pasar del punto de inicio A al punto final B es simplemente moverse del centro de un cuadrado en el camino al centro de otro cuadrado hacia la meta. ¡Es así de simple!
Escriba la descripción de la imagen aquí
Figura 7

Resumen del algoritmo A * (Resumen del método A *)

Ok, ahora que ha leído la introducción completa, ahora juntamos todos los pasos:

  1. Agregue el punto de partida a la lista abierta.

  2. Repite el siguiente proceso:

a. Recorra la lista abierta, busque el nodo con el valor F más pequeño y utilícelo como el nodo actual que se procesará.

b. Mueva este nodo a la lista de cierre.

c. ¿Para cada uno de los 8 cuadrados adyacentes del cuadrado actual?

◆ Si es inalcanzable o está en la lista cerrada, ignórelo. De lo contrario, haga lo siguiente.

◆ Si no está en la lista abierta, agréguelo a la lista abierta, establezca el cuadrado actual como su padre y registre los valores F, G y H del cuadrado.

◆ Si ya está en la lista abierta, verifique si esta ruta (es decir, para llegar a ella a través de la cuadrícula actual) es mejor y use el valor G como referencia. Un valor de G más pequeño indica que este es un mejor camino. Si es así, establezca su padre en el cuadrado actual y vuelva a calcular sus valores G y F. Si su lista abierta está ordenada por valor F, es posible que deba volver a ordenar después del cambio.

d. Deténgase cuando

◆ Agregue el punto final a la lista abierta y la ruta se ha encontrado en este momento, o

◆ Falló la búsqueda del punto final y la lista abierta está vacía, no hay ninguna ruta en este momento.

3. Guarde la ruta. Desde el punto final, cada cuadrado se mueve a lo largo del nodo principal hasta el punto de inicio, este es su camino.

Digression (pequeña perorata)

Por favor, perdone mi digresión. Cuando vea varias discusiones sobre algoritmos A * en Internet o en foros, ocasionalmente encontrará algunos códigos A *, pero en realidad no lo son. Para usar A *, debe incluir todos los elementos discutidos anteriormente, especialmente la lista abierta, la lista cerrada y los costos de ruta G, H y F. También hay muchos otros algoritmos de búsqueda de rutas, estos algoritmos no son algoritmos A *, A * se considera el mejor. En algunos de los artículos citados al final de este artículo, Bryan Stout analiza algunos de ellos, incluidas sus ventajas y desventajas. En algún momento puede elegir uno de los dos, pero debe comprender lo que está haciendo.

Supongo que te gusta

Origin blog.csdn.net/qq_41371349/article/details/107501179
Recomendado
Clasificación