Atividade final

Três cenários

  • Preservação de nascentes

  • Ordenamento territorial

  • Priorização da urbanização

EMPTY <- 0

FOREST <- 1

SPRING <- 2

ALPHAVILLE <- 3

AGROECO <- 4

Preservação de nascentes

library(ggplot2)
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(landscape==AGROECO)
[1] 35
sum(new_landscape==AGROECO)
[1] 35

Ordenamento compartilhado

library(ggplot2)
#ordenamento compartilhado####
grid_size <- 40  # Tamanho da grade
p_growth <- 0.6  # Probabilidade de floresta crescer
p_urb_spread <- 0.4  # Probabilidade de urbanização se espalhar
p_agroec_spread <- 0.2  # Probabilidade de agroecologia se espalhar
p_recover_spring <- 0.5  # 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) >= 2 && runif(1) < p_agroec_spread / 3) {
          new_landscape[i, j] <- AGROECO
        } else if (any(neighbors == ALPHAVILLE) && runif(1) < p_urb_spread / 2) {
          new_landscape[i, j] <- ALPHAVILLE
        }
      }
      
      # Regras para Agroecologia (controle da expansão)
      if (landscape[i, j] == AGROECO) {
        if (all(neighbors == ALPHAVILLE) && runif(1) < p_urb_spread) {
          new_landscape[i, j] <- ALPHAVILLE
        }
      }
      
      # Regras para Nascentes
      n_alphaville <- sum(neighbors == ALPHAVILLE)
      n_agroeco <- sum(neighbors == AGROECO)
      
      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
        }
      }
    }
  }
  
  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: 140"

Urbanização intensa

####urbanização####
library(ggplot2)
grid_size <- 40  # Tamanho da grade
p_growth <- 0.4  # Probabilidade de floresta crescer
p_urb_spread <- 0.6  # Probabilidade de urbanização se espalhar
p_agroec_spread <- 0.2  # Probabilidade de agroecologia se espalhar
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 / 2) {
          new_landscape[i, j] <- AGROECO
        } else if (any(neighbors == ALPHAVILLE) && runif(1) < p_urb_spread) {
          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
        }
      }
      
      
    
      # 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: 105"