Algoritmo para resolver o problema de restrição planar ("Pokemon Go monster discovery")

8

[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 N pontos (os "pontos desconhecidos") em um avião, chame-os n1,,nN, com coordenadas desconhecidas. Além disso, temosM medições realizadas em locais conhecidos m1,,mM.

Deixei dist(mi,nj) ser a distância euclidiana (geralmente desconhecida) do ponto de medição mi para o ponto desconhecido nj.

Para cada medição mi, temos as seguintes informações:

  1. As coordenadas exatas de cada ponto desconhecido nj para qual dist(mi,nj)<dmin por alguma constante conhecida dmin; e
  2. Uma lista de todos os índices j para qual dist(mi,nj)<dmax por alguma constante conhecida dmax>dmin, classificado por dist(mEu,nj).

Existe um algoritmo eficiente para calcular as áreas do plano onde os pontos desconhecidos ou um dado ponto desconhecido nj, pode ser? O algoritmo recebe as coordenadas(XEu,YEu) dos pontos de medição, as informações de medição listadas acima e o número Nde pontos desconhecidos; o objetivo é restringir a região de possíveis locais para cada um dos pontos desconhecidosn1,,nN 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" (dmEun) da posição do jogador. Além disso, possui um "localizador de Pokemon" que mostra uma lista de locais próximos (dEust<dmumax) 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.)

Sami Liedes
fonte
3
"classificado por dist(m,n)"- isso é realmente desagradável! Sem essas informações adicionais, você apenas precisaria fazer a interseção de alguns anéis e terminar com isso, mas a classificação fornece informações adicionais que dificultam o processo.
Tom van der Zanden
Não está claro para mim se N é conhecido, nem que informação é dada para cada m. As informações são fornecidas para(X1,Y1) algo como "o item 3 está em (X1+1,Y10.2); os outros itens próximas são o item 1, inciso 7º, inciso 4 nessa ordem "?
Peter Taylor
@ PeterTaylor, sim, está certo. Veja minha edição. Está claro agora?
DW

Respostas:

3

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.

  1. Ponha tudo m como pontos 2D em um índice espacial
  2. Para cada m1 no índice, execute uma consulta de intervalo espacial com distância 2dmax. Isso dá a você todos os outrosmx que potencialmente podem conter o mesmo n Como m1. Isso deve ser gerenciável porque o número demx deve ser pequeno (como assumi acima).
  3. Agora, obtendo todas as outras medidas estimadas para um determinado n, você pode tentar aproximar o correto n
  4. (Otimização potencial): dependendo do seu índice espacial, você pode remover o m1 depois de processar tudo o que é n. Isso reduz o conjunto de dados para as seguintes consultas de intervalo. Além disso,

De alguma forma, você também precisaria identificar exclusivamente cada n, 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.

TilmannZ
fonte
1
Não vejo como isso resolve o problema. Permite encontrar todos os pares(mi,nj) para qual ponto desconhecido nj está na faixa do ponto de medição mi, mas isso não parece ser a parte mais difícil. A parte difícil é usar essas informações para identificar o conjunto de possíveis locais para cadanj. Como é a forma dessa região? Você pode gerar a região exata? Como você está levando em conta as informações do pedido, conforme destacado por Tom van der Zanden ?
DW
Uh, explosão do passado :-). A "junção espacial" é algo que poucas pessoas ouviram falar, então pensei que fosse o cerne da questão. Simplesmente considerei a resposta para 'qual região' seria 'em torno deste ponto'. Aparentemente, eu não entendi isso.
TilmannZ 13/04/19
Até onde eu sei, as regiões resultantes serão altamente irregulares, mas fáceis de visualizar desenhando um anel (entre dmin e dmax em torno de cada m(para não dizer com um verde fraco. Se um anel se sobrepõe a outro anel, o verde é intensificado. Depois de desenhar todos os anéis, remova todas as áreas com intensidade não máxima de verde. Você também pode fazer isso completamente na memória, 'desenhando' o . anéis em uma multa grained grid / matriz e simplesmente aumentar um contador em cada célula da grelha é isso que você está perguntando?
TilmannZ
1

Se alguma posição do objeto nj é 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 dmindist(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 dmindist(mi,p)<dij) and a "far" piece (containing all points p such that dijdist(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, setting nj=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.

j_random_hacker
fonte