Algoritmo per la risoluzione del problema di vincolo planare ("Individuazione di mostri di Pokemon Go")


8

[Nota: questo problema è stato ispirato da Pokemon Go. Spiegherò prima il problema in termini matematici, quindi spiegherò la connessione a Pokemon Go. Il mio obiettivo non è imbrogliare nel gioco. Se volessi imbrogliare, sarebbero disponibili più facilmente informazioni migliori.]

Supponiamo che ci siano punti (i "punti sconosciuti") in un piano, chiamali , con coordinate sconosciute. Inoltre, abbiamo misurazioni prese in posizioni note .Nn1,,nNMm1,,mM

Sia la distanza euclidea (generalmente sconosciuta) dal punto di misurazione al punto sconosciuto .dist(mi,nj)minj

Per ogni misura , abbiamo le seguenti informazioni:mi

  1. Le coordinate esatte di ciascun punto sconosciuto per il quale per una costante nota ; enjdist(mi,nj)<dmindmin
  2. Un elenco di tutti gli indici per i quali per una costante nota , ordinati per .jdist(mi,nj)<dmaxdmax>dmindist(mi,nj)

Esiste un algoritmo efficiente per calcolare le aree del piano in cui possono essere i punti sconosciuti o un dato punto sconosciuto ? All'algoritmo vengono fornite le coordinate dei punti di misurazione, le informazioni di misurazione sopra elencate e il numero di punti sconosciuti; l'obiettivo è restringere il più possibile la regione delle posizioni possibili per ciascuno dei punti sconosciuti .nj(Xi,Yi)Nn1,,nN

La connessione Pokemon:

In Pokemon Go, un gioco di realtà aumentata, l'obiettivo è trovare Pokemon nella natura. Di tanto in tanto, il gioco mostra i Pokemon in un "intervallo visibile" ( ) della posizione del giocatore. Inoltre, ha un "Pokemon finder" che mostra un elenco di Pokemon vicini ( ), ordinati per distanza. (Dovrebbe anche mostrare una distanza approssimativa di uno, due o tre passi, ma a quanto pare c'è un bug e mostra sempre tre passi.)dmindist<dmax


3
"ordinati per " - è davvero brutto! Senza queste informazioni aggiuntive dovresti solo prendere l'intersezione di alcuni annuli e farla finita, ma l'ordinamento ti fornisce informazioni aggiuntive che lo rendono difficile. dist(m,n)
Tom van der Zanden,

Non mi è chiaro se N è noto, né quali informazioni sono fornite per ciascuno m. Le informazioni sono fornite per(X1,Y1) qualcosa come "L'articolo 3 è a (X1+1,Y1-0.2); gli altri oggetti vicini sono l'articolo 1, l'articolo 7, l'articolo 4 in quell'ordine "?
Peter Taylor,

@PeterTaylor, Sì, esatto. Vedi la mia modifica. È chiaro adesso?
DW

Risposte:


3

Penso che potresti usare un "join spaziale". Non ho giocato al gioco, ma presumodmun'X è piuttosto piccolo, cioè ce ne sono nell'ordine di 10 o giù di lì n e m nel quartiere di ciascuno m. Suppongo inoltre cheN e M sono grandi, diciamo 1.000.000 o più.

  1. Metti tutto m come punti 2D in un indice spaziale
  2. Per ciascuno m1 nell'indice, eseguire una query di intervallo spaziale con distanza 2*dmun'X. Questo ti dà tutto il restomX che può potenzialmente contenere lo stesso n come m1. Questo dovrebbe essere gestibile perché il numero dimX dovrebbe essere piccolo (come ho ipotizzato sopra).
  3. Ora, ottenendo tutte le altre misurazioni stimate per un particolare n, puoi provare ad approssimare il corretto n
  4. (Potenziale ottimizzazione): a seconda dell'indice spaziale, è possibile rimuovere il m1 dopo aver elaborato tutto n. Questo rende il set di dati più piccolo per le seguenti query di intervallo. Anche,

In qualche modo dovresti anche identificarli in modo univoco n, in modo da non calcolare la posizione di n di nuovo se si presenta durante l'elaborazione di un altro m.

Come ottimizzazione, potresti voler utilizzare query a finestra (rettangolari) anziché query a intervallo circolare. Le query alle finestre possono essere molto più veloci e dare solo leggermente più risultati. Inoltre, potrebbe darsi che il gioco in realtà non usi la distanza euclidea (cerchi) ma la distanza più veloce, che sarebbe esattamente un rettangolo.

Per tale unione spaziale puoi usare qualsiasi indice spaziale, come R-Tree, kd-Tree, quadtree o una qualsiasi delle loro varianti.

Per i set di dati di grandi dimensioni probabilmente non userei un R-Tree (R + tree, R * -tree, X-Tree) o una variante speciale del quadtree, il PH-Tree, che è adatto sia per le query di intervallo che per consentendo una rapida rimozione (o aggiunta) di punti.

Per Java, le implementazioni di R-Trees possono essere trovate ovunque su Internet, ad esempio nel framework ELKI o nella mia libreria di TinSpin Index . Il PH-Tree è disponibile anche in Java.

Un algoritmo di join spaziale generico si chiama TOUCH , ma non penso che sia open source.


1
Non vedo come questo risolva il problema. Ti permette di trovare tutte le coppie(mio,nj) per quale punto sconosciuto nj è nell'intervallo del punto di misurazione mio, ma questa non sembra la parte difficile. La parte difficile sta usando queste informazioni per identificare l'insieme delle posizioni possibili per ciascunanj. Che aspetto ha la forma di quella regione? Puoi produrre la regione esatta? Come stai prendendo in considerazione le informazioni dall'ordine, come evidenziato da Tom van der Zanden ?
DW

Uh, esplosione del passato :-). "Join spaziale" è qualcosa di cui poche persone hanno sentito parlare, quindi ho pensato che fosse il nocciolo della domanda. Ho semplicemente considerato la risposta per "quale regione" essere "attorno a questi punti". Apparentemente l'ho capito male.
TilmannZ,

Per quanto ne so, le regioni risultanti saranno altamente irregolari, ma abbastanza facili da visualizzare disegnando un anello (tra dmion e dmun'X intorno a ciascuno m(per non dire con un verde debole. Se un anello si sovrappone a un altro anello, il verde si intensifica. Dopo aver disegnato tutti gli anelli, rimuovi tutte le aree con un'intensità non massima del verde. Puoi anche farlo completamente in memoria "disegnando" il su una griglia / matrice a grana fine e semplicemente aumentando un contatore in ogni cella della griglia. È quello che stai chiedendo?
TilmannZ

1

Se qualche posizione dell'oggetto nj è noto esattamente (ad es. perché è dentro dmion di alcune misurazioni), quindi ogni volta che questo nj appare nell'annulus per alcune misurazioni mio (senso dmiondioSt(mio,nj)<dmun'X), possiamo ridurre le possibili regioni per altre posizioni sconosciute nello stesso annulus. In particolare, possiamo semplicemente calcolaredioj=dioSt(mio,nj) poiché conosciamo entrambe le posizioni (mio e nj) esattamente, e possiamo quindi dividere l'annulus per mio in due sub-annuli: un pezzo "vicino" (contenente tutti i punti p tale che dmiondioSt(mio,p)<dioj) e un pezzo "lontano" (contenente tutti i punti p tale che diojdioSt(mio,p)<dmun'X). Ogni oggetto elencato primanj per la misurazione mio è necessariamente confinato nell'annulus vicino e ogni oggetto elencato dopo nj è limitato al lontano annulus.

Cosa si può fare (oltre l'intersezione degli annuli già suggerita da Tom van der Zanden in un commento) per le posizioni degli oggetti che non sono correlate a posizioni di oggetti già conosciute in questo modo? Questo sembra molto difficile. La dichiarazione

"nj non può apparire a p"

è equivalente a

"Per tutti i possibili posizionamenti di tutti i restanti punti sconosciuti, impostazionenj=p, insieme alle disparità di distanza implicite nell'ordine in cui sono elencati gli oggetti appartenenti all'anello di ciascuna misura, porta a una contraddizione ".

Mi sembra che per arrivare ovunque, dobbiamo avere (almeno) 2 posizioni di oggetti sconosciuti che compaiono nell'annulus di (almeno) le stesse 2 misurazioni. Ma mentre queste informazioni escluderanno molte coppie di posizioni per i due oggetti, non sono stato in grado di trovare alcuna circostanza in cui una posizione potesse essere esclusa per uno solo di essi, indipendentemente dalla posizione dell'altro oggetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.