Introdução à Inteligência Artificial——A* Experimento de Algoritmo

1. Objetivo do experimento:

Familiarize-se com e domine a definição, função de avaliação e processo de algoritmo de pesquisa heurística e use o algoritmo A * para resolver N problemas digitais e entenda o processo de solução e a sequência de pesquisa.

2. Princípio experimental:

O algoritmo A* é um algoritmo heurístico de busca de grafos, que se caracteriza pela definição da função de avaliação. Para busca de grafos heurísticos gerais, sempre escolha o nó com o menor valor da função de avaliação f como o nó de expansão. Portanto, f avalia os nós com base na necessidade de encontrar um caminho de custo mínimo. Portanto, o valor da função de avaliação de cada nó n pode ser considerado como tendo dois componentes: o custo real do nó inicial até o nó n e o custo real do nó n para atingir O custo estimado do nó de destino.

No algoritmo A * , se h(x)≤h*(x) existe para todo x, então h(x) é chamado de limite inferior de , indicando uma estimativa conservadora. O algoritmo A com o limite inferior h(x) como a função heurística é chamado de algoritmo A*, e a restrição: h(x)≤h*(x) é muito importante, o que pode garantir que o algoritmo A* possa encontrar a solução ótima. Neste problema, g(x) é relativamente fácil de obter, que é o custo do caminho do nó inicial até o nó atual, ou seja, a profundidade do nó atual na árvore de busca. A chave está na seleção da função heurística h(x), e a eficiência de busca do algoritmo A* depende muito da função de avaliação h(x). De um modo geral, sob a premissa de satisfazer h(x)≤h*(x), quanto maior o valor de h(x), melhor, indicando que quanto mais informações heurísticas ele carrega, menos nós serão expandidos quando o A * Pesquisas de algoritmos. Quanto maior a eficiência da pesquisa.

O BFS tradicional seleciona a profundidade do nó atual na árvore de busca como g(x), mas não usa a função heurística h(x), procura cegamente antes de encontrar o estado alvo e gera muitos nós, portanto a eficiência da busca é relativamente baixo.

Neste experimento , o número de elementos que não estão presentes e a distância de Manhattan são usados ​​como a função heurística h(x). Sempre que for selecionado na tabela aberta, o estado com a menor função de avaliação é preferencialmente selecionado para expansão.

A função de avaliação do algoritmo A* pode ser expressa como:

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

Aqui, f'(n) é a função de avaliação, g'(n) é o valor do caminho mais curto (também conhecido como custo ou custo mínimo) do ponto inicial ao ponto de destino e h'(n) é o valor do caminho mais curto de n para o valor heurístico objetivo. Como este f'(n) não pode ser conhecido antecipadamente, a seguinte função de avaliação é realmente usada:

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

onde g(n) é o custo real do nó inicial ao nó n, h(n) é o custo do nó n ao nó de destino

O custo estimado do melhor caminho para . Aqui principalmente h(n) incorpora a informação heurística da busca, porque g(n) é conhecido. Use f(n) como uma aproximação para f'(n), ou seja, use g(n) em vez de g'(n) e h(n) em vez de h'(n). Duas condições devem ser atendidas para isso:

(1) g(n)>=g'(n) (satisfeito na maioria dos casos, você pode ignorá-lo), e f deve continuar crescendo monotonicamente.

(2) h deve ser menor ou igual ao custo mínimo real h(n)<=h'(n) do nó atual para o nó alvo ;

Dois pontos são particularmente importantes. Pode-se mostrar que a aplicação de tal função de avaliação pode encontrar o caminho mais curto.

Etapas específicas: Começando do estado inicial S_0, use operadores diferentes para gerar um novo estado x e adicioná-lo à tabela aberta (correspondente ao diagrama de espaço de estado, o nó raiz gera um novo nó filho n) e, a partir de Selecione um estado x na tabela aberta de acordo com uma determinada restrição ou estratégia, de modo que o operador atue em x para gerar um novo estado e adicioná-lo à tabela aberta (o novo nó filho correspondente também é gerado no grafo de espaço de estado), e assim por diante até que seja gerado o estado de destino.

Para a "determinada estratégia" mencionada acima, no processo de busca de grafos, se a estratégia for baseada na ordenação e seleção do menor valor estimado, o processo é chamado de algoritmo A.

3. Conteúdo experimental:

1 Consulte o código principal do algoritmo A* (a saída do programa original é mostrada na Figura 1 abaixo) e tome o problema de 8 dígitos como exemplo para realizar o programa de solução do algoritmo A*, que requer o design de duas funções de avaliação diferentes.

Duas funções heurísticas h(x) :

①Número de elementos que não estão presentes

int calw(string s) //Calcula o dígito ausente h(n) deste estado

{

int re=0;

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

retornar re;

}

Distância de Manhattan

int distância(string s) {

int count=0,begin[3][3],end[3][3]; //count registra o número de passos necessários para que todas as peças se movam para a posição correta

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

início[i/3][i%3]=s[i];

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

}

for(int i = 0; i < 3; i++) // verifica a exatidão dos gráficos atuais

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

{

if(início[i][j] == 0)

continuar;

senão if(início[i][j] != fim[i][j])

{

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

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

if(início[i][j] == fim[k][w])

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

}

}

contagem de retorno;

}

Figura 1  Saída do programa original

 

2 No programa de algoritmo A* para resolver problemas de 8 números, adicione o julgamento da paridade logarítmica reversa do estado inicial e do estado de destino e, em seguida, defina o mesmo estado inicial e o estado de destino (conforme mostrado na Figura 2 abaixo), para diferentes funções de avaliação, encontre Obtenha a solução para o problema e compare seu impacto no desempenho do algoritmo de pesquisa, incluindo o número de nós expandidos, o número de nós gerados etc. A saída de referência é mostrada na Figura 3 abaixo.

Calcular pares invertidos:

int num(string s){

int a = 0;

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

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

continuar;

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

    {

if (s[j] == '0') continue;

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

}

retornar um;

}

Se a paridade do par invertido for diferente, um erro será retornado (escrito na função resolver):

int k1=num(t);

int k2=num(ps);

if(k1%2 != k2%2)

    {cout<<"Erro"<<endl;

    retornar -1;

 }

Configuração do status da meta:

const string t="123456780";

Estado inicial:

“486703215”

         

                                                     estado inicial estado alvo

                                                                  Figura 2

A comparação de desempenho de diferentes funções heurísticas é mostrada na Tabela 2

Tabela 2 Comparação de diferentes funções heurísticas

função heurística h(n)

dígito ausente

Distância de Manhattan

largura primeiro (0)

Estado inicial

486703215

486703215

486703215

estado alvo

123456780

123456780

123456780

Solução ótima

 

 

 

 

 

 

 

 

Número de nós de expansão

10374

2183

102659

Número de nós gerados

15715

3506

123849

Horas de operação

0,297s

0,159s

1,742s

3 Para o problema de 8 dígitos, defina o mesmo estado inicial e o estado de destino como no 2 acima, use o algoritmo de busca em largura (ou seja, o algoritmo A* com custo estimado h ( n ) = 0 ) para encontrar o solução do problema, e a extensão no processo de busca Número de nós, número de nós gerados.

Ou seja: h(n)=0

Configuração do programa: pw=0;

Os resultados da pesquisa com amplitude primeiro são mostrados na tabela acima.

  1. Referindo-se ao código principal do algoritmo A*, tente modificá-lo em um código que possa resolver o problema de 15 dígitos. O estado inicial (jogo de xadrez inicial) e o estado alvo (jogo de xadrez alvo) do problema de 15 dígitos são da seguinte forma: A solução do problema e a expansão durante o processo de pesquisa são necessárias: Número de nós, número de nós gerados.

Como a saída numérica de dois dígitos não é conveniente, altere [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0] para [

A,B,C,D,E,F,G,H,I,J,K,L,M,N,O], a entrada ainda é digital.

Exemplo: 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

Depois de executá-lo por um longo tempo, descobri que a função heurística de dígitos ausentes não pode ser usada.

Usar a distância de Manhattan como uma função heurística é relativamente rápido.

Os resultados do teste são mostrados na Figura 4   

                     

                     

               

Figura 4 15 resultados de pesquisa digital

Pode-se ver que o número de nós gerados é: 244266

      O número de nós estendidos é: 126723

      O tempo de busca é: 2.388s

5 Códigos parciais de modificação digital:

 

6 Envie o relatório do experimento e o programa fonte.

4. Resultados experimentais : 

1 No programa de algoritmo A* para resolver o problema de 8 dígitos, adicione a paridade logarítmica reversa do estado inicial e o estado de destino para julgar se há uma solução e, em seguida, defina o mesmo estado inicial e o estado de destino para obter a solução do problema para diferentes funções de avaliação e compare seu impacto no desempenho do algoritmo de busca, incluindo o número de nós expandidos, o número de nós gerados, etc.

No caso da mesma entrada e destino, os resultados são comparados conforme mostrado na Tabela 3 (fonte Tabela 2)

Tabela 3 Comparação dos resultados de diferentes funções de avaliação

função de avaliação

dígito ausente

Distância de Manhattan

largura primeiro

Número de nós de expansão

10374

2183

102659

Número de nós gerados

15715

3506

123849

Horas de operação

0,297s

0,159s

1,742s

O nó de expansão é count1 e o nó de geração é count2. Os resultados experimentais e o número necessário de nós estão no conteúdo experimental 2.

Quando a entrada e o alvo são os mesmos, pode-se obter que a distância de Manhattan é usada como uma função de avaliação melhor do que os dígitos inexistentes. A distância de Manhattan é usada como nó de geração e nó de expansão da função de avaliação. O número de nós excede 10.000, então pode-se ver que o espaço de busca é muito menor e a eficiência de Manhattan como função de avaliação é muito maior.

2 De acordo com o algoritmo de busca em largura e o algoritmo A*, analise as características da busca heurística.

O método de busca em largura sempre pode garantir encontrar o caminho mais curto no caso de uma solução, ou seja, o caminho com o menor número de passos. Mas o maior problema com o método de busca em largura é que há muitos nós para pesquisar, porque no método de busca em largura, todo nó expandido possível é o objeto de pesquisa. À medida que a profundidade dos nós na árvore de pesquisa aumenta, o número de nós de pesquisa aumentará rapidamente e se expandirá exponencialmente, de modo que o espaço de armazenamento necessário e o tempo de pesquisa também aumentarão exponencialmente.

Podemos descobrir que o tempo para resolver o problema de oito dígitos usando o algoritmo A* e o número de nós pesquisados ​​são muito menores do que o algoritmo de busca em largura, o que mostra que, para o problema de oito dígitos, a informação heurística selecionada é propício para melhorar a eficiência da pesquisa.

3 Comparando os problemas de 15 e 8 dígitos, tente analisar o desempenho do algoritmo A* para resolver diferentes escalas de problemas.

Ao usar dígitos inexistentes como função de avaliação para melhorar o código de 8 dígitos, o programa é executado por muito tempo e não há resultado. Portanto, se a escala do problema for muito grande, é necessário projetar a função de avaliação ao usar o algoritmo A-star. Se o projeto não for adequado, o espaço de busca será muito grande e não haverá resultados. Neste experimento, a distância de Manhattan é usada como função de avaliação e a busca ainda é muito rápida. Existem mais de 200.000 nós de geração e mais de 100.000 nós de expansão. Usar Manhattan como função de avaliação é muito eficiente e o tempo é apenas mais de 2s.

Resumo de cinco experimentos:

Com este experimento, tenho uma melhor compreensão do algoritmo de busca heurística, especialmente a aplicação e o design da função de avaliação. Uma função de avaliação adequada e eficiente é muito importante para o algoritmo de busca heurística. importante.

Acho que você gosta

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