Avez-vous pensé à utiliser une chaîne Markov ? Il s'agit effectivement d'un "automate cellulaire probabiliste", fournissant ainsi le caractère aléatoire souhaité. Au lieu de prescrire la nouvelle génération en termes de voisins locaux de la génération existante, elle spécifie une distribution de probabilité pour la nouvelle génération. Cette distribution peut être estimée, disons, à partir de séquences temporelles d'images de zones identiques ou similaires.
Intuitivement, ce modèle dit qu'une cellule ne fera pas nécessairement une transition de boisée à non boisée (ou vice versa ), mais les chances qu'elle fera que la transition dépendra de la couverture terrestre immédiatement autour d'elle. Il peut gérer plusieurs classes de couvertures, des configurations complexes de quartiers et même être généralisé pour «se souvenir» de l'histoire récente de l'évolution de la couverture terrestre.
Les transitions peuvent être implémentées à l'aide d'instructions d'algèbre de carte, ce qui rend cette méthode praticable dans tout SIG basé sur raster, même ceux sans accès direct ou rapide aux données au niveau de la cellule. L'utilisation de R le rend encore plus facile.
Par exemple, considérez cette configuration de départ avec seulement deux classes, blanc et noir:
Pour illustrer ce qui peut arriver, j'ai créé un modèle paramétré (non basé sur des données) dans lequel la transition vers le noir se produit avec la probabilité 1 - q ^ k où k est le nombre moyen de cellules noires dans le voisinage 3 x 3 (k = 0, 1/9, 2/9, ..., 1). Lorsque q est petit ou que la majeure partie du quartier est déjà noire, la nouvelle cellule sera noire. Voici quatre simulations indépendantes de la dixième génération pour cinq valeurs de q allant de 0,25 à 0,05:
Évidemment, ce modèle présente de nombreuses caractéristiques d'une AC, mais il inclut également un effet aléatoire utile pour explorer d'autres résultats.
Code
Ce qui suit implémente la simulation dans 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
paquet? Il a beaucoup d'outils pour travailler avec des données raster (noo, rly?).