[Catatan: Masalah ini terinspirasi oleh Pokemon Go. Pertama saya akan menjelaskan masalah dalam hal matematika, kemudian menjelaskan koneksi ke Pokemon Go. Tujuan saya bukan untuk curang dalam permainan. Jika saya ingin menipu, informasi yang lebih baik akan tersedia dengan lebih mudah.]
Misalkan ada poin ("poin tidak diketahui") di pesawat, sebut saja , dengan koordinat yang tidak diketahui. Selain itu, kami memiliki pengukuran diambil di lokasi yang diketahui .
Biarkan menjadi jarak Euclidean (umumnya tidak diketahui) dari titik pengukuran ke titik yang tidak diketahui .
Untuk setiap pengukuran , kami memiliki informasi berikut:
- Koordinat tepat dari setiap titik yang tidak diketahui yang untuk beberapa konstanta yang diketahui ; dan
- Daftar semua indeks yang untuk beberapa konstanta yang dikenal d_ \ text {max}> d_ \ text {min} , disortir berdasarkan \ text {dist} (m_i, n_j) .
Apakah ada algoritma yang efisien untuk menghitung area pesawat di mana titik yang tidak diketahui, atau titik yang tidak diketahui , bisa? Algoritma ini diberikan koordinat dari titik pengukuran, informasi pengukuran yang tercantum di atas, dan jumlah dari titik yang tidak diketahui; tujuannya adalah untuk mempersempit wilayah lokasi yang memungkinkan untuk setiap poin yang tidak diketahui sebanyak mungkin.
Koneksi Pokemon:
Di Pokemon Go, sebuah game augmented reality, tujuannya adalah untuk menemukan Pokemons di alam. Sesekali, permainan menunjukkan Pokemons dalam "rentang yang terlihat" ( ) dari posisi pemain. Selain itu, ia memiliki "Pokemon finder" yang menunjukkan daftar Pokemons terdekat ( ), diurutkan berdasarkan jarak. (Ini juga seharusnya menunjukkan jarak perkiraan sebagai satu, dua atau tiga langkah kaki, tetapi tampaknya ada bug dan selalu menunjukkan tiga langkah kaki.)
Jawaban:
Saya pikir Anda bisa menggunakan "join spasial". Saya belum memainkan permainan, tetapi saya menganggap agak kecil, yaitu ada di urutan 10 atau lebih dan di lingkungan masing-masing . Saya selanjutnya berasumsi bahwa dan besar, katakanlah 1.000.000 atau lebih.dmax n m m N M
Entah bagaimana Anda juga perlu mengidentifikasi secara unik masing-masing , sehingga Anda tidak menghitung posisi lagi jika muncul ketika memproses lain .n n m
Sebagai pengoptimalan, Anda mungkin ingin menggunakan kueri jendela (persegi panjang) daripada kueri rentang melingkar. Kueri jendela dapat menjadi lebih cepat dan hanya memberikan sedikit hasil lebih banyak. Juga, bisa jadi game itu sebenarnya tidak menggunakan jarak euclidean (lingkaran) tetapi jarak manhatten yang lebih cepat, yang akan persis persegi panjang.
Untuk gabungan spasial seperti itu, Anda dapat menggunakan indeks spasial apa pun, seperti R-Tree, kd-Tree, quadtree, atau salah satu variannya.
Untuk dataset besar saya mungkin tidak akan menggunakan R-Tree (R + tree, R * -tree, X-Tree), atau varian khusus dari quadtree, PH-Tree, yang sangat cocok untuk rentang kueri serta memungkinkan penghapusan cepat (atau penambahan) poin.
Untuk Java, implementasi R-Trees dapat ditemukan di mana saja di internet, misalnya dalam kerangka ELKI atau perpustakaan Indeks TinSpin saya sendiri . The PH-Tree juga tersedia di Jawa.
Algoritma gabungan spasial generik disebut SENTUH , tapi saya rasa itu bukan open source.
sumber
Jika beberapa posisi objek diketahui persis (misalnya, karena berada dalam dari beberapa pengukuran), maka setiap kali ini muncul dalam annulus untuk beberapa pengukuran (artinya ), kita dapat mengecilkan daerah yang mungkin untuk posisi tidak dikenal lainnya dalam annulus yang sama. Secara khusus, kita dapat menghitung karena kita mengetahui kedua posisi ( dan ) dengan tepat, dan kita kemudian dapat membagi annulus untuk menjadi dua sub-annuli: dua bagian "dekat" (bagian "dekat" ( mengandung semua poin sedemikian rupa sehingganj dm i n nj msaya dm i n≤ di s t (msaya,nj) <dm a x dsaya j= di s t (msaya,nj) msaya nj msaya hal dm i n≤ di s t (msaya, p ) <dsaya j ) dan bagian "jauh" (berisi semua titik sehingga ). Setiap objek yang terdaftar sebelum untuk pengukuran harus terbatas pada annulus dekat, dan setiap objek yang terdaftar setelah terbatas pada annulus jauh.hal dsaya j≤ di s t (msaya, p ) <dm a x nj msaya nj
Apa yang bisa dilakukan (di luar persimpangan annuli yang sudah disarankan oleh Tom van der Zanden dalam komentar) untuk posisi objek yang tidak terkait dengan beberapa posisi objek yang sudah diketahui dengan cara ini? Ini sepertinya sangat sulit. Pernyataan
" tidak dapat muncul di "nj hal
setara dengan
"Untuk semua penempatan yang mungkin dari semua titik yang tidak diketahui yang tersisa, pengaturan , bersama dengan ketidaksetaraan jarak yang tersirat oleh urutan di mana objek milik anulus dari setiap pengukuran terdaftar, mengarah ke kontradiksi".nj= p
Tampak bagi saya bahwa untuk mendapatkan di mana saja, kita perlu memiliki (setidaknya) 2 posisi objek yang tidak diketahui yang muncul dalam annulus (setidaknya) 2 pengukuran yang sama. Tetapi sementara informasi ini akan mengesampingkan banyak pasangan posisi untuk dua objek, saya tidak dapat menemukan keadaan di mana posisi dapat dikesampingkan hanya untuk salah satu dari mereka, terlepas dari posisi objek lain.
sumber