Algoritma untuk memecahkan masalah kendala planar ("Temuan monster Pokemon Go")

8

[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 .Nn1,...,nNM.m1,...,mM.

Biarkan menjadi jarak Euclidean (umumnya tidak diketahui) dari titik pengukuran ke titik yang tidak diketahui .dist(msaya,nj)msayanj

Untuk setiap pengukuran , kami memiliki informasi berikut:msaya

  1. Koordinat tepat dari setiap titik yang tidak diketahui yang untuk beberapa konstanta yang diketahui ; dannjdist(msaya,nj)<dmindmin
  2. Daftar semua indeks yang untuk beberapa konstanta yang dikenal d_ \ text {max}> d_ \ text {min} , disortir berdasarkan \ text {dist} (m_i, n_j) .jdist(msaya,nj)<dmaksdmaks>dmindist(msaya,nj)

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.nj(Xsaya,Ysaya)Nn1,...,nN

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.)dmsayandsayast<dmSebuahx

Sami Liedes
sumber
3
" berdasarkan " - itu benar-benar jahat! Tanpa informasi tambahan ini Anda hanya perlu mengambil persimpangan beberapa annuli dan menyelesaikannya, tetapi penyortiran memberi Anda informasi tambahan yang membuatnya sulit. dsayast(m,n)
Tom van der Zanden
Tidak jelas bagi saya apakah diketahui, atau informasi apa yang diberikan untuk setiap . Apakah informasi yang diberikan untuk kira-kira seperti "Item 3 ada di ; item terdekat lainnya adalah item 1, item 7, item 4 dalam urutan itu"? Nm(X1,Y1)(X1+1,Y1-0,2)
Peter Taylor
@ PeterTaylor, Ya, itu benar. Lihat hasil edit saya. Apakah sudah jelas sekarang?
DW

Jawaban:

3

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.dmaxnmmNM

  1. Masukkan semua sebagai titik 2D dalam indeks spasialm
  2. Untuk setiap dalam indeks, lakukan kueri rentang spasial dengan jarak . Ini memberi Anda semua lainnya yang berpotensi mengandung sama dengan . Ini harus dikelola karena jumlah harus kecil (seperti yang saya asumsikan di atas).m12dmaxmxnm1mx
  3. Sekarang, dengan mendapatkan semua perkiraan pengukuran lain untuk tertentu , Anda dapat mencoba memperkirakan benarnn
  4. (Potensi optimasi): Bergantung pada indeks spasial Anda, Anda dapat menghapus setelah memproses semua itu . Ini membuat dataset lebih kecil untuk kueri rentang berikut. Juga,m1n

Entah bagaimana Anda juga perlu mengidentifikasi secara unik masing-masing , sehingga Anda tidak menghitung posisi lagi jika muncul ketika memproses lain .nnm

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.

TilmannZ
sumber
1
Saya tidak melihat bagaimana ini menyelesaikan masalah. Ini memungkinkan Anda menemukan semua pasangan mana titik yang tidak diketahui berada dalam kisaran titik pengukuran , tetapi itu sepertinya bukan bagian yang sulit. Bagian yang sulit adalah menggunakan informasi itu untuk mengidentifikasi set lokasi yang mungkin untuk setiap . Seperti apa bentuk wilayah itu? Bisakah Anda menampilkan wilayah yang tepat? Bagaimana Anda memperhitungkan informasi dari pesanan, seperti yang disorot oleh Tom van der Zanden ? (mi,nj)njminj
DW
Eh, ledakan dari masa lalu :-). "Penggabungan spasial" adalah sesuatu yang sedikit orang pernah dengar, jadi saya pikir itu adalah inti dari pertanyaan. Saya hanya menganggap jawaban untuk 'wilayah mana' berada 'di sekitar titik ini'. Tampaknya saya salah paham akan hal ini.
TilmannZ
Sejauh yang saya tahu, daerah yang dihasilkan akan sangat tidak teratur, tetapi cukup mudah untuk divisualisasikan dengan menggambar cincin (antara dan sekitar setiap (jangan katakan dengan hijau redup. Jika cincin tumpang tindih) dengan cincin lain, hijau diintensifkan. Setelah menggambar semua cincin, hapus semua area dengan intensitas hijau non-maksimal. Anda juga dapat melakukan ini sepenuhnya dalam memori dengan 'menggambar' cincin pada grid / matriks berbutir halus dan hanya meningkatkan counter di setiap sel grid. Itukah yang Anda minta?dmsayandmSebuahxm
TilmannZ
1

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 sehingganjdmsayannjmsayadmsayandsayast(msaya,nj)<dmSebuahxdsayaj=dsayast(msaya,nj)msayanjmsayahaldmsayandsayast(msaya,hal)<dsayaj) 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.haldsayajdsayast(msaya,hal)<dmSebuahxnjmsayanj

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 "njhal

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=hal

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.

j_random_hacker
sumber