[Remarque: ce problème a été inspiré par Pokemon Go. Je vais d'abord expliquer le problème en termes mathématiques, puis expliquer la connexion à Pokemon Go. Mon objectif n'est pas de tricher dans le jeu. Si je voulais tricher, de meilleures informations seraient disponibles plus facilement.]
Supposons qu'il y ait points (les "points inconnus") dans un avion, appelez-les , avec des coordonnées inconnues. De plus, nous avons mesures prises à des endroits connus .
Laisser être la distance euclidienne (généralement inconnue) du point de mesure au point inconnu .
Pour chaque mesure , nous avons les informations suivantes:
- Les coordonnées exactes de chaque point inconnu Pour qui pour une constante connue ; et
- Une liste de tous les indices Pour qui pour une constante connue , trié par .
Existe-t-il un algorithme efficace pour calculer les zones de l'avion où les points inconnus, ou un point inconnu donné , peut être? L'algorithme reçoit les coordonnées des points de mesure, les informations de mesure répertoriées ci-dessus et le nombre de points inconnus; l'objectif est de réduire la région des emplacements possibles pour chacun des points inconnus autant que possible.
La connexion Pokemon:
Dans Pokemon Go, un jeu de réalité augmentée, le but est de trouver des Pokémons dans la nature. De temps en temps, le jeu montre les Pokémons dans une "plage visible" () de la position du joueur. De plus, il dispose d'un "Pokemon finder" qui affiche une liste des environs () Pokémons, triés par distance. (Il est également censé montrer une distance approximative comme un, deux ou trois pas, mais apparemment il y a un bug et il montre toujours trois pas.)
Réponses:
Je pense que vous pourriez utiliser une "jointure spatiale". Je n'ai pas joué au jeu, mais je supposedmax est assez petit, c'est-à-dire qu'il y en a environ 10 n et m au voisinage de chacun m . Je suppose en outre queN et M sont grandes, disons 1 000 000 ou plus.
D'une manière ou d'une autre, vous auriez également besoin d'identifiern , de sorte que vous ne calculez pas la position de n à nouveau s'il apparaît lors du traitement d'un autre m .
À titre d'optimisation, vous souhaiterez peut-être utiliser des requêtes de fenêtre (rectangulaires) plutôt que des requêtes de plage circulaire. Les requêtes de fenêtres peuvent être beaucoup plus rapides et donner seulement un peu plus de résultats. De plus, il se peut que le jeu n'utilise pas réellement la distance euclidienne (cercles) mais la distance manhatten plus rapide, qui serait exactement un rectangle.
Pour une telle jointure spatiale, vous pouvez utiliser n'importe quel index spatial, tel que R-Tree, kd-Tree, quadtree ou l'une de leurs variantes.
Pour les grands ensembles de données, je n'utiliserais probablement pas d'arbre R (arbre R +, arbre R *, arbre X) ou une variante spéciale de l'arbre quadruple, l'arbre PH, qui convient bien aux requêtes de plage ainsi qu'aux permettant le retrait (ou l'ajout) rapide de points.
Pour Java, les implémentations de R-Trees peuvent être trouvées n'importe où sur Internet, par exemple dans le cadre ELKI ou ma propre bibliothèque d'index TinSpin . Le PH-Tree est également disponible en Java.
Un algorithme générique de jointure spatiale est appelé TOUCH , mais je ne pense pas qu'il soit open source.
la source
Si une position d'objetnj est connue exactement (par exemple, parce dmin d'une certaine mesure), puis chaque fois que cela nj apparaît dans l'espace annulaire pour une mesure mi (sens dmin≤dist(mi,nj)<dmax ), nous pouvons réduire les régions possibles pour d'autres positions inconnues dans ce même anneau. Plus précisément, nous pouvons simplement calculerdij=dist(mi,nj) puisque nous connaissons les deux positions (mi et nj ) exactement, et nous pouvons ensuite diviser l'anneau pour mi en deux sous-anneaux: une pièce "proche" (contenant tous les points p tel que dmin≤dist(mi,p)<dij ) et une pièce "lointaine" (contenant tous les points p tel que dij≤dist(mi,p)<dmax ). Chaque objet répertorié avantnj pour la mesure mi est nécessairement confiné à l'anneau proche, et chaque objet répertorié après nj est confiné à l'anneau lointain.
Que peut-on faire (au-delà de l'intersection des anneaux déjà suggérée par Tom van der Zanden dans un commentaire) pour des positions d'objet qui ne sont pas liées à une position d'objet déjà connue de cette manière? Cela semble très difficile. La déclaration
"nj ne peut pas apparaître à p "
est équivalent à
"Pour tous les emplacements possibles de tous les points inconnus restants, la définitionnj=p , ainsi que les inégalités de distance impliquées par l'ordre dans lequel les objets appartenant à l'anneau de chaque mesure sont répertoriés, conduit à une contradiction ".
Il me semble que pour aller n'importe où, nous devons avoir (au moins) 2 positions d'objets inconnus qui apparaissent dans l'espace annulaire (au moins) des 2 mêmes mesures. Mais alors que ces informations excluront de nombreuses paires de positions pour les deux objets, je n'ai pu trouver aucune circonstance dans laquelle une position pourrait être exclue pour un seul d'entre eux, indépendamment de la position de l'autre objet.
la source