Pernahkah Anda berpikir untuk menggunakan rantai Markov ? Ini secara efektif merupakan "otomat seluler seluler probabilistik," sehingga memasok keacakan yang diinginkan. Alih-alih meresepkan generasi baru dalam hal tetangga lokal dari generasi yang ada, itu menentukan distribusi probabilitas untuk generasi baru. Distribusi itu dapat diperkirakan dari, katakanlah, urutan waktu gambar dari area yang sama atau serupa.
Secara intuitif, model ini mengatakan bahwa sel tidak harus membuat transisi dari berhutan ke tidak berhutan (atau sebaliknya ), tetapi kemungkinan bahwa hal itu akan membuat transisi tergantung pada tutupan lahan segera di sekitarnya. Ia dapat menangani beberapa kelas tutupan, konfigurasi kompleks lingkungan, dan bahkan digeneralisasikan untuk "mengingat" sejarah evolusi tutupan lahan baru-baru ini.
Transisi dapat diimplementasikan menggunakan pernyataan Peta Aljabar, yang membuat metode ini praktis dalam GIS berbasis raster, bahkan yang tanpa akses langsung atau cepat ke data tingkat sel. Menggunakan R membuatnya lebih mudah.
Sebagai contoh, pertimbangkan konfigurasi awal ini hanya dengan dua kelas, putih dan hitam:
Untuk menggambarkan apa yang bisa terjadi, saya membuat model parameter (tidak didasarkan pada data apa pun) di mana transisi ke hitam terjadi dengan probabilitas 1 - q ^ k di mana k adalah jumlah rata-rata sel hitam dalam lingkungan 3 oleh 3 (k = 0, 1/9, 2/9, ..., 1). Ketika q kecil atau sebagian besar lingkungan sudah hitam, sel baru akan hitam. Berikut adalah empat simulasi independen dari generasi kesepuluh untuk lima nilai q mulai dari 0,25 hingga 0,05:
Jelas model ini memiliki banyak karakteristik CA tetapi juga mencakup efek acak yang berguna untuk mengeksplorasi hasil alternatif.
Kode
Berikut ini mengimplementasikan simulasi di R
.
#
# Make a transition from state `x` using a kernel having `k.ft` as
# its Fourier transform.
#
transition <- function(x, k.ft, q=0.1) {
k <- zapsmall(Re(fft(k.ft * fft(x), inverse=TRUE))) / length(x)
matrix(runif(length(k)) > q^k, nrow=nrow(k))
}
#
# Create the zeroth generation and the fft of a transition kernel.
#
n.row <- 2^7 # FFT is best with powers of 2
n.col <- 2^7
kernel <- matrix(0, nrow=n.row, ncol=n.col)
kernel[1:3, 1:3] <- 1/9
kernel.f <- fft(kernel)
set.seed(17)
x <- matrix(sample(c(0,1), n.row*n.col, replace=TRUE, prob=c(599, 1)), n.row)
#
# Prepare to run multiple simulations.
#
y.list <- list()
parameters <- c(.25, .2, .15, .1, .05)
#
# Perform and benchmark the simulations.
#
i <- 0
system.time({
for (q in parameters) {
y <- x
for (generation in 1:10) {
y <- transition(y, kernel.f, q)
}
y.list[[i <- i+1]] <- y
}
})
#
# Display the results.
#
par(mfrow=c(1,length(parameters)))
invisible(sapply(1:length(parameters),
function(i) image(y.list[[i]],
col=c("White", "Black"),
main=parameters[i])))
raster
paketnya? Itu punya banyak alat untuk bekerja dengan data raster (noo, rly?).