Bạn đã nghĩ đến việc sử dụng chuỗi Markov ? Đây thực sự là một "thiết bị tự động di động xác suất", do đó cung cấp tính ngẫu nhiên mong muốn. Thay vì quy định thế hệ mới theo các nước láng giềng địa phương của thế hệ hiện tại, nó chỉ định phân phối xác suất cho thế hệ mới. Phân phối đó có thể được ước tính từ, giả sử, chuỗi thời gian của hình ảnh của cùng một khu vực hoặc tương tự.
Theo trực giác, mô hình này nói rằng một tế bào sẽ không nhất thiết thực hiện quá trình chuyển đổi từ rừng sang không có rừng (hoặc ngược lại ), nhưng khả năng nó sẽ thực hiện quá trình chuyển đổi phụ thuộc vào độ che phủ đất ngay lập tức xung quanh nó. Nó có thể xử lý nhiều lớp che phủ, cấu hình phức tạp của các khu phố và thậm chí được khái quát hóa để "ghi nhớ" lịch sử phát triển che phủ đất gần đây.
Việc chuyển đổi có thể được thực hiện bằng cách sử dụng các câu lệnh Đại số bản đồ, điều này làm cho phương pháp này có thể thực hiện được trong bất kỳ hệ thống GIS dựa trên raster nào, ngay cả những người không có quyền truy cập trực tiếp hoặc nhanh chóng vào dữ liệu cấp độ tế bào. Sử dụng R làm cho nó thậm chí dễ dàng hơn.
Ví dụ, hãy xem xét cấu hình bắt đầu này chỉ với hai lớp, trắng và đen:
Để minh họa những gì có thể xảy ra, tôi đã tạo một mô hình được tham số hóa (không dựa trên bất kỳ dữ liệu nào) trong đó quá trình chuyển đổi sang màu đen xảy ra với xác suất 1 - q ^ k trong đó k là số lượng ô đen trung bình trong vùng lân cận 3 (3 = k = 0, 1/9, 2/9, ..., 1). Khi q nhỏ hoặc hầu hết vùng lân cận đã có màu đen, ô mới sẽ có màu đen. Dưới đây là bốn mô phỏng độc lập của thế hệ thứ mười cho năm giá trị của q, từ 0,25 xuống 0,05:
Rõ ràng mô hình này có nhiều đặc điểm của CA nhưng nó cũng bao gồm một hiệu ứng ngẫu nhiên hữu ích để khám phá các kết quả thay thế.
Mã
Sau đây thực hiện mô phỏng trong 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
gói chưa? Nó có rất nhiều công cụ để làm việc với dữ liệu raster (noo, rly?).