Algoritmo: Encontrando o caminho mais curto através de uma masmorra em um jogo

8

fundo

Eu estava jogando o jogo para PC "Darkest Dungeon" recentemente. No jogo, você precisa explorar as masmorras, que consistem em salas conectadas, como mostrado na figura abaixo. Darkest_Dungeon_Minimap

Aqui estão as regras:

  • Você começa em sala fixa (entrada). Você não pode escolher por onde começar.
  • O objetivo é visitar todos os quartos pelo menos uma vez
  • A distância entre os quartos adjacentes é a mesma para todos os quartos.
  • Você pode visitar quartos e percorrer caminhos sempre que desejar

Questão

Qual é o caminho mais curto desde a entrada que visita todos os quartos pelo menos uma vez?

Subquestões:

  • Que algoritmo (s) poderia ser usado para resolver este problema?
  • Existem implementações gratuitas (e bastante simples) para serem usadas por alguém como eu?

O que eu tentei

Encontrei outras perguntas como esta ou esta sem encontrar uma resposta. Estou familiarizado com o TSP (básico) e sou capaz de codificar e resolver TSPs simples. Os caminhos hamiltonianos não resolveram meu problema, porque não permitem várias visitas. O problema do carteiro chinês também não se aplica aqui em sua forma básica, porque não preciso visitar todos os cantos.

Atualizar

Como afirmei nos comentários, não sou cientista da computação e não estou interessado em provar declarações matemáticas (talvez eu deva postar esta pergunta no stackoverflow posteriormente). Além disso, não sou programador e as chances de codificar uma solução são muito pequenas. Mas suspeito que não sou o primeiro a lidar com um problema dessa natureza.

De acordo com @Shreesh e @Dib, o seguinte procedimento pode ser aplicado:

  1. Crie uma matriz de distância aos pares com todas as salas, adicionando arestas entre todas as salas.
  2. Resolva o TSP usando um solucionador padrão (por exemplo, concorde)
  3. A partir da entrada, visite todos os quartos de acordo com a solução. Para salas não adjacentes, substitua a menor distância entre essas salas.

Este procedimento fornecerá a resposta para o problema?

COOLSerdash
fonte
6
Seu problema parece ser um caso especial de TSP. Em muitos casos especiais, você pode fazer melhor que o caso geral. Você já olhou nessa direção?
Yuval Filmus
@YuvalFilmus Obrigado pelo seu comentário. Tentei pesquisar esta questão no Google, mas não consegui encontrar uma solução direta. Como não sou cientista da computação, os trabalhos acadêmicos estão além do meu nível de entendimento. Eu esperava que essa variante do TSP fosse bem conhecida e que talvez já existisse uma solução. Provavelmente, pedirei a um moderador que migre essa pergunta para o stackoverflow posteriormente. Obrigado novamente por sua ajuda.
COOLSerdash
Obrigado por todos os comentários, COOLSerdash. Acho que seria útil editar sua pergunta para incluir todas as informações que você forneceu nos comentários, de forma resumida.
DW
11
Pode haver facilmente mais de um "caminho mais curto de ... pelo menos uma vez", mas 1.2.3. fornecerá um "caminho mais curto de ... pelo menos uma vez".

Respostas:

3

O problema do vendedor ambulante, mesmo que você permita a repetição de nós é difícil para o NP. Veja Complexidade Computacional do TSP .

Umans e Lenhart mostram resultados de dureza para Hamiltonian Graphs em Solid Grid Graphs, 1997 .

TSP para Euclideal Case (ou gráficos com desigualdade de triângulo) também implica dureza NP de TSP com repetição de nó. TSP mesmo para distância de manhattanL1 (ou L) métrica é NP-completa. Veja o artigo original de Papadimitriou sobre o assunto .

Você pode provar a dureza NP do TSP para o seu caso adicionando arcos aos nós com distância correspondente como o comprimento do caminho mais curto entre os nós, que simulará repetições dos nós. O TSP para seu caso especial parece um problema completo de NP.

Portanto, escreva um ramo exponencial e algoritmo vinculado suficientemente bom (em termos heurísticos) para calcular um tour mais curto (que pode não ser tão ineficiente, se o gráfico for pequeno) ou esqueça a otimização e calcule uma aproximação suficientemente boa.

Shreesh
fonte
Obrigado pela sua resposta, Shreesh. Infelizmente, eu não sou um cientista da computação e não estou interessado em provar declarações matemáticas (talvez eu deva postar esta pergunta no stackoverflow posteriormente). Além disso, não sou programador e as chances de codificar uma solução são muito pequenas. Mas suspeito que não sou o primeiro a lidar com um problema dessa natureza. Obrigado novamente.
COOLSerdash
Uma maneira fácil de fazer isso é adicionar nC2bordas correspondentes aos caminhos mais curtos e, em seguida, resolva o TSP com qualquer algoritmo existente. Como você já conhece o Concorde, seria fácil.
Shreesh
11
Temos um gráfico de grade com pesos unitários aqui. Suspeita-se que o problema seja muito mais fácil do que o TSP euclidiano. (cc @COOLSerdash)
Raphael
Não, se a grade for escassa, basicamente temos TSP com vértices em pontos racionais e eu1 1métrica. No entanto, se a sua grade é densa, ou seja, basicamente você tem que visitar quase todos os pontos da grade, não, você visita todos os pontos da grade, então há uma muito boa ~n2caminho. Veja aqui e aqui .
Shreesh 24/02
2

Você pode tratar isso como um problema de planejamento de cobertura de caminho modificado que pode ser resolvido em algumas etapas simples:

1) Construa um gráfico não direcionado não ponderado a partir das salas de grade, as junções de caminho são nós e limita os caminhos entre esses nós.

2) Encontre a árvore de abrangência mínima a partir do seu ponto de partida usando a primeira pesquisa de profundidade.

3) "Subdivide" a grade subjacente para que sua árvore de abrangência mínima crie duas "faixas".

4) No seu ponto de partida, caminhe no sentido horário na faixa da direita, de nó em nó, até retornar ao ponto de partida na faixa complementar.

Isso fornecerá um tour mínimo pelas salas, em tempo proporcional ao número de peças na masmorra, e é essencialmente o algoritmo de planejamento de caminho da Cobertura em Árvore de Abrangência em Espiral aplicado a uma configuração reduzida. (Cf. "Spiral-stc: um algoritmo de cobertura on-line de ambientes de grade por um robô móvel")

GEL
fonte
Você pode explicar o que significa subdividir a grade? E se meu gráfico não estiver em uma grade? ie imgur.com/a/KlnPO
jdelman
1

Além da resposta acima, eu indicaria alguns solucionadores de TSP já disponíveis.

  1. Concorde TSP Solver
  2. Solucionador de TSP fornecido pela Stony Brooks University
  3. Solucionador de TSP usando a API do Google Direction
  4. E muito mais .
Dib
fonte
Obrigado pela sua resposta. Mas, como afirmei, já sei como resolver o TSP usando o concorde. Como meu problema não é diretamente adequado ao TSP original, atualmente não sei como isso vai me ajudar.
COOLSerdash
O caminho mais curto seria o caminho que visita todos os cômodos exatamente uma vez. Agora, adicionando nós extras, você pode reduzir seu problema a um problema TSP cuja resposta daria resposta direta à sua pergunta.
Dib