Haben Sie daran gedacht, eine Markov-Kette zu verwenden ? Dies ist effektiv ein "probabilistischer zellularer Automat", wodurch die gewünschte Zufälligkeit geliefert wird. Anstatt die neue Generation in Bezug auf die lokalen Nachbarn der bestehenden Generation vorzuschreiben, gibt sie eine Wahrscheinlichkeitsverteilung für die neue Generation vor. Diese Verteilung kann beispielsweise aus zeitlichen Abfolgen von Bildern gleicher oder ähnlicher Bereiche geschätzt werden.
Dieses Modell geht intuitiv davon aus, dass eine Zelle nicht unbedingt von einer bewaldeten in eine nicht bewaldete Zelle übergeht (oder umgekehrt ), sondern dass die Wahrscheinlichkeit, dass der Übergang erfolgt, von der unmittelbaren Landbedeckung um sie herum abhängt. Es kann mit mehreren Deckungsklassen, komplexen Konfigurationen von Stadtvierteln umgehen und sogar verallgemeinert werden, um sich an die jüngste Geschichte der Landbedeckungsentwicklung zu erinnern.
Die Übergänge können mithilfe von Map Algebra-Anweisungen implementiert werden, wodurch diese Methode in jedem rasterbasierten GIS praktikabel ist, auch ohne direkten oder schnellen Zugriff auf Daten auf Zellebene. Die Verwendung von R macht es noch einfacher.
Betrachten Sie beispielsweise diese Startkonfiguration mit nur zwei Klassen, Weiß und Schwarz:
Um zu veranschaulichen, was passieren kann, habe ich ein parametrisiertes Modell erstellt (das auf keinen Daten basiert), in dem der Übergang zu Schwarz mit der Wahrscheinlichkeit 1 - q ^ k erfolgt, wobei k die durchschnittliche Anzahl schwarzer Zellen in der 3 × 3-Nachbarschaft ist (k =) 0, 1/9, 2/9, ..., 1). Wenn entweder q klein ist oder der größte Teil der Nachbarschaft bereits schwarz ist, ist die neue Zelle schwarz. Hier sind vier unabhängige Simulationen der zehnten Generation für fünf Werte von q im Bereich von 0,25 bis 0,05:
Offensichtlich weist dieses Modell viele der Merkmale einer Zertifizierungsstelle auf, es enthält jedoch auch einen Zufallseffekt, der für die Untersuchung alternativer Ergebnisse nützlich ist.
Code
Im Folgenden wird die Simulation in implementiert 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
Paket schon angesehen? Es gibt viele Werkzeuge, um mit Raster-Daten (noo, rly?) Zu arbeiten.