Eu tenho um mapa quadrado. Somente movimentos horizontais e verticais são permitidos (sem diagonais). O custo do movimento é sempre 1.
Estou implementando um algoritmo A * nesse mapa, usando a distância de Manhattan como uma heurística de distância. Essa heurística é consistente? Posso evitar a verificação g(node)
nos nós que estão no conjunto FECHADO?
Edit: Por consistente eu quero dizer monotônico.
tiles
path-finding
geometry
Emiliano
fonte
fonte
Respostas:
Para realmente responder à sua pergunta: a distância do manhatten é consistente quando você é obrigado a se deslocar vertical / horizontalmente ao longo de uma grade não ponderada (isso pode ser facilmente mostrado pela definição na wikipedia) . Portanto, sim, no seu caso, você pode evitar verificar novamente os nós no conjunto fechado.
No entanto, depois de permitir o movimento diagonal ou de qualquer ângulo, a distância de manhatten torna-se inadmissível porque superestima os custos diagonais, o que significa necessariamente que não é consistente.
fonte
h(x) = min(manhattan(p1), manhattan(p2))
(ou seja, p1 ou p2 são um bom ponto final e eu quero chegar ao mais próximo). Issoh(x)
ainda é monotônico?h(x, p1)
eh(x, p2)
são consistentes,min(h(x,p1), h(x,p2))
também será consistente. Isso é fácil de mostrar a partir da definição na wikipedia (precisaríamos mostrar issomin(h(x, p1), h(x, p2)) <= distance(x,y) + min(h(y, p1), h(y, p2))
para todos os nósx
ey
com uma borda entre eles. Agora suponha queh(x, p1)
seja o mínimo; você pode mostrar que é definitivamente<=
o lado direito, usando o fato de que as duas heurísticas são consistentes?)Sim, a distância de Manhattan entre dois pontos é sempre a mesma, assim como a distância regular entre eles. Você pode pensar na distância de Manhattan como sendo os componentes X e Y de uma linha que corre entre os dois pontos.
Esta imagem ( da Wikipedia ) ilustra bem isso:
A linha verde é a distância real.
As linhas azul , vermelha e amarela representam a mesma distância de Manhattan (12 unidades). Não importa qual combinação de movimentos para cima e para a direita você desenhe do ponto inferior esquerdo para o canto inferior direito, você terá a mesma distância total de Manhattan.
fonte
h(x) = 1000
, o que obviamente não é consistente) . Ele pode evitar verificar novamente os nós, mas apenas porque a distância de Manhatten é consistente, o que esta resposta não mostra.2*manhatten
satisfaz isso, mas não é consistente.Como extensão da resposta de Byte56, gostaria de salientar que, em seu conjunto de dados específico, usar a Distância de Manhattan como sua função heurística será sempre uma heurística perfeita, no sentido em que sempre retornará o custo real do caminho (supondo que exista nada "bloqueando" os caminhos).
Você também deve observar que todos os nós na direção correta (horizontal ou verticalmente) produzirão a mesma distância esperada (porque existem muitos caminhos igualmente curtos para a meta). Você deve estar ciente de que sua fila de prioridades (conjunto aberto) deve, em caso de prioridades vinculadas, remover da fila o nó adicionado mais recente primeiro (LIFO - Último a entrar, primeiro a sair). Ao fazer isso, você examinará apenas os nós que terminarão no caminho ideal . Se você examinar nós igualmente adequados da maneira FIFO (primeiro a entrar, primeiro a sair), estará examinando efetivamente todos os nós que fazem parte do melhor caminho. Esse problema surge porque existem vários caminhos igualmente bons para o nó da meta.
fonte
Não tenho certeza do que você quer dizer com "sempre" consistente. A distância de Manhattan em uma grade fixa é independente do caminho percorrido? Sim, como a resposta do Byte56 disse.
No entanto, por exemplo, a distância de Manhattan não é invariável em rotações. Por exemplo, a distância de Manhattan ( norma L1 ) entre a origem e um ponto
(10,10)
é|10-0| + |10-0| = 20
. No entanto, se você girar suas coordenadas em 45 graus (agora o seu ponto fixo fica ao longo de uma das direções da grade), agora você encontrará o mesmo ponto agora(10sqrt(2),0)
, então há uma distância de Manhattan até a origem de10sqrt(2)~14.14
.fonte