analizar el tema del concurso algoritmo (9): Búsqueda Avanzada (4) - búsqueda A *

Esta serie es este libro de texto algoritmo extendido de la información: "entrada de la competencia algoritmo de avanzada" ( Jingdong Dangdang ), Tsinghua University Press
PDF Descargar: https://github.com/luoyongjun999/code uno de los "información adicional"
si sugerencias, contacte con: grupo (1) QQ 567 554 289; (2) de QQ, 15512356

  "Llegar a la contienda algoritmo avanzado" en el Capítulo 4, "tecnología de búsqueda", explicó el principio de recursividad, BFS, DFS, así como de dos vías amplia búsqueda, algoritmo A *, poda, iterativo profundización de búsqueda, IDA * los ejemplos clásicos, por conseguir algoritmo de búsqueda.
  Este artículo se divide buscar varias presentaciones contenido ampliado, explican más ejercicios, lo que facilita al lector una comprensión profunda de la tecnología de búsqueda.
  La primera de ellas: buscar la infraestructura.
  Parte 2: poda.
  Parte 3: Búsqueda avanzada de ancho.
  Parte 4: * Una búsqueda.
  Parte 5:
  Este artículo es la parte 4.

  Un algoritmo de búsqueda * (A * algoritmo de búsqueda) puede resolver de manera eficiente una clase de problema del camino más corto: dado un cierto punto de partida, un fin definido (o al final del predecible), el punto de partida para encontrar el camino más corto hasta el punto final.
  A * algoritmo es una función de evaluación núcleo f = g + h. Su eficacia depende del diseño de la función h.
  Muchos algoritmos problema del camino más corto, como de dos vías amplia búsqueda de una mayor eficiencia, y más alto que el algoritmo A * es una de dos vías de ancho buscar la eficiencia. Además, se puede observar a partir de los ejemplos de esta memoria (corto circuito K, etc.), A * algoritmo para resolver problemas más complejos.

1 * Un algoritmo de búsqueda detallada

  Una tecnología * algoritmo se puede resumir como: A * = algoritmo voraz óptimo de búsqueda BFS + + cola de prioridad.
  En vista del problema, "cola de prioridad Dijkstra +" es "cola de prioridad BFS +", esta vez también se puede resumir como: "algoritmo A * = codiciosos de búsqueda óptima + Dijkstra + cola de prioridad."
  A continuación diagrama de recorrido más corto de un ejemplo de los principios del razonamiento algoritmo A *.
  Tenga en cuenta que, además de la figura esta aplicación, A * algoritmo puede ser aplicado en más lugares.

1.1 codiciosos de búsqueda óptima

  Óptima de búsqueda codiciosa (Greedy mejor primera búsqueda) es una búsqueda heurística, de alta eficiencia, pero la solución resultante no es necesariamente óptima.
  La idea básica del algoritmo es codicioso: Desde el punto de inicio, seleccione el siguiente nodo en sus nodos vecinos cuando usted coge el nodo más cercano al extremo. Por supuesto, es prácticamente imposible saber de antemano el nodo de la meta, por no hablar de escoger el punto de vecino más cercano. Por lo tanto, el método sólo se puede estimar, por ejemplo, en el diagrama de trellis de acuerdo con la distancia Manhattan se estima a partir del nodo vecino para el punto final.
  Cómo programar? Todavía con "cola de prioridad BFS +", sin embargo, introduzca la cola de prioridad, no la distancia desde el punto de partida hasta el punto actual k s, pero la distancia desde el punto actual k t el final.
  Obviamente, codiciosos óptima de búsqueda para evitar un gran número de nodos, elegir sólo aquellos "buenos" nodos, extremadamente rápido, pero aparentemente como resultado camino no es necesariamente la mejor.
  Accesible en el enrejado diagrama, codiciosos algoritmo de búsqueda es resultados óptimos la solución óptima. Debido a que para la estimación de la distancia Manhattan es la más corta de hecho existe, así que cada vez para encontrar el siguiente nodo, es claramente el mejor.
  En el diagrama de trellis tiene un trastorno, seleccionado de la distancia Manhattan de acuerdo con el siguiente nodo de salto, la ruta siempre vendrá a la pared, a continuación, desvíos finalmente obtenida no es necesariamente el camino más corto.
  pensamiento codiciosa algoritmo de búsqueda es: "Mira al final, independientemente del punto de partida". Paso a paso, no ir hacia atrás y decide no corregir el mal. Y, con Manhattan una estimación simple de esta distancia, no podemos pasar por alto el obstáculos por delante.

1,2 Dijkstra (BFS)

  cola de prioridad implementado utilizando Dijkstra (BFS), se puede obtener de manera más eficiente un camino más corto punto de partida para todos los demás puntos. BFS el algoritmo de Dijkstra tienen un problema común: la búsqueda siguiente es ciego, el sentido inútil de dirección. Incluso teniendo en cuenta punto final, el Dijkstra también necesitan casi todos los vértices y aristas en la cola de prioridad para el procesamiento hasta el final de la cola de prioridad salga hacia fuera. Es adecuado para la búsqueda de la mejor ruta a un punto de partida de todos los demás nodos, y no sólo al final de un camino.
  el algoritmo de Dijkstra es pensar: "Mira el punto de partida, independientemente del fin." Etc. travesía casi lo mismo, siempre encuentro final.

1.3 Principios y complejidad del algoritmo A *

  Un algoritmo de búsqueda * es la combinación óptima de la codicia y de Dijkstra "Look y punto de partida, sino también para ver el fin." Es más rápido que Dijkstra, porque no era tan ciego Dijkstra, sino que tiene la capacidad de predecir la búsqueda codiciosa, sino también la solución óptima.
  Es cómo combinar estos dos algoritmos?
  Siempre que el punto de partida es s, el fin es t, la posición actual del punto i paseo algoritmo, el camino st divide en dos partes: sit.
  (1) Ruta de Si por Dijkstra optimalidad de garantía;
  ruta de acceso (2) que realiza una predicción de búsqueda codiciosa, la selección de un nodo siguiente i;
  (3) cuando vaya en una pared, i se descartarán, y entrar de nuevo en el suelo para volver a seleccionar un nuevo punto j, j todavía Dijkstra garantía de optimalidad.
  Por encima de las ideas pueden utilizar una función de coste para la operación específica:
    F (i) = G (i) + H (i)
  F (i) es la evaluación del punto i, g (i) es el costo de s a k, h ( i) es el costo de k a t.
  Si g = 0, entonces f = h, A * degenerados búsqueda codiciosa;
  si h = 0, entonces f = g, A * degenera Dijkstra.
  A * cada uno basado en el más pequeño f (i) para seleccionar el siguiente punto. g (i) es una ruta se ha viajado, son conocidos; h (i) no es el camino pronosticado atravesado, de modo que f (i) rendimiento calculado depende de h (i) a.
  A la complejidad del algoritmo *, en el peor de los casos límite superior es el Dijkstra, o cola de BFS +, en general, será mejor.

1.4 A * optimalidad algoritmo

  Solución A * algoritmo es óptimo ¿verdad? La respuesta está determinada, su solución y la solución Dijkstra, es el camino más corto.
  Cuando k llega al final de t, con una h (t) = 0, entonces f (t) = g (t ) + h (t) = g (t), y g (t) es la solución óptima obtenida por Dijkstra por lo tanto esta posición al final de t, una solución * algoritmo es óptimo.
  Resumen: A * se obtiene por el algoritmo de Dijkstra para obtener resultados óptimos, el óptimo codicioso predicción de búsqueda por dirección de extensión, para reducir el número de nodos de búsqueda.

1.5 tres algoritmos comparativos

  Por debajo de esta cifra, entender con precisión la diferencia entre los tres algoritmos. Figura punto de partida s, el fin es t, obstáculos Haig. Figura colocarse con sumo cuidado las barreras de ubicación, para demostrar los tres algoritmos es cómo conseguir alrededor de los obstáculos.



La figura tres comparativo Algoritmo 1

  Tres algoritmos se basan en la "cola de prioridad BFS +". celosía Digital se busca nodo, en la cola de prioridad y procesado. rejilla sombra es una ruta completa a la resultante. La distancia reticular digital, Manhattan distancia calculada. Dijkstra (BFS) algoritmo para atravesar la rejilla a lo sumo, el algoritmo de búsqueda codiciosa menos óptima para atravesar la red.
  (1) Dijkstra (BFS) algoritmo. número de cuadrícula, s es la distancia más corta desde el punto de partida a la red. Cuando el algoritmo de búsqueda, y escribirlos en la distancia reticular desde el principio a la cola de prioridad, cuando la eyección, la s se obtiene camino más corto a estas celosías. Finalmente, cuando la distancia más corta desde el final del tiempo de pop cola t prioridad, es decir, para obtener 14 s a t.
  (2) óptima de búsqueda codiciosa. número de cuadrícula, t es de la red hasta el final de la distancia Manhattan. Los lectores pueden analizar cuidadosamente su proceso de trabajo, en el presente documento se describe brevemente como sigue: A partir de un mínimo Manhattan distancia S a lo largo de, ha entrado en una pared a 2; 2 de expulsión de la cola de prioridad, el 3 restante es el más pequeño; pop-3, el mínimo restante es 4; ......; continuar con este proceso, los nodos aparecen más cerca, pero en última instancia rechazado los una a una bomba que resultó hasta las barreras, y finalmente a t. La trayectoria resultante no es la ruta óptima.
  (3) A * búsqueda. Por ejemplo, células i en la figura es "s a i i + para el más corto de la distancia Manhattan t". En el proceso de expansión del algoritmo de rejilla, el número de referencia entrará en el enrejado de cola de prioridad. En la ilustración, la primera de expulsión de todo marcado como una rejilla 10, y entonces aparece la etiqueta de una rejilla 12, la ventana emergente hasta el último punto de final t. El 14 st resultante es el camino más corto.
  Cómo imprimir la ruta completa? Tres algoritmos se basan en BFS, BFS y el registro de ruta es muy simple: u v punto en el nodo vecino extendida, al grabar en su nodo predecesor v u, es decir, puede ser rastreado de la U v; después de alcanzar el objeto, gradualmente desde la parte trasera punto final al punto de partida, se obtiene una trayectoria. En el algoritmo de Dijkstra, cada uno de expulsión de la cola de prioridad, se obtienen más corto nodo camino, se extienden hacia fuera desde el nodo vecino, el camino más corto continuará a formar, es posible de acuerdo con la relación entre el nodo predecesor y sucesor , imprimir fácilmente una ruta completa más corta [Si necesita imprimir el camino más corto, "Llegar a concurso algoritmo avanzado" Referencias "10.9 ruta más corta", muestra el recorrido de impresión de código ]. algoritmo A * algoritmo de Dijkstra para determinar la relación entre el predecesor sucesor, también ser capaz de imprimir un camino más corto. Búsqueda ávidos de la mejor impresión camino más fácil es el camino de la impresión ordinaria BFS.

1.6 Diseño función h

  En dos dimensiones, hay tres métodos pueden ser aproximadas h. La siguiente (ix, iy) son las coordenadas del punto i, (tx, ty) son las coordenadas del punto final t.
  (1) la distancia Manhattan. Escenario: sólo cuatro direcciones (arriba, abajo, izquierda, derecha) movimiento.
    H (I) = ABS (IX - TX) + ABS (iy - TY)
  (2) de la diagonal. Escenario: puede moverse en ocho direcciones, como mover el rey de ajedrez.
    H (i) = max {ABS (IX - TX), ABS (iy - TY)}
  (. 3) distancia euclidiana. Escenario: usted puede moverse en cualquier dirección.
    h (i) = sqrt (( ix - tx) 2 + (iy - ty) 2)
  problemas no planos, la necesidad de diseñar una función adecuada h, el último ejemplo hay alguna función más compleja h.
  Tenga en cuenta las siguientes reglas básicas en el diseño de h:
  (. 1) G y h debería ser el mismo método de cálculo. Por ejemplo, una distancia Manhattan h, g debe ser la distancia Manhattan. Si la calcula de forma diferente, f = g + h no tiene sentido.
  (2) La aplicación de elección correcta h. valor H de cada nodo, que debe ser capaz de reflejar correctamente el punto final de la distancia. Por ejemplo, el siguiente nodo hop tiene dos opciones: A (280, 319), B (300, 300), se debe seleccionar si la distancia Manhattan A, debe ser seleccionado de la distancia euclidiana B. Si sólo puede ir en cuatro direcciones (para ser calculada por trayecto distancia de Manhattan), calculado utilizando la distancia euclídea será incorrecto.
  (3) h debe ser superior a todos ruta existente. ejemplos anteriores, h (i) es igual a menos de la totalidad posible longitud de la trayectoria, es decir, la longitud del camino real resultante es mayor que h (i). Esta regla puede ser explicada por los dos puntos discutidos.
  1) h (i) es más largo que el camino óptimo que está realmente presente. Supongamos que este trayecto óptimo es el camino real, debido a que el programa es una h (i) se extienden al siguiente nodo, es probable que renunciar camino es, mientras que la otra vía no seleccionado óptima, lo que puede causar un error.
  2) h (i) es más corta que toda la ruta existente de la misma. En este caso, no existe en un camino de longitud h (i) si el programa basado en h (i) para extender el siguiente nodo, finalmente ciertamente rechazado; no importa, sin embargo, el programa utilizará BFS operaciones de la cola bombas de distancia estos errores punto, para volver a la nodo apropiado, ampliando de este modo la trayectoria real, aún podemos asegurar la exactitud.
  El (3) El punto más importante anteriormente, la aplicación * Un algoritmo debe prestar especial atención.

Ejemplos 2 A algoritmo *

  A * algoritmo La dificultad principal es el diseño de una función adecuada h, y es fácil de código. problemas FIG por ejemplo, utilizando el Dijkstra BFS g o función, A * mediante la función f = g + h, entonces en lugar de g a f siempre que el momento de la codificación. Los lectores pueden probar el camino más corto hacia el título fue cambiado a la teoría de grafos con algoritmo A *, por ejemplo POJ el 2243 .
  He aquí dos ejemplos que compleja.

2,1 cortocircuito K

  Descripción del problema POJ 2249 : Dado un gráfico, definir la k de partida y el punto t s final, y el número; k-ésima trayectoria corta buscando s a t. Permitir que el bucle. Diferentes longitudes de trayectoria de la misma, también se considera que es completamente diferente.
  K problema de corto circuito es un ejemplo clásico del algoritmo A *, casi se aplican por completo la función de evaluación * Un algoritmo.
  Respectivamente Ley contra la violencia y el algoritmo A * a continuación.
(1) La violencia: BFS + cola de prioridad
  buscar todas las BFS caminos, una cola de prioridad en orden desde la salida de trayecto tan corto o largo.
  "Cola de prioridad BFS +" para la mayor parte de cortocircuito en el "BFS + cola de prioridad" en esta sección se han explicado antes. El principio es que cuando me ampliado de nuevo a un punto, si este nuevo camino para llegar a la última vez que el camino más corto, lo reemplaza; Queue permite las ventajas de los nodos de acuerdo con la longitud de la salida de ruta de acceso tiene que asegurarse de optimalidad . elemento de la cola es una tupla (i, dist (si)) , es decir el nodo i y la longitud del camino de Si.
  Cuando BFS encontrar todos los caminos, es el más "BFS cola de prioridad +" sencilla, de nuevo vecino extendida i, para calcular su distancia s, y luego directamente en la cola, no se compara con el caso anterior de i en la cola. Un nodo i entrará en la prioridad de la cola muchas veces, ya que puede cada vino de una pluralidad de vecino; representan cada uno un camino de s a i. Estos caminos permiten que el dist cola de prioridad enviada por el orden de corto a largo, i de la prioridad de la cola pop x-ésimo, que es i S para el x-ésimo cortocircuito. Para el final de t, que es el número de veces que las estadísticas de la cola, los primeros tiempos de parada K, este es el primer cortocircuito K.
  K corto circuito en cuestión, es posible formar una trayectoria de bucle. Algunos de los temas a permitir que el bucle, y algunos no lo hacen. Si permite que el bucle, luego pensar en cuántas vueltas se encuentran en el bucle, los nodos en el bucle varias veces para entrar en la cola, K puede ser infinita.
  En el algoritmo de ruta más corta determina que no se requiere un bucle, ya que la operación de actualización ha eliminado función implícita bucle.
  Complejidad: Ley contra la violencia a causa de la necesidad de generar casi todos los caminos, mientras que el número de caminos es exponencial, por lo que la complejidad de la Ley contra la violencia es muy alta.
  Los siguientes BFS violencia explicación proceso de búsqueda de todos los caminos con una simple ilustración.

Figura 2 un simple figura.

  La siguiente tabla muestra los pasos del algoritmo. Detrás del subíndice representa la longitud de la trayectoria desde el nodo s al nodo, por ejemplo, u2, es la tupla (u, 2), es decir, el nodo u, SU y la longitud del camino de 2. bucle Paso no está listado.

paso el equipo Vecinos en el equipo cola de prioridad La nueva trayectoria resultante ruta de salida de la Selección
1 \ \ (s) { \ (S_0 \) }
2 \ (S_0 \) u, v { \ (U_2, V_4 \) } { \ (S \) - \ (u_2 \) , \ (s \) - \ (V_4 \) }
3 \ (U_2 \) \(Vermont\) \ (V_3, v_4, t_8 \) { \ (S \) - \ (u_2 \) - \ (V_3 \) , \ (S \) - \ (u_2 \) - \ (t_8 \) } \ (S \) - \ (u_2 \)
4 \ (V_3 \) \ (T \) { \ (V_4, t_8, t_6 \) } \ (S \) - \ (u_2 \) - \ (V_3 \) - \ (t_6 \) \ (S \) - \ (u_2 \) - \ (V_3 \)
5 \ (V_4 \) \(Utah\) { \ (T_8, t_6, u_5, t_7 \) } \ (S \) - \ (v_4 \) - \ (u_5 \) , \ (S \) - \ (v_4 \) - \ (t_7 \) \ (P \) - \ (v_4 \)
6 \ (U_5 \) \ (T \) { \ (T_8, t_6, t_7, t_ {11} \) } \ (S \) - \ (v_4 \) - \ (u_5 \) - \ (t_ {11} \) \ (S \) - \ (V_4 \) - \ (u_5 \)
7 \ (T_6 \) { \ (T_8, t_7, t_ {11} \) } \ (S \) - \ (u_2 \) - \ (V_3 \) - \ (t_6 \)
8 \ (T_7 \) \ (T \) { \ (T_8, t_ {11}, u_ {13} \) } \ (S \) - \ (v_4 \) - \ (t_7 \) - \ (u_ {13} \) \ (S \) - \ (v_4 \) - \ (t_7 \)
9 \ (T_8 \) \ (V \) { \ (T_ {11}, u_ {13}, v_ {11} \) } \ (S \) - \ (u_2 \) - \ (t_8 \) - \ (v_ {11} \) \ (S \) - \ (u_2 \) - \ (t_8 \)
10 \ (T_ {11} \) { \ (U_ {13}, v_ {11} \) } \ (S \) - \ (v_4 \) - \ (u_5 \) \ (- t_ {11} \)
11 \ (V_ {11} \) { \ (U_ {13} \) } \ (S \) - \ (u_2 \) - \ (t_8 \) - \ (v_ {11} \)
12 \ (U_ {13} \) {} \ (S \) - \ (v_4 \) - \ (t_7 \) - \ (u_ {13} \)

  从第二列的“出队”可以看到,共产生10个路径,按从短到长的顺序排队输出。从起点s到终点t共有4条路径,t在第7、8、9、10步出队的时候,输出了第1、第2、第3、第4路径。表格中也列出了s到每个结点的多个路径和它们的长度,例如s-u有3个路径,s-v有3个路径。
(2)A*算法求K短路
  从暴力法可以知道:
  1)从优先队列弹出的顺序,是按这些结点到s的距离排序的。
  2)一个结点i从优先队列第x次弹出,就是s-i的第x短路;终点t从队列中第K次弹出,就是s-t的第K短路。
  如何优化暴力法?是否可以套用A*算法?
  联想前面讲解A*算法求最短路的例子,A*算法的估价函数f(i) = g(i) + h(i),g是从起点s到i的距离,h是i到终点t的最短距离(例子中是曼哈顿距离)。
  那么在K短路问题中,可以设计几乎一样的估价函数。g(i)仍然是起点s到i的距离;而h(i),只是把曼哈顿距离改为从i到t的最短距离。这个最短距离如何求?用Dijkstra算法,以终点t为起点,求所有结点到t的最短距离即可。
  编程非常简单。仍用暴力法的“BFS+优先队列”,但是在优先队列中,用于计算的不再是g(i),而是f(i)。当终点t第K次弹出队列时,就是第K短路。
  根据前面对A*算法原理的解释,求K短路的过程将得到很大优化。虽然在最差情况下,算法复杂度的上界仍是暴力法的复杂度,但优化是很明显的。

2.2 poj 1945

Power Hungry Cows http://poj.org/problem?id=1945
题目描述:两个变量a、b,初始值a = 1, b = 0。每一步可以执行一次a×2,b×2,a+b,|a-b|之一的操作,并把结果再存回a或者b。问最快多少步能得到一个整数P,1 <= P <= 20,000。
  例如P = 31,需要6步:
         a  b
  初始值:   1  0
  a×2,存到b: 1  2
  b×2:    1  4
  b×2:    1  8
  b×2:    1  16
  b×2:    1  32
  b-a:     1  31
样例输入
31
样例输出
6
--------------------------------------------------------------

题解
(1)BFS+剪枝
  这一题是典型的BFS。从{a, b}可以转移到8种情况,即{2a, a}、{2a, b}、{2b,a}、{2b,b}等等。把每种{a, b}看成一个状态,那么1个状态可以转移到8个状态。编码时,再加上去重和剪枝。此题P不是太大,“BFS+剪枝”可行。
(2)A*算法
  如何设计估价函数f(i) = g(i) + h(i) ?
  g(i)是从初始态到i状态的步数。h(i)是从i状态到终点的预期步数,它应该小于实际的步数。如何设计呢?容易观察到,{a, b}中的较大数,一直乘以2递增,是最快的。例如样例中的31,在起点状态,\(2^5\) > 31,经5步可以超过目标值,所以h = 5。

3 一些习题

  下面的题目有多种实现方法,尝试用A*算法来做。
  洛谷P1379 八数码难题,https://www.luogu.com.cn/problem/P1379。八数码有多种解法,A*也是经典解法之一。
  洛谷 2324 骑士精神,https://www.luogu.com.cn/problem/P2324
  洛谷P2901 Cow Jogging https://www.luogu.com.cn/problem/P2901,K短路。

Supongo que te gusta

Origin www.cnblogs.com/luoyj/p/12515018.html
Recomendado
Clasificación