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.
- 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.