[Nota: Este problema foi inspirado no Pokemon Go. Vou primeiro explicar o problema em termos matemáticos, depois explicar a conexão com o Pokemon Go. Meu objetivo não é trapacear no jogo. Se eu quisesse trapacear, melhores informações estariam disponíveis com mais facilidade.]
Suponha que haja pontos (os "pontos desconhecidos") em um avião, chame-os , com coordenadas desconhecidas. Além disso, temos medições realizadas em locais conhecidos .
Deixei ser a distância euclidiana (geralmente desconhecida) do ponto de medição para o ponto desconhecido .
Para cada medição , temos as seguintes informações:
- As coordenadas exatas de cada ponto desconhecido para qual por alguma constante conhecida ; e
- Uma lista de todos os índices para qual por alguma constante conhecida , classificado por .
Existe um algoritmo eficiente para calcular as áreas do plano onde os pontos desconhecidos ou um dado ponto desconhecido , pode ser? O algoritmo recebe as coordenadas dos pontos de medição, as informações de medição listadas acima e o número de pontos desconhecidos; o objetivo é restringir a região de possíveis locais para cada um dos pontos desconhecidos tanto quanto possível.
A conexão Pokemon:
Em Pokemon Go, um jogo de realidade aumentada, o objetivo é encontrar Pokemons na natureza. De vez em quando, o jogo mostra os Pokemons em um "intervalo visível" () da posição do jogador. Além disso, possui um "localizador de Pokemon" que mostra uma lista de locais próximos () Pokemons, classificados por distância. (Também deve mostrar uma distância aproximada como um, dois ou três passos, mas aparentemente há um erro e sempre mostra três passos.)
fonte
Respostas:
Eu acho que você poderia usar uma "junção espacial". Eu não joguei o jogo, mas presumodmax é bastante pequeno, ou seja, existem na ordem de 10 ou mais n e m no bairro de cada m . Suponho ainda queN e M são grandes, digamos 1.000.000 ou mais.
De alguma forma, você também precisaria identificar exclusivamente cadan , para que você não calcule a posição de n novamente se aparecer ao processar outro m .
Como otimização, convém usar consultas de janela (retangular) em vez de consultas de intervalo circular. As consultas de janela podem ser muito mais rápidas e fornecer apenas um pouco mais de resultados. Além disso, pode ser que o jogo não use distância euclidiana (círculos), mas a distância mais rápida do manhatten, que seria exatamente um retângulo.
Para essa junção espacial, você pode usar qualquer índice espacial, como R-Tree, kd-Tree, quadtree ou qualquer uma de suas variantes.
Para conjuntos de dados grandes, eu provavelmente não usaria uma árvore R (árvore R +, árvore R *, árvore X) ou uma variante especial da árvore quad, a árvore PH, que é adequada para consultas de intervalo e permitindo a rápida remoção (ou adição) de pontos.
Para Java, as implementações de R-Trees podem ser encontradas em qualquer lugar da Internet, por exemplo, na estrutura ELKI ou na minha própria biblioteca TinSpin Index . O PH-Tree também está disponível em Java.
Um algoritmo genérico de junção espacial é chamado TOUCH , mas não acho que seja de código aberto.
fonte
Se alguma posição do objetonj é conhecido exatamente (por exemplo, porque está dentro dmin de alguma medida), então sempre que isso nj aparece no anel para algumas medições mi (significado dmin≤dist(mi,nj)<dmax ), podemos reduzir as regiões possíveis para outras posições desconhecidas no mesmo anular. Especificamente, podemos simplesmente calculardij=dist(mi,nj) já que conhecemos as duas posições (mi e nj ) exatamente e, em seguida, podemos dividir o espaço anular para mi em dois sub-anéis: uma peça "próxima" (contendo todos os pontos p de tal modo que dmin≤dist(mi,p)<dij ) and a "far" piece (containing all points p such that dij≤dist(mi,p)<dmax ). Every object listed before nj for measurement mi is necessarily confined to the near annulus, and every object listed after nj is confined to the far annulus.
What can be done (beyond the intersection of annuli already suggested by Tom van der Zanden in a comment) for object positions that aren't related to some already-known object position in this way? This seems very hard. The statement
"nj cannot appear at p "
is equivalent to
"For all possible placements of all remaining unknown points, settingnj=p , juntamente com as desigualdades de distância implícitas na ordem em que os objetos pertencentes ao anel de cada medição são listados, leva a uma contradição ".
Parece-me que, para chegar a algum lugar, precisamos ter (pelo menos) duas posições de objetos desconhecidos que aparecem no espaço anular das (pelo menos) as mesmas duas medições. Mas, embora essas informações descartem muitos pares de posições para os dois objetos, não consegui encontrar nenhuma circunstância em que uma posição pudesse ser descartada para apenas um deles, independentemente da posição do outro objeto.
fonte