Seperti judul saya katakan, saya ingin "menumbuhkan" gumpalan sel dari biji dalam raster. Basis raster saya penuh dengan 1 dan 0, 1 menunjukkan tanah dan 0 laut / daerah NA. Dari angka 1, saya ingin memilih 60 piksel / sel acak sebagai benih saya, dan kemudian secara acak menumbuhkan rumpun terhubung dari no yang telah ditentukan sebelumnya. batas piksel / sel dari benih itu. Saya pernah mendengar teknik ini dapat disebut sebagai 'menyebar pewarna' tetapi belum beruntung menemukan banyak di atasnya. Sel benih akan berubah menjadi nilai 2 dan kemudian sel berikutnya yang dipilih dari sekitar 1 akan dikonversi menjadi 2 juga. 2's tidak tersedia untuk dikonversi di masa depan.
Utas ini memang sedikit membantu, karena saya juga bersedia melakukan ini di R karena saya terbiasa membaca dan memanipulasi data GIS di R. Namun, yang saya butuhkan adalah seperangkat aturan untuk secara acak memilih piksel di sekitar rumpun yang ada .
Jika ada yang telah melakukan bentuk automata seluler yang lebih mendasar ini dalam pengaturan GIS, maka saya sangat menghargai saran / bimbingan.
Contoh:
Saya memiliki target 250 sel. Saya secara acak memilih satu sel yang memiliki nilai 1. Ini berubah menjadi nilai 2. Kemudian, salah satu tetangga dari sel benih yang = 1 berubah menjadi 2. Kemudian, salah satu tetangga dari salah satu sel dengan nilai 2 dipilih dan diubah menjadi 2. Ini akan berlanjut sampai bentuk kontinu penomoran 250 sel tercapai.
Sunting: Pertanyaan Lebih Lanjut
Berdasarkan jawaban hebat whuber, saya punya beberapa pertanyaan tentang kode:
- Bagaimana cara saya mengalokasikan nilai sel yang ditumbuhkan ke hanya '2' daripada nilai variabel yang mewakili urutan pembuatannya?
- Saya perlu membuat 60 rumpun sel di dalam area '1's. Saya telah menemukan cara untuk memilih posisi awal yang acak tetapi berjuang untuk membuatnya semuanya bekerja dalam satu lingkaran menggunakan
expand
fungsi yang Anda tulis dengan baik. Bisakah Anda menyarankan cara untuk membuat 60 rumpun yang tidak saling berbenturan dan terkandung dalam matriks akhir yang sama?
Sunting: Penjelasan Masalah Lebih Lanjut
Setiap rumpun sel akan mewakili area terlindungi dengan ukuran yang ditentukan misalnya 250 sel. Setiap area harus mulai & tumbuh menjadi sel dengan nilai 1 karena ini mewakili daratan dan menghindari sel dengan nilai 0, karena ini mewakili laut. Saya perlu mengulang ini 1000 kali dengan 60 area yang dilindungi di setiap iterasi untuk membuat model nol, menunjukkan distribusi apa dari area-area ini secara kebetulan. Untuk alasan ini, jumlah total sel di seluruh 60 area harus identik di masing-masing dari 1000 iterasi sehingga mereka dapat dibandingkan. Oleh karena itu, tidak masalah jika area bersentuhan, tetapi jika ada tabrakan, maka idealnya rumpun akan tumbuh ke arah lain yang tersedia sampai target 250 tercapai.
Setelah masing-masing dari 1000 jaringan kawasan lindung ini dibuat, mereka akan digunakan sebagai topeng terhadap data raster lain seperti langkah-langkah keanekaragaman hayati untuk melihat (a) apakah mereka memotong rentang spesies tertentu dan (b) berapa% dari spesies tertentu yang rentang jaringan acak ini tutupan kawasan lindung.
Terima kasih kepada @whuber atas bantuan Anda sejauh ini, saya tidak berharap Anda menghabiskan lebih banyak waktu untuk membantu saya, tetapi saya pikir saya akan mencoba dan menjelaskan situasi saya seperti yang Anda minta.
Jawaban:
Saya akan menawarkan
R
solusi yang dikodekan dengan sedikitR
cara untuk mengilustrasikan bagaimana hal itu dapat didekati di platform lain.Kekhawatiran dalam
R
(serta beberapa platform lain, terutama yang mendukung gaya pemrograman fungsional) adalah bahwa memperbarui array besar secara terus-menerus bisa sangat mahal. Alih-alih, algoritma ini mempertahankan struktur data pribadinya sendiri di mana (a) semua sel yang telah diisi sejauh ini terdaftar dan (b) semua sel yang tersedia untuk dipilih (sekitar perimeter sel yang diisi) terdaftar. Meskipun memanipulasi struktur data ini kurang efisien daripada langsung mengindeks ke dalam array, dengan menjaga data yang dimodifikasi ke ukuran kecil, itu akan memakan waktu komputasi yang jauh lebih sedikit. (Tidak ada upaya telah dilakukan untuk mengoptimalkannyaR
, baik. Pra-alokasi vektor negara harus menghemat waktu eksekusi, jika Anda lebih memilih untuk tetap bekerja di dalamR
.)Kode ini dikomentari dan harus langsung dibaca. Untuk membuat algoritma selengkap mungkin, itu tidak menggunakan add-on apa pun kecuali di akhir untuk plot hasilnya. Satu-satunya bagian yang sulit adalah untuk efisiensi dan kesederhanaan itu lebih suka untuk mengindeks ke dalam kisi 2D dengan menggunakan indeks 1D. Konversi terjadi pada
neighbors
fungsi, yang membutuhkan pengindeksan 2D untuk mengetahui seperti apa tetangga yang dapat diakses dari sebuah sel dan kemudian mengubahnya menjadi indeks 1D. Konversi ini standar, jadi saya tidak akan berkomentar lebih lanjut kecuali untuk menunjukkan bahwa di platform GIS lain Anda mungkin ingin membalikkan peran kolom dan indeks baris. (DalamR
, indeks baris berubah sebelum indeks kolom dilakukan.)Untuk mengilustrasikan, kode ini mengambil grid yang
x
mewakili tanah dan fitur seperti sungai dari titik-titik yang tidak dapat diakses, dimulai pada lokasi tertentu (5, 21) dalam grid itu (dekat tikungan sungai yang lebih rendah) dan meluaskannya secara acak untuk mencakup 250 poin . Total waktu adalah 0,03 detik. (Ketika ukuran array ditingkatkan dengan faktor 10.000 hingga 3.000 baris dengan 5.000 kolom, waktunya naik hanya menjadi 0,09 detik - faktor hanya 3 atau lebih - menunjukkan skalabilitas algoritma ini.) Alih-alih hanya mengeluarkan kisi-kisi 0's, 1's, dan 2's, ia mengeluarkan urutan dengan mana sel-sel baru dialokasikan. Pada gambar sel-sel awal berwarna hijau, lulus melalui emas menjadi warna salmon.Harus jelas bahwa lingkungan delapan poin dari setiap sel sedang digunakan. Untuk lingkungan lain, cukup modifikasi
nbrhood
nilai di dekat awalexpand
: ini adalah daftar offset indeks relatif terhadap sel yang diberikan. Misalnya, lingkungan "D4" dapat ditentukan sebagaimatrix(c(-1,0, 1,0, 0,-1, 0,1), nrow=2)
.Juga jelas bahwa metode penyebaran ini memiliki masalah: ia meninggalkan lubang. Jika bukan itu yang dimaksudkan, ada berbagai cara untuk memperbaiki masalah ini. Misalnya, simpan sel yang tersedia dalam antrian agar sel yang paling awal ditemukan juga yang paling awal terisi. Beberapa pengacakan masih bisa diterapkan, tetapi sel yang tersedia tidak akan lagi dipilih dengan probabilitas yang seragam (sama). Cara lain yang lebih rumit adalah memilih sel yang tersedia dengan probabilitas yang bergantung pada berapa banyak tetangga yang diisi. Setelah sel dikepung, Anda bisa membuat peluang seleksi yang sangat tinggi sehingga beberapa lubang tidak terisi.
Saya akan selesai dengan berkomentar bahwa ini bukan automaton seluler (CA), yang tidak akan memproses sel demi sel, tetapi akan memperbarui seluruh petak sel dalam setiap generasi. Perbedaannya halus: dengan CA, probabilitas pemilihan untuk sel tidak akan seragam.
Dengan sedikit modifikasi, kami dapat mengulang
expand
untuk membuat beberapa kluster. Dianjurkan untuk membedakan cluster dengan pengidentifikasi, yang di sini akan menjalankan 2, 3, ..., dll.Pertama, ubah
expand
untuk mengembalikan (a)NA
pada baris pertama jika ada kesalahan dan (b) nilai dalamindices
bukan matriksy
. (Jangan buang waktu membuat matriks baruy
dengan setiap panggilan.) Dengan perubahan ini dibuat, perulangan mudah: pilih mulai acak, cobalah untuk memperluas di sekitarnya, mengumpulkan indeks clusterindices
jika berhasil, dan ulangi sampai selesai. Bagian penting dari loop adalah untuk membatasi jumlah iterasi jika banyak cluster yang berdekatan tidak dapat ditemukan: ini dilakukan dengancount.max
.Berikut adalah contoh di mana 60 pusat cluster dipilih secara seragam secara acak.
Inilah hasilnya ketika diterapkan pada kisi 310 x 500 (dibuat cukup kecil dan kasar untuk kluster agar terlihat jelas). Diperlukan dua detik untuk mengeksekusi; pada 3100 x 5000 grid (100 kali lebih besar) dibutuhkan lebih lama (24 detik) tetapi waktunya scaling cukup baik. (Pada platform lain, seperti C ++, waktunya hampir tidak tergantung pada ukuran grid.)
sumber
y[indices] <- 1:length(indices)
dengany[indices] <- 2
. Jawaban untuk # 2 hampir sesederhana: hanya loop.size.clusters
. Bagaimana saya bisa memastikan rumpun tumbuh ke ukuran yang benar, karena, saat ini, saya menganggap rumpun itu mencoba tumbuh menjadi rumpun yang ada, gagal, tetapi masih mendaftar sebagai ekspansi yang berhasil. Saya kemudian juga bermaksud untuk mengulangi produksi 60 rumpun 1000 kali menciptakan dataset model style nol rata-rata. Apakah posisi acak bervariasi setiap kali dalam satufor
lingkaran?Tanpa pernah melakukan operasi Anda, dan tidak ada waktu luang untuk bermain, saya hanya dapat menambahkan dua tautan ini ke daftar Anda:
Temukan Nilai Sel Raster Terdekat Berdasarkan Titik Vektor (Jawaban pertama (dengan 4 suara) adalah yang membuat saya penasaran).
Juga: apakah Hawth's Gridspread akan membantu?
sumber