Introducción a la inteligencia artificial——Experimento de algoritmo A*

1. Propósito del experimento:

Familiarizarse y dominar la definición, la función de evaluación y el proceso algorítmico de búsqueda heurística, y utilizar el algoritmo A* para resolver N problemas digitales, y comprender el proceso de solución y la secuencia de búsqueda.

2. Principio experimental:

El algoritmo A* es un algoritmo heurístico de búsqueda de grafos, que se caracteriza por la definición de la función de evaluación. Para la búsqueda general de gráficos heurísticos, elija siempre el nodo con el valor f de la función de evaluación más pequeño como nodo de expansión. Por lo tanto, f evalúa los nodos en función de la necesidad de encontrar una ruta de costo mínimo. Por lo tanto, se puede considerar que el valor de la función de evaluación de cada nodo n tiene dos componentes: el costo real desde el nodo inicial hasta el nodo n y el costo real desde el nodo n para alcanzar El costo estimado del nodo de destino.

En el algoritmo A * , si h(x)≤h*(x) existe para todo x, entonces h(x) se denomina límite inferior de , lo que indica una estimación conservadora. El algoritmo A con el límite inferior h(x) como función heurística se denomina algoritmo A*, y la restricción: h(x)≤h*(x) es muy importante, lo que puede garantizar que el algoritmo A* pueda encontrar la solución óptima. En este problema, g(x) es relativamente fácil de obtener, que es el costo del camino desde el nodo inicial hasta el nodo actual, es decir, la profundidad del nodo actual en el árbol de búsqueda. La clave está en la selección de la función heurística h(x), y la eficiencia de búsqueda del algoritmo A* depende en gran medida de la función de evaluación h(x). En términos generales, bajo la premisa de satisfacer h(x)≤h*(x), cuanto mayor sea el valor de h(x), mejor, lo que indica que cuanta más información heurística lleve, menos nodos se expandirán cuando A * búsquedas de algoritmos Cuanto mayor sea la eficiencia de búsqueda.

El BFS tradicional selecciona la profundidad del nodo actual en el árbol de búsqueda como g(x), pero no usa la función heurística h(x), busca a ciegas antes de encontrar el estado objetivo y genera demasiados nodos, por lo que la eficiencia de la búsqueda es relativamente bajo.

En este experimento , el número de elementos que no están presentes y la distancia de Manhattan se utilizan como función heurística h(x). Cada vez que se selecciona de la tabla abierta, se selecciona preferentemente para expansión el estado con la función de evaluación más pequeña.

La función de evaluación del algoritmo A* se puede expresar como:

    f'(n) = g'(n) + h'(n) 

Aquí, f'(n) es la función de evaluación, g'(n) es el valor del camino más corto (también conocido como costo o costo mínimo) desde el punto de inicio hasta el punto de destino, y h'(n) es el valor de la ruta más corta desde n hasta el valor heurístico del objetivo. Dado que esta f'(n) no se puede conocer de antemano, en realidad se utiliza la siguiente función de evaluación:

f(n) = g(n) + h(n) 

donde g(n) es el costo real desde el nodo inicial hasta el nodo n, h(n) es el costo desde el nodo n hasta el nodo objetivo

El costo estimado de la mejor ruta para . Aquí principalmente h(n) incorpora la información heurística de la búsqueda, porque se conoce g(n). Use f(n) como una aproximación a f'(n), es decir, use g(n) en lugar de g'(n) y h(n) en lugar de h'(n). Para ello se deben cumplir dos condiciones:

(1) g(n)>=g'(n) (satisfacido en la mayoría de los casos, puede ignorarlo), y f debe seguir aumentando monótonamente.

(2) h debe ser menor o igual que el costo mínimo real h(n)<=h'(n) desde el nodo actual hasta el nodo de destino ;

Dos puntos son particularmente importantes. Se puede demostrar que aplicando tal función de valoración se puede encontrar el camino más corto.

Pasos específicos: Comenzando desde el estado inicial S_0, use diferentes operadores para generar un nuevo estado x y agréguelo a la tabla abierta (correspondiente al diagrama de espacio de estado, el nodo raíz genera un nuevo nodo secundario n), y luego desde Seleccionar un estado x en la tabla abierta de acuerdo con una cierta restricción o estrategia, de modo que el operador actúe sobre x para generar un nuevo estado y agregarlo a la tabla abierta (el nuevo nodo secundario correspondiente también se genera en el gráfico de espacio de estado), y así sucesivamente hasta que se genera el estado de destino.

Para la "estrategia determinada" mencionada anteriormente, en el proceso de búsqueda de gráficos, si la estrategia se basa en clasificar y seleccionar el valor estimado más pequeño, el proceso se denomina algoritmo A.

3. Contenido experimental:

1 Consulte el código central del algoritmo A* (la salida del programa original se muestra en la Figura 1 a continuación) y tome el problema de 8 dígitos como ejemplo para realizar el programa de solución del algoritmo A*, que requiere el diseño de dos funciones de evaluación diferentes.

Dos funciones heurísticas h(x) :

①Número de elementos que no están presentes

int calw(string s) //Calcula el dígito ausente h(n) de este estado

{

intre=0;

for(int i=0;i<9;i++) if(s[i]!=t[i]) re++;

volver re;

}

Distancia de Manhattan

int distancia(cadena s) {

int count=0,begin[3][3],end[3][3]; //count registra el número de pasos necesarios para que todas las piezas se muevan a la posición correcta

para(int i = 0; i < 8; i++){

comenzar[i/3][i%3]=s[i];

fin[i/3][i%3]=t[i];

}

for(int i = 0; i < 3; i++) // comprobar la corrección de los gráficos actuales

para(int j = 0; j < 3; j++)

{

si (comienzo [i] [j] == 0)

continuar;

de lo contrario si (comienza [i] [j] != final [i] [j])

{

para(int k=0; k<3; k++)

para(int w=0; w<3; w++)

si (comienzo [i] [j] == final [k] [w])

cuenta = cuenta + fabs(ik*1.0) + fabs(jw*1.0);

}

}

recuento de retorno;

}

Figura 1  Salida del programa original

 

2 En el programa de algoritmo A* para resolver problemas de 8 números, agregue el juicio de la paridad logarítmica inversa del estado inicial y el estado objetivo, y luego establezca el mismo estado inicial y estado objetivo (como se muestra en la Figura 2 a continuación), para diferentes funciones de evaluación, encuentre Obtenga la solución al problema y compare su impacto en el rendimiento del algoritmo de búsqueda, incluida la cantidad de nodos expandidos, la cantidad de nodos generados, etc. La salida de referencia se muestra en la Figura 3 a continuación.

Calcular pares inversos:

int num(cadena s){

int a = 0;

para (int i = 0; i < 9; i++){

si (s[i] == '0')

continuar;

para (int j = i+1; j < 9; j++)

    {

si (s[j] == '0') continuar;

si (s[i]>s[j]) a++;}

}

devolver un;

}

Si la paridad del par inverso es diferente, se devolverá un error (escrito en la función de resolución):

int k1=num(t);

int k2=num(ps);

si(k1%2 != k2%2)

    {cout<<"Error"<<endl;

    devolver -1;

 }

Configuración del estado del objetivo:

cadena constante t="123456780";

Estado inicial:

“486703215”

         

                                                     estado inicial estado objetivo

                                                                  Figura 2

La comparación de rendimiento de diferentes funciones heurísticas se muestra en la Tabla 2

Tabla 2 Comparación de diferentes funciones heurísticas

función heurística h(n)

dígito ausente

distancia entre manhattan

ancho primero (0)

estado inicial

486703215

486703215

486703215

estado objetivo

123456780

123456780

123456780

Solucion optima

 

 

 

 

 

 

 

 

Número de nodos de expansión

10374

2183

102659

Número de nodos generados

15715

3506

123849

horas de operación

0.297s

0.159s

1.742s

3 Para el problema de 8 dígitos, establezca el mismo estado inicial y estado objetivo que en el anterior 2, use el algoritmo de búsqueda primero en amplitud (es decir, el algoritmo A* con costo estimado h ( n ) = 0 ) para encontrar el solución del problema, y ​​la extensión en el proceso de búsqueda Número de nodos, número de nodos generados.

Es decir: h(n)=0

Configuración del programa: pw=0;

Los resultados de la búsqueda con amplitud primero se muestran en la tabla anterior.

  1. Con referencia al código central del algoritmo A*, intente modificarlo en un código que pueda resolver el problema de 15 dígitos. El estado inicial (juego de ajedrez inicial) y el estado objetivo (juego de ajedrez objetivo) del problema de 15 dígitos son de la siguiente manera Se requiere la solución del problema y la expansión durante el proceso de búsqueda Número de nodos, número de nodos generados.

Debido a que la salida de números de dos dígitos no es conveniente, cambie [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0] a [

A,B,C,D,E,F,G,H,I,J,K,L,M,N,O], la entrada sigue siendo digital.

Ejemplo: 11 9 4 15 1 3 0 12 7 5 8 6 13 2 10 14

5 1 3 4 2 6 7 8 9 10 12 0 13 14 11 15

Después de ejecutarlo durante mucho tiempo, descubrí que no se puede usar la función heurística de dígitos ausentes.

Usar la distancia de Manhattan como una función heurística es relativamente rápido.

Los resultados de la prueba se muestran en la Figura 4   

                     

                     

               

Figura 4 15 resultados de búsqueda digital

Se puede ver que el número de nodos generados es: 244266

      El número de nodos extendidos es: 126723

      El tiempo de búsqueda es: 2.388s

5 Códigos parciales de modificación digital:

 

6 Envíe el informe del experimento y el programa fuente.

4. Resultados experimentales : 

1 En el programa de algoritmo A* para resolver el problema de 8 dígitos, agregue la paridad logarítmica inversa del estado inicial y el estado objetivo para juzgar si hay una solución, y luego establezca el mismo estado inicial y estado objetivo para obtener la solución del problema para diferentes funciones de evaluación, y comparar su impacto en el desempeño del algoritmo de búsqueda, incluyendo el número de nodos expandidos, el número de nodos generados, etc.

En el caso de la misma entrada y objetivo, los resultados se comparan como se muestra en la Tabla 3 (fuente Tabla 2)

Tabla 3 Comparación de los resultados de diferentes funciones de valoración

función de valoración

dígito ausente

distancia entre manhattan

ancho primero

Número de nodos de expansión

10374

2183

102659

Número de nodos generados

15715

3506

123849

horas de operación

0.297s

0.159s

1.742s

El nodo de expansión es cuenta 1 y el nodo de generación es cuenta 2. Los resultados experimentales y el número requerido de nodos se encuentran en el contenido experimental 2.

Cuando la entrada y el objetivo son iguales, se puede obtener que la distancia de Manhattan se usa como una función de evaluación mejor que los dígitos no existentes.La distancia de Manhattan se usa como el nodo de generación y el nodo de expansión de la función de evaluación.El número de nodos supera los 10.000, por lo que se puede observar que el espacio de búsqueda es mucho menor, y la eficiencia de Manhattan como función de valoración es mucho mayor.

2 De acuerdo con el algoritmo de búsqueda primero en amplitud y el algoritmo A*, analice las características de la búsqueda heurística.

El método de búsqueda primero en amplitud siempre puede garantizar encontrar el camino más corto en el caso de una solución, es decir, el camino con el menor número de pasos. Pero el mayor problema con el método de búsqueda primero en amplitud es que hay demasiados nodos para buscar, porque en el método de búsqueda primero en amplitud, cada posible nodo expandido es el objeto de búsqueda. A medida que aumenta la profundidad de los nodos en el árbol de búsqueda, la cantidad de nodos de búsqueda aumentará rápidamente y se expandirá exponencialmente, por lo que el espacio de almacenamiento requerido y el tiempo de búsqueda también aumentarán exponencialmente.

Podemos encontrar que el tiempo para resolver el problema de ocho dígitos usando el algoritmo A* y el número de nodos buscados son mucho más cortos que el algoritmo de búsqueda primero en amplitud, lo que muestra que para el problema de ocho dígitos, la información heurística seleccionada es propicio para mejorar la eficiencia de la búsqueda.

3 Comparando los problemas de 15 y 8 dígitos, intente analizar el rendimiento del algoritmo A* para resolver diferentes escalas de problemas.

Cuando se utilizan dígitos que no existen como función de evaluación para mejorar el código de 8 dígitos, el programa se ejecuta durante mucho tiempo y no hay ningún resultado. Por lo tanto, si la escala del problema es demasiado grande, es necesario diseñar la función de evaluación cuando se utiliza el algoritmo de estrella A. Si el diseño no es adecuado, el espacio de búsqueda será demasiado grande y no habrá resultados. En este experimento, la distancia de Manhattan se utiliza como función de evaluación y la búsqueda sigue siendo muy rápida. Hay más de 200.000 nodos de generación y más de 100.000 nodos de expansión. Usar Manhattan como función de evaluación es muy eficiente y el tiempo es sólo más de 2s.

Resumen de cinco experimentos:

A través de este experimento, tengo una mejor comprensión del algoritmo de búsqueda heurística, especialmente la aplicación y el diseño de la función de evaluación. Una función de evaluación adecuada y eficiente es muy importante para el algoritmo de búsqueda heurística. importante.

Supongo que te gusta

Origin blog.csdn.net/cangzhexingxing/article/details/124001898
Recomendado
Clasificación