Coelhos-Ervas



Introdução

Este modelo explora um ecosistema simples composto por coelhos, erva, e ervas daninhas. Os coelhos deslocam-se aleatoriamente, e as ervas e ervas daninhas crescem aleatoriamente. Quando um coelho encontra alguma erva ou erva daninha, come-a e ganha energia. Se o coelho ganhar energia suficiente, reproduz-se. Caso contrário, acaba por morrer.

A erva e as ervas daninhas podem ser ajustadas para crescerem a ritmos diferentes e para darem aos coelhos quantidades de energia diferentes. O modelo pode ser usado para investigar as vantagens competitivas destas variáveis.

Início

Utilização

Observe o mostrador COELHOS, que conta o número de coelhos em existência, e o gráfico para ver como a população de coelhos evolui com o tempo.

No início, não existe erva suficiente para todos os coelhos, e muitos morrem. Mas isso permite que a erva cresça livremente, fornecendo comida abundante para os coelhos que ficam. Esses coelhos ganham energia suficiente e reproduzem-se. O maior número de coelhos leva de novo à falta de erva, e o ciclo recomeça.

A população de coelhos segue uma oscilação amortecida (o mesmo acontece com a quantidade de erva), eventualmente estabilizando num intervalo pequeno. As oscilações da população de coelhos e da quantidade de erva encontram-se desfasadas uma da outra. Estas oscilações desfasadas são características de sistemas predador/presa.



Início

Questões

1. Com a simulação a correr, aumente o valor do parâmetro CRESCIMENTO-ERVA e deixe o sistema estabilizar. Como é que isto influencia a quantidade de erva e a população de coelhos?

2. Modifique agora o LIMITE-REPRODUCAO. Como é que isto afecta os níveis de coelhos e de erva (após estabilização)?

3. Com os parâmetros actuais, a população de coelhos sofre uma oscilação amortecida (a amplitude das oscilações diminui com o tempo). Modificando os parâmetros, é possível criar uma oscilação de amplitude constante? Ou uma oscilação instável?

4. Acrescente agora ervas daninhas fazendo CRESCIMENTO-DANINHAS e ENERGIA-DANINHAS iguais a CRESCIMENTO-ERVA e ENERGIA-ERVA, respectivamente. Corra a simulação e note que as populações de ervas e ervas daninhas são aproximadamente iguais. O que acontece ao fazer as ervas e as ervas daninhas crescerem a ritmos diferentes?



5. E o que acontece se as ervas daninhas crescerem ao mesmo ritmo das ervas, mas fornecerem menos energia aos coelhos (ENERGIA-DANINHAS for menor que ENERGIA-ERVA)?

6. Com o modelo a correr, altere subitamente LIMITE-REPRODUCAO para zero. O que acontece?



Início

Breve Análise do Código

Conceito Geral

Neste modelo separou-se uma iteração em várias partes: a actualização das ervas (daninhas ou normais), a movimentação dos coelhos (neste caso representados por turtles) e a sua reprodução.

A actualização das ervas é feita através da função crescer-ervas que para cada patch vazio pinta-o de verde (erva normal) ou violeta (erva daninha) com uma dada probabilidade.

A movimentação dos coelhos é concretizada pela função movimento que desloca os coelhos segundo uma direcção aleatória uma unidade.

Cada coelho tem tambem uma propriedade energia que é diminuída por cada passo dado. Quando esta energia é nula, o coelho é eliminado. A sua energia é no entanto aumentada sempre que o coelho se encontra em cima de um patch com erva e a "come" (ficando essa célula pintada de preto).

A reprodução dá-se apenas quando um coelho atinge um determinado valor de energia. Altura em que esse coelho dá origem a outro. Ambos ficando com metade da energia do coelho inicial.

Variáveis globais
geracaocontador global de iterações
energia-totalcontém a soma da energia de todas as turtles (coelhos)
turtles: energianível de energia de cada coelho
Funções principais
prepararprepara o modelo aleatoriamente respeitando as densidades de coelhos e ervas especificadas
executarimplementa uma iteração do modelo
Funções auxiliares
movimentocontrola as acções de cada coelho
crescer-ervasfaz crescer ervas e daninhas em patches desocupados (pretos) de acordo com a probabilidade respectiva
passofaz mover os coelhos, diminuindo a sua energia
comer-ervacome a erva (verde) que o coelho encontra, aumentando a sua energia
comer-daninhascome as ervas daninhas (violeta) que o coelho encontra, aumentando a sua energia
reproduzirgera um novo coelho se o progenitor tiver energia suficiente, repartindo esta energia igualmente pelos dois
morrermata o coelho se a sua energia descer a zero
fazer-graficoactualiza o gráfico de populações
preparar-graficoprepara o gráfico de populações



Código

Variáveis globais

O código começa com a declaração de algumas variáveis necessárias neste módulo.

globals [ geracao energia-total ]
turtles-own [ energia ]
breeds [ coelhos ]

Começamos com duas variáveis globais. A primeira, GERACAO, é um indicador temporal, enquanto que a ENERGIA-TOTAL representa a soma das energias de todas as "turtles". De seguida é definida a variável ENERGIA como sendo uma variável exclusiva das "turtles". Cada "turtle" terá a sua energia. Por último é definido o tipo de "turtles" - neste caso coelhos.

Funções principais

Passemos então às funções. São 11 neste módulo: preparar, executar, movimento, crescer-ervas, passo, comer-erva, comer-daninhas, reproduzir, morrer, fazer-grafico e preparar-grafico.

As duas primeiras estão associadas a botões na interface. As restantes são funções auxiliares.

preparar
to preparar
  clear-all
  set geracao 0
  set energia-total 0
  crescer-ervas
  set-default-shape coelhos "rabbit-shape"
  create-custom-coelhos numero-inicial
  [ set color white
    setxy random-float screen-size-x random-float screen-size-y
    set energia random 10
    without-interruption
    [ set energia-total energia-total + energia ]]
  preparar-grafico
  fazer-grafico
end

Como sempre, a função preparar limpa os resultados de simulações anteriores e inicializa as variáveis de acordo com as condições iniciais. A limpeza dos gráficos e da janela de visualização é feita pelo comando clear-all. As condições iniciais são impostas pelas instruções que começam com a palavra set.

set geracao 0
set energia-total 0

A função crescer-ervas trata da colocação da erva na janela. De seguida faz-se a atribuição da forma das "turtles" que aparecem na janela usando a forma predefinida "rabbit-shape" (forma de coelho).

São então criados NUMERO-INICIAL de coelhos (definido na interface) com cor branca e com coordenadas reais aleatórias dentro dos limites da janela gráfica (no caso de o valor atribuído à coordenada ultrapassar a fronteira - dado que o tamanho da janela corresponde ao dobro do valor da fronteira - é lhe atribuído um valor na metade esquerda da janela, como se as margens estivessem ligadas entre si). É ainda atribuída uma energia a cada coelho compreendida entre 0 e 10 e calculado o valor da ENERGIA-TOTAL (soma das energias de todos os coelhos). As duas últimas funções, como o nome indica, dizem respeito à parte gráfica e serão analisadas mas à frente.

executar
to executar
  crescer-ervas
  movimento
  fazer-grafico
  set geracao geracao + 1
  if not any? turtles
  [ stop ]
end

Esta função executar é a responsável pela evolução do sistema. Dentro desta são executadas 3 funções, responsáveis pelo crescimento da erva, pelo comportamento dos coelhos e pela construção do gráfico. De seguida faz-se a incrementação da variável GERACAO de uma unidade (cada vez que a função executar é corrida tem-se uma geração). A última instrução diz para o programa parar no caso de não existirem mais coelhos.

Vejamos agora as funções auxiliares.

Funções auxiliares
movimento
to movimento
  ask coelhos
  [ passo
    comer-erva
    comer-daninhas
    if reproducao?
    [ reproduzir ]
    morrer ]
end

Esta função movimento é composta basicamente por outras funções auxiliares, cujo objectivo se deduz facilmente pelo nome. O comportamento de cada coelho traduz-se em deslocar-se, comer erva ou ervas daninhas, reproduzir-se e morrer. A opção de reprodução pode ser ligada ou desligada na interface.

crescer-ervas
to crescer-ervas
  ask patches with [ pcolor = black ]
  [ if random-float 1000 < crescimento-daninhas
    [ set pcolor violet ]
    if random-float 1000 < crescimento-erva
    [ set pcolor green ] ]
end

A função crescer-ervas faz aparecer tanto as ervas como as ervas daninhas. São gerados números aleatórios entre 0 e 1000 e comparados com os valores definidos na interface para os parâmetros CRESCIMENTO-DANINHAS e CRESCIMENTO-ERVA. Desta forma, como a distribuição de números aleatórios é uniforme, naturalmente tem-se que quanto maior o valor dos parâmetros mais patches se transformarão em ervas ou ervas daninhas. Em termos de janela gráfica tem-se, no caso das ervas, uma mudança de cor de preto para verde, e no caso das ervas daninhas uma mudança de preto para violeta (o que é concretizado com o comando set).

passo
to passo
  rt random-float 50
  lt random-float 50
  forward 1
  set energia energia - 0.5
  set energia-total energia-total - 0.5 
end

A função passo faz com que os coelhos se desloquem, rodando para a direita ou esquerda aleatoriamente até um ângulo máximo de 50° e para a frente 1 unidade. Os coelhos ao deslocarem-se perdem energia (0.5 cada um). É necessário ainda subtrair esta energia à energia total.

comer-erva
to comer-erva
  if pcolor = green
  [ stamp black
    set energia energia + energia-erva
    set energia-total energia-total + energia-erva ]
end

A função comer-erva também é bastante intuitiva. Os comandos consistem em verificar se a cor do "patch" sobre o qual o coelho se encontra é verde e nesse caso mudar-lhe a cor para preto e adicionar à sua ENERGIA io valor do parâmetro ENERGIA-ERVA (definido na interface), actualizando tambem a ENERGIA-TOTAL do sistema.

comer-daninhas

De forma análoga se tem a função comer-daninhas, com duas pequenas diferenças: a cor dos "patches" é agora violeta e não verde e o parâmetro passa a ser ENERGIA-DANINHAS (também definido na interface).

to comer-daninhas
  if pcolor = violet
  [ stamp black
    set energia energia + energia-daninhas
    set energia-total energia-total + energia-daninhas ]
end
reproduzir

De seguida temos a função reproduzir. Ela é em tudo semelhante à função reprodução do modelo dos bichos com duas pequenas diferenças: o processo não é feito de uma forma estatística (com números aleatórios) e existe agora uma nova variável que é a energia.

to reproduzir
  if energia > limite-reproducao
  [ set energia energia / 2
    hatch 1
    [ forward 1 ] ]
end

A primeira condição compara a ENERGIA de um dado coelho com o valor do parâmetro LIMITE-REPRODUCAO. No caso de a ENERGIA ser maior tem-se que o coelho gera um filho (a sua energia é suficiente para tal). É necessário então alterar o valor da sua ENERGIA (que é reduzida a metade). O comando hatch (com o argumento 1) origina 1 coelho (tal como no caso dos bichos) e forward fá-lo deslocar um patch para a frente. O filho herda as propriedades do pai, logo o valor atribuído à sua ENERGIA é o mesmo que o da energia do pai, ou seja, metade da energia do pai antes da reprodução.

morrer

A função morrer trata de fazer desaparecer os coelhos quando estes já não têm ENERGIA suficiente para viver (quando a sua ENERGIA é menor ou igual a zero).

to morrer
  if energia <= 0
  [ without-interruption
    [ set energia-total energia-total - energia ] 
      die ]
end

No caso de a energia final de um coelho ser menor que zero, tem-se que na função passo foi subtraído em excesso à ENERGIA-TOTAL, logo é corrigí-la, dado que um coelho não pode ter uma energia menor que zero. Vejamos o seguinte exemplo: suponhamos que todos os coelhos numa determinada iteração dão um passo que resulta numa energia negativa para todos. Pela função passo ter-se-ia que a ENERGIA-TOTAL era negativa, o que sabemos que não é possível. No caso de morte de todos os coelhos, a ENERGIA-TOTAL é nula.

O comando die faz desaparecer uma turtle (um coelho) da janela de visualização.

Por último temos as funções que tratam da parte gráfica. Na interface podemos ver que é necessário traçar três gráficos: coelhos, ervas e ervas daninhas.

preparar-grafico

A função preparar-grafico prepara a janela gráfica, inicializando o conjunto de gráficos que serão desenhados e definindo os limites verticais.

to preparar-grafico
  set-current-plot "Populacoes"
  set-plot-y-range 0 numero-inicial
end
fazer-grafico

Por sua vez, a função fazer-grafico traça os três graficos.

to fazer-grafico
  set-current-plot "Populacoes"
  set-current-plot-pen "erva"
  plot count patches with [ pcolor = green ] / 4
  set-current-plot-pen "coelhos"
  plot count turtles
  set-current-plot-pen "daninhas"
  plot count patches with [ pcolor = violet ] / 4
end

O plot erva consiste na contagem (count) dos "patches" cuja cor é verde e de forma análoga acontece com as daninhas, sendo a cor dos patches violeta. A divisão por quatro depois da contagem dos "patches" é uma questão meramente estética, por forma a que as amplitudes dos plots erva e daninhas se aproximem mais da do plot de coelhos. Este último resume-se à contagem das "turtles", ou seja, ao número de coelhos existentes numa dada geração.

Início

Variantes e Extensões

Introduza uma distribuição de erva não uniforme (por exemplo divida a janela gráfica em duas ou mais regiões com taxas de crescimento de erva diferentes) e observe alterações qualitativas na evolução do sistema (nomeadamente na distribuição dos coelhos).

Início