[Nota: este problema fue inspirado por Pokemon Go. Primero explicaré el problema en términos matemáticos, luego explicaré la conexión con Pokemon Go. Mi objetivo no es hacer trampa en el juego. Si quisiera hacer trampa, mejor información estaría disponible más fácilmente.]
Supongamos que hay puntos (los "puntos desconocidos") en un plano, , con coordenadas desconocidas. Además, tenemos mediciones tomadas en ubicaciones conocidas .
Sea la distancia euclidiana (generalmente desconocida) desde el punto de medición al punto desconocido .
Para cada medida , tenemos la siguiente información:
- Las coordenadas exactas de cada punto desconocido para el cual para alguna constante conocida ; y
- Una lista de todos los índices para los cuales para alguna constante conocida , ordenada por .
¿Existe un algoritmo eficiente para calcular las áreas del plano donde pueden estar los puntos desconocidos, o un punto desconocido dado ? El algoritmo recibe las coordenadas de los puntos de medición, la información de medición enumerada anteriormente y el número de puntos desconocidos; el objetivo es reducir la región de posibles ubicaciones para cada uno de los puntos desconocidos tanto como sea posible.
La conexión de Pokémon:
En Pokemon Go, un juego de realidad aumentada, el objetivo es encontrar Pokémon en la naturaleza. De vez en cuando, el juego muestra los Pokémon en un "rango visible" ( ) de la posición del jugador. Además, tiene un "buscador de Pokémon" que muestra una lista de Pokémon cercanos ( ), ordenados por distancia. (También se supone que muestra una distancia aproximada como uno, dos o tres pasos, pero aparentemente hay un error y siempre muestra tres pasos).
Respuestas:
Creo que podría usar una "unión espacial". No he jugado el juego, pero supongo que es bastante pequeño, es decir, hay en el orden de 10 más o menos y en la vecindad de cada . Además, supongo que y son grandes, digamos 1,000,000 o más.dmax n m m N M
De alguna manera, también necesitaría identificar de forma exclusiva cada , de modo que no calcule la posición de nuevamente si aparece al procesar otro .n n m
Como optimización, es posible que desee utilizar consultas de ventana (rectangulares) en lugar de consultas de rango circular. Las consultas de ventana pueden ser mucho más rápidas y dar solo un poco más de resultados. Además, podría ser que el juego en realidad no use la distancia euclidiana (círculos) sino la distancia más rápida del hombre, que sería exactamente un rectángulo.
Para dicha unión espacial, puede usar cualquier índice espacial, como R-Tree, kd-Tree, quadtree o cualquiera de sus variantes.
Para conjuntos de datos grandes, probablemente no usaría un R-Tree (R + tree, R * -tree, X-Tree), o una variante especial del quadtree, el PH-Tree, que es muy adecuado para consultas de rango, así como permitiendo la eliminación rápida (o adición) de puntos.
Para Java, las implementaciones de R-Trees se pueden encontrar en cualquier parte de Internet, por ejemplo, en el marco ELKI o en mi propia biblioteca TinSpin Index . El PH-Tree también está disponible en Java.
Un algoritmo genérico de unión espacial se llama TOUCH , pero no creo que sea de código abierto.
fuente
Si alguna posición del objeto se conoce exactamente (por ejemplo, porque está dentro de de alguna medición), entonces cada vez que este aparezca en el anillo para alguna medición (que significa ), podemos reducir las regiones posibles para otras posiciones desconocidas en ese mismo anillo. Específicamente, podemos simplemente calcular ya que conocemos ambas posiciones ( y ) exactamente, y luego podemos dividir el anillo para en dos subanulos: una pieza "cercana" ( que contiene todos los puntos tales quenj dmin nj mi dmin≤dist(mi,nj)<dmax dij=dist(mi,nj) mi nj mi p dmin≤dist(mi,p)<dij ) y una pieza "lejana" (que contiene todos los puntos modo que ). Todos los objetos enumerados antes de para la medición están necesariamente confinados al anillo cercano, y todos los objetos listados después de están confinados al anillo lejano.p dij≤dist(mi,p)<dmax nj mi nj
¿Qué se puede hacer (más allá de la intersección de los anillos ya sugeridos por Tom van der Zanden en un comentario) para las posiciones de objeto que no están relacionadas con alguna posición de objeto ya conocida de esta manera? Esto parece muy difícil. La declaración
" no puede aparecer en "nj p
es equivalente a
"Para todas las ubicaciones posibles de todos los puntos desconocidos restantes, establecer , junto con las desigualdades de distancia implicadas por el orden en que se enumeran los objetos que pertenecen al anillo de cada medición, conduce a una contradicción".nj=p
Me parece que para llegar a cualquier parte, necesitamos tener (al menos) 2 posiciones de objetos desconocidos que aparecen en el anillo de (al menos) las mismas 2 mediciones. Pero aunque esta información descartará muchos pares de posiciones para los dos objetos, no pude encontrar ninguna circunstancia en la que se pudiera descartar una posición solo para uno de ellos, independientemente de la posición del otro objeto.
fuente