Warning: package 'ggplot2' was built under R version 4.3.3
####preservação de nascentes####
grid_size <- 40 # Tamanho da grade
p_growth <- 0.7 # Probabilidade de floresta crescer
p_urb_spread <- 0.3 # Probabilidade de urbanização se espalhar
p_agroec_spread <- 0.2 # Probabilidade de agroecologia se espalhar
p_recover_spring <- 0.6 # Probabilidade de agroecologia recuperar nascentes
n_steps <- 30 # Número total de iterações
# Definição dos estados do autômato celular
EMPTY <- 0
FOREST <- 1
SPRING <- 2
ALPHAVILLE <- 3
AGROECO <- 4
set.seed(1) # Fixa a semente para reprodutibilidade
# Criar matriz inicial
landscape <- matrix(FOREST, nrow = grid_size, ncol = grid_size)
# Definir uma área urbana inicial fixa no centro
center_x <- floor(grid_size / 2)
center_y <- floor(grid_size / 2)
landscape[center_x, center_y] <- ALPHAVILLE
# Definir distribuição inicial no restante do mapa
for (i in 1:grid_size) {
for (j in 1:grid_size) {
if (landscape[i, j] == FOREST) {
rand_val <- runif(1)
if (rand_val < 0.1) { # Apenas 10% das células são nascentes
landscape[i, j] <- SPRING
} else if (rand_val < 0.2) { # Apenas 20% das células são agroecológicas
landscape[i, j] <- AGROECO
}
}
}
}
# Função para visualizar a paisagem
plot_landscape <- function(landscape, step) {
df <- expand.grid(x = 1:grid_size, y = 1:grid_size)
df$state <- as.vector(landscape)
df$state <- factor(df$state, levels = c(EMPTY, FOREST, SPRING, ALPHAVILLE, AGROECO),
labels = c("Vazio", "Floresta", "Nascente", "Alphaville", "Agroecológico"))
ggplot(df, aes(x = x, y = y, fill = state)) +
geom_tile(color = "black") +
scale_fill_manual(values = c("white", "darkgreen", "blue", "gray", "lightgreen"), drop = FALSE) +
labs(title = paste("Passo", step), fill = "Estado") +
theme_minimal() +
theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), legend.position = "bottom") +
scale_x_continuous(expand = c(0, 0)) +
scale_y_continuous(expand = c(0, 0))
}
# Plota o estado inicial
print(plot_landscape(landscape, 0))
# Função para obter vizinhos ortogonais
get_neighbors <- function(grid, i, j) {
iup <- ifelse(i + 1 > grid_size, 1, i + 1)
idown <- ifelse(i - 1 < 1, grid_size, i - 1)
jup <- ifelse(j + 1 > grid_size, 1, j + 1)
jdown <- ifelse(j - 1 < 1, grid_size, j - 1)
return(c(grid[iup, j], grid[idown, j], grid[i, jup], grid[i, jdown]))
}
# Loop principal da simulação (iterações do autômato celular)
for (step in 1:n_steps) {
new_landscape <- landscape
for (i in 1:grid_size) {
for (j in 1:grid_size) {
neighbors <- get_neighbors(landscape, i, j)
# Regras para células vazias
if (landscape[i, j] == EMPTY) {
if (any(neighbors == FOREST) && runif(1) < p_growth) {
new_landscape[i, j] <- FOREST
} else if (any(neighbors == ALPHAVILLE) && runif(1) < p_urb_spread) {
new_landscape[i, j] <- ALPHAVILLE
} else if (any(neighbors == AGROECO) && runif(1) < p_agroec_spread) {
new_landscape[i, j] <- AGROECO
}
}
# Regras para Floresta (crescimento e urbanização)
if (landscape[i, j] == FOREST) {
if (sum(neighbors == AGROECO) >= 3 && runif(1) < p_agroec_spread) {
new_landscape[i, j] <- AGROECO
} else if (any(neighbors == ALPHAVILLE) && runif(1) < p_urb_spread/2) {
new_landscape[i, j] <- ALPHAVILLE
}
}
# Regras para Agroecologia
if (landscape[i, j] == AGROECO) {
if (all(neighbors == ALPHAVILLE) && runif(1) < p_urb_spread) {
new_landscape[i, j] <- ALPHAVILLE
} else if(any(neighbors == SPRING) && runif(1) < p_recover_spring) {
new_landscape[i, j] <-FOREST
} else if(all(neighbors == FOREST) && runif(1) < p_recover_spring) {
new_landscape[i, j] <-FOREST
}
}
# Regras para Nascentes
n_alphaville <- sum(neighbors == ALPHAVILLE)
n_agroeco <- sum(neighbors == AGROECO)
n_forest <- sum(neighbors == FOREST)
if (landscape[i, j] == SPRING) {
p_nascente_desaparece <- 1 - (1 - p_urb_spread)^n_alphaville
if (runif(1) < p_nascente_desaparece) {
new_landscape[i, j] <- EMPTY
}
if (n_agroeco > 0) {
new_landscape[i, j] <- SPRING
}
if (n_forest > 0) {
new_landscape[i, j] <- SPRING
}
}
}
}
landscape <- new_landscape
print(plot_landscape(landscape, step))
Sys.sleep(0.5)
}
nascente_final <- sum(landscape == SPRING)
print(paste("Número final de nascentes preservadas:", nascente_final))
[1] "Número final de nascentes preservadas: 154"
sum(new_landscape==AGROECO)