Como implementar o algoritmo AO *?

16

Percebi que diferentes estruturas de dados são usadas quando implementamos algoritmos de busca. Por exemplo, usamos filas para implementar a primeira pesquisa de largura, pilhas para implementar a pesquisa em profundidade e min-heaps para implementar o algoritmo A * . Nesses casos, não precisamos construir a árvore de pesquisa explicitamente.

Mas não consigo encontrar uma estrutura de dados simples para simular o processo de busca do algoritmo AO * . Gostaria de saber se a construção explícita da árvore de pesquisa é a única maneira de implementar o algoritmo AO *? Alguém pode me fornecer uma implementação eficiente?

Zhang
fonte
3
Bem-vinda! Lembre-se de incluir referências ao material não-padrão que você usa. Como o AO * não possui artigo da Wikipedia, um link certamente está em ordem. Espero encontrar um bom, por favor verifique.
Raphael
1
Não é apenas um gráfico (com uma função que permite mover para o nó "próximo")?
soandos
ajudaria se alguém apenas explicasse como AO * difere do algoritmo A *. não conseguia entender isso a partir do link. quanto à implementação, qualquer estrutura para árvores parece razoável ... está atravessando uma árvore, certo?
fácil

Respostas:

1

Em relação a este artigo toda vez que você expande um nó no algoritmo AO *, deve voltar para atualizar todos os custos estimados de seus predecessores.

Ao usar a estrutura de dados linear para conter os nós, você deve percorrer os elementos de dados sequencialmente e apenas um elemento de dados pode ser obtido diretamente (pilha, fila, fila de prioridade ...).

No AO * sempre que um nó é levado para expansão com base em seu custo estimado, o algoritmo itera sobre todos os nós que são seus predecessores (para atualizar seu custo estimado). Isso significa que, às vezes, você deve usar um elemento com base em seu custo estimado e, outras vezes, em seu sucessor. Não há ordem de sequência que possa atender a essas duas condições no caso geral. Provavelmente, existe uma maneira de usar estruturas de dados lineares "aninhadas", mas deve apenas imitar uma estrutura em árvore, e será melhor construir a árvore de pesquisa.

Anton
fonte
0

Estou apenas saindo da descrição à qual você vinculou, mas e um BST? Você pode construí-lo para equilibrar os nós não resolvidos. Isso economizaria tempo na etapa 2 e ajudaria a manter o tempo geral baixo, dependendo do número de travessias. Obviamente, se você equilibrar / classificar sua árvore de acordo com os nós não resolvidos, provavelmente seria pelo menos melhor do que uma estrutura de dados mais simplista, mantendo potencialmente o tempo logarítmico.

http://en.wikipedia.org/wiki/Self-balancing_binary_search_tree

Univ426
fonte
2
E você pode fazer isso?
Raphael
não está tão claro para mim como o BST seria usado porque os BSTs têm um índice numérico para cada nó e costumavam colocá-los. qual é o índice numérico usado?
vzn