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ícioUtilizaçã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
geracao | contador global de iterações |
energia-total | contém a soma da energia de todas as turtles (coelhos) |
turtles: energia | nível de energia de cada coelho |
Funções principais
preparar | prepara o modelo aleatoriamente respeitando as densidades de coelhos e ervas especificadas |
executar | implementa uma iteração do modelo |
Funções auxiliares
movimento | controla as acções de cada coelho |
crescer-ervas | faz crescer ervas e daninhas em patches desocupados (pretos) de acordo com a probabilidade respectiva |
passo | faz mover os coelhos, diminuindo a sua energia |
comer-erva | come a erva (verde) que o coelho encontra, aumentando a sua energia |
comer-daninhas | come as ervas daninhas (violeta) que o coelho encontra, aumentando a sua energia |
reproduzir | gera um novo coelho se o progenitor tiver energia suficiente, repartindo esta energia igualmente pelos dois |
morrer | mata o coelho se a sua energia descer a zero |
fazer-grafico | actualiza o gráfico de populações |
preparar-grafico | prepara 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ícioVariantes 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
©opyright 2004, Centro de Física Teórica e Computacional programa utilizado foi implementado pela Northwestern University, Evanston, IL.