Bir Markov zinciri kullanmayı düşündünüz mü ? Bu, etkin bir şekilde "olasılıklı bir hücresel otomat" tır ve böylece arzu edilen rasgeleliği sağlar. Yeni nesli mevcut neslin yerel komşuları olarak reçete etmek yerine, yeni neslin bir olasılık dağılımını belirler. Bu dağılım, örneğin, aynı veya benzer alanların görüntülerinin zaman dizilerinden tahmin edilebilir.
Sezgisel olarak, bu model bir hücrenin ormanlıktan ormansızlığa (veya tam tersi ) geçiş yapması gerekmeyeceğini , ancak geçiş yapma şansının hemen çevresindeki arazi örtüsüne bağlı olduğunu söylüyor. Birden fazla örtü sınıfını, mahallelerin karmaşık konfigürasyonlarını ele alabilir ve hatta son zamanlarda arazi örtüsü evrim tarihini "hatırlamak" için genelleştirilebilir.
Geçişler, bu yöntemi hücre düzeyindeki verilere doğrudan veya hızlı erişimi olmayanlar bile raster tabanlı CBS'lerde uygulanabilir kılan Harita Cebiri ifadeleri kullanılarak uygulanabilir. R kullanmak daha da kolay.
Örneğin, beyaz ve siyah olmak üzere yalnızca iki sınıfla bu başlangıç yapılandırmasını düşünün:
Ne olabileceğini göstermek için, siyaha geçişin 1 - q ^ k olasılığı ile gerçekleştiği parametreli bir model oluşturdum (burada k, 3'e 3 mahalle içindeki ortalama siyah hücre sayısıdır (k = 0, 1/9, 2/9, ..., 1). Q ya küçük olduğunda ya da mahallenin çoğu zaten siyah olduğunda, yeni hücre siyah olacaktır. İşte onuncu kuşağın dört bağımsız simülasyonu, 0.25'ten 0.05'e kadar değişen beş q değeri için:
Açıkçası bu model bir CA'nın özelliklerinin çoğuna sahiptir, ancak aynı zamanda alternatif sonuçları araştırmak için yararlı olan rastgele bir etki içerir.
kod
Aşağıdakiler simülasyonu uygular 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
Pakete henüz baktınız mı ? Raster (noo, rly?) Verileriyle çalışmak için birçok araç var.