您是否考虑过使用马尔可夫链?这实际上是“概率细胞自动机”,从而提供了所需的随机性。它没有为现有一代的本地邻居规定新一代,而是为新一代指定了概率分布。该分布可以根据例如相同或相似区域的图像的时间序列来估计。
从直觉上讲,该模型表示一个单元不一定会从有林过渡到无林(反之亦然),但过渡的机会取决于周围的土地覆盖。它可以处理多种类型的覆盖物,复杂的邻里配置,甚至可以概括为“记住”土地覆盖物演变的最新历史。
可以使用Map Algebra语句来实现转换,这使得该方法在任何基于栅格的GIS中都可行,即使那些没有直接或快速访问像元级数据的GIS也是如此。使用R使其更加容易。
例如,考虑仅具有两个类别(白色和黑色)的此初始配置:
为了说明可能发生的情况,我创建了一个参数化模型(不基于任何数据),其中向黑色的过渡发生的可能性为1-q ^ k,其中k是3 x 3邻域内黑电池的平均数目(k = 0、1 / 9、2 / 9,...,1)。当q小或大多数邻域已经为黑色时,新单元格将为黑色。这是第十代的四个独立模拟,其中q的五个值从0.25降至0.05:
显然,该模型具有CA的许多特征,但它也包括随机效应,可用于探索替代结果。
码
下面在中实现仿真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
包裹了吗?它有很多工具可以处理栅格(noo,rly?)数据。