Bichos
Introdução
Este programa pretende ilustrar os resultados dos dois modelos mais
simples para simular a evolução de uma população isolada a partilhar um
certo habitat, a dinâmica exponencial e a logística.
O caso da dinâmica exponencial resulta de supor que o único factor que
influencia a variação do número de indivíduos é o balanço entre natalidade
e mortalidade, que supomos positivo (caso contrário a espécie extingue-se).
Um modelo mais realista deve incorporar o efeito de competição pelos
mesmos recursos, que limita o crescimento de qualquer população. O modelo
logístico é o mais simples que tem em conta este efeito.
Utilização
Existe uma espécie de turtle ("bichos"). Quando se prime o botão PREPARAR, é criado um número de bichos especificado pelo cursor NUMERO-INICIAL-BICHOS. Estes bichos iniciais são colocados em posições e orientações aleatórias na janela gráfica.
Uma posição ou "patch" na janela gráfica é identificada por um par de números inteiros que representam as coordenadas horizontal e vertical desse "patch".
A evolução no tempo da população inicial ao longo de sucessivas gerações é desencadeada quando se prime o botão EXECUTAR, e o tempo é medido no contador de gerações. Cada um destes bichos tem uma certa probabilidade de se reproduzir. O valor desta probabilidade é escolhido usando o cursor TAXA-DE-REPRODUCAO. Assim, em cada geração, cada bicho pode dar origem no máximo a um novo descendente, que é colocado junto ao progenitor.
Opcionalmente, pode-se permitir que os bichos se desloquem na janela gráfica, ou seja, que se movam no seu habitat. O cursor VELOCIDADE estipula o deslocamento máximo por geração permitido a cada bicho (o valor efectivo é escolhido aleatoriamente para cada um no intervalo entre zero e o valor da velocidade). A direcção do movimento é rodada por uma quantidade aleatória em cada deslocamento.
Com o selector COMPETICAO? em "off", as únicas acções que cada bicho pode executar são a reprodução e, eventualmente, o movimento aleatório dentro do seu habitat. Nesta versão do modelo, o único ingrediente para a evolução do número total de indivíduos é a reprodução. Como seria de esperar, a população total apresenta crescimento exponencial, como se pode ver no gráfico.
Num modelo mais realista, é necessário introduzir o efeito de competição pelos mesmos recursos que limita o crescimento de qualquer população.
Existe um selector, COMPETICAO?, que activa/desactiva este efeito na população: Quando o selector está "on", além do comportamento descrito acima, morre um bicho por geração em cada "patch" sobrelotado. Um "patch" é considerado sobrelotado quando é ocupado por mais do que um bicho.
Nesta variante, e com VELOCIDADE=0, observa-se uma dinâmica logística, ou seja, a população estabiliza para um número total de indivíduos próximo do número total de "patches", como seria de esperar (por defeito, existem 35x35=1225 "patches" na janela gráfica).
Quando escolhemos VELOCIDADE>0, observam-se dois efeitos na população. Primeiro, o valor em que a população total estabiliza diminui quando a velocidade aumenta. Isto reflecte o aumento do "território de competição" que cada bicho abrange em cada geração. Segundo, aparecem pequenas flutuações em torno do ponto fixo. Isto reflecte o facto de o movimento dos bichos ser aleatório e de a população não estar homogeneamente distribuída. Estes dois factos em conjunto fazem com que os eventos de morte por competição possam variar de geração para geração, dando origem a flutuações no número de bichos presentes.
Início
Questões
1. Considere o modelo sem competição.
a) Utilize os dados do ecran para medir o efeito da variação da taxa de reprodução no ritmo de crescimento da população.
b) A partir da mesma distribuição inicial de população, observe a evolução do modelo para velocidade igual a 0 e para velocidade igual a 10. Qual o efeito do movimento dos bichos no padrão de distribuição espacial da população?
2. Considere agora o modelo com competição.
a) Observe a evolução da população com velocidade de deslocamento igual a 0. A taxa de reprodução tem influência no número de indivíduos em que a população estabiliza? Porquê?
resposta
VÊ-SE UM EFEITO DE AUMENTO DA POPULAÇÃO DE EQUILÍBRIO COM A TAXA DE REPRODUÇÃO PORQUE O MODELO PERMITE A PERSISTÊNCIA DE PATCHES SOBRELOTADOS. NO ENTANTO, A DEPENDÊNCIA É FRACA, O QUE TRADUZ O FACTO DE O MODELO NÃO SER O MODELO LOGÍSTICO (NÃO HÁ CAMPO MÉDIO, TUDO É LOCAL, E O EQUILÍBRIO GLOBAL É O LOCAL).
b) Qual o principal efeito de variar a taxa de reprodução?
c) Deixe evoluír o sistema até atingir o equilíbrio para uma taxa de reprodução baixa, por exemplo 5%. Recomece a simulação e introduza o deslocamento dos bichos com velocidade igual a 0.1, 0.2, ..., até 10. O que acontece, e porquê?
resposta
OS AGRUPAMENTOS DE POPULAÇÃO PERMITIDOS NO CASO ESTÁTICO SÃO RAPIDAMENTE DIZIMADOS. PASSAMOS PROGRESSIVAMENTE AO REGIME DE CAMPO MÉDIO, E SURGE UM NOVO EQUILÍBRIO, QUE É GLOBAL. REPARE QUE NESTE CASO A DENSIDADE DE EQUILÍBRIO É MUITO BAIXA E AS FLUTUAÇÕES NÃO AUMENTAM COM A VELOCIDADE.
d) Repita a experiência anterior para uma taxa de reprodução alta, por exemplo 70%. Comente e interprete as diferenças em relação ao caso anterior. resposta
TAL COMO NO CASO ANTERIOR, HÁ UM DECRÉSCIMO GRADUAL DA POPULAÇÃO DE EQUILÍBRIO, PARA VALORES LIMITE SUPERIORES AO CASO ANTERIOR, O QUE É CONSISTENTE COM O MODELO LOGÍSTICO DE CAMPO MÉDIO. AS FLUTUAÇÕES AUMENTAM LIGEIRAMENTE COM A VELOCIDADE, PORQUE NESTE CASO A DENSIDADE É SUFICIENTEMENTE ALTA PARA QUE HAJA ESTATÍSTICA NOS "PATCHES" VARRIDOS EM CADA GERAÇÃO.
Início
Breve Análise do Código
Conceito Geral
Neste modelo prepara-se a simulação criando o número de turtles escolhidas pelo utilizador, posicionando-as de forma aleatória. Em cada iteração utilizando a função movimento roda e desloca-se as turtles. Executando-se em seguida a função reproducao que cria mais turtles de acordo com a taxa de reprodução escolhida pelo utilizador.
No caso de a competição estar ligada, então é utilizada a função choque que elimina turtles quando existem mais que uma na mesma patch.
Variáveis globais
geracao | mantem o número de iterações já decorridas |
populacao | mantem o número de bichos de uma dada geração |
Funções principais
preparar | limpa e inicializa as variáveis e a caixa de visualização. cria tambem todas as turtles posicionando-as de forma aleatória. |
executar | actualiza o sistema de cada vez que é executada traçando um gráfico da população total em cada iteração. |
Funções auxiliares
movimento | roda as turtles de forma aleatória e desloca-as de acordo com o valor dado no argumento |
reproducao | para cada turtle dá origem a outra de acordo com a taxa de reprodução escolhida |
choque | se existir mais que uma turtle no mesmo patch, uma é escolhida aleatoriamente e eliminada |
Código
Variáveis globais
A declaração inicial indica a existência de duas variáveis globais (geracao e populacao).
globals [ geracao populacao ]
A variável GERACAO é um indicador temporal, enquanto que a variável POPULACAO dá-nos o numero de bichos numa dada geração.
Funções principais
Passemos então às funções. No nosso módulo temos as funções preparar, executar, movimento, reproducao e choque.
preparar
to preparar cg ;; apaga turtles e patches ppu ;; levanta a caneta set geracao 0 set populacao numero-inicial-bichos plotxy geracao populacao ;; move a caneta para xy crt numero-inicial-bichos ask turtles [ set xcor (random screen-size-x) - screen-edge-x set ycor (random screen-size-y) - screen-edge-y set color yellow ] end
A função preparar, tal como o nome indica, tem o objectivo de preparar a simulação, ou seja, limpa resultados anteriores, devolvendo às variáveis os valores iniciais.
A limpeza dos resultados anteriores e da janela gráfica onde se situam as turtles e os patches é dada pela instrução cg. As condições iniciais são impostas pelas instruções que começam com a palavra set. As instruções ppu e plotxy tem como objectivo preparar o gráfico, deslocando a "caneta" para o ponto inicial.
O valor do parâmetro NUMERO-INICIAL-BICHOS é definido na interface, que corresponde ao valor inicial da população. É necessário ainda criar as "turtles" na janela de gráfica, o que é feito através do comando crt (create). As suas coordenadas são dadas pelos comandos
set xcor (random screen-size-x) - screen-edge-x set ycor (random screen-size-y) - screen-edge-y
xcor é a variável onde vai ser armazenado o valor da coordenada em x. random screen-size-x dá um número aleatório entre 0 e a largura da janela gráfica. A este número é subtraído o valor da margem em x (screen-edge-x) cujo valor é metade da largura da janela de visualização. Para a coordenada y o raciocínio é análogo.
executar
to executar locals [ aux cor done ] set done 0 set aux 5 ask turtles [ movimento velocidade reproducao ] if competicao? [ ask turtles [ choque ] ] set geracao geracao + 1 ppd ;; poisa caneta set cor taxa-de-reproducao * 1.3 while[ done = 0 ] [ ifelse cor < aux [ set cor aux set done 1 ] [ set aux aux + 5 ] ] set-plot-pen-color cor plotxy geracao populacao end
A função executar parte das condições iniciais e modifica os valores através da aplicação sucessiva de um conjunto de regras. Relembra-se que o botão para esta função é um botão forever, ou seja, esta função, uma vez inicializada, está sucessivamente a ser aplicada, até que o utilizador dê ordens contrárias. O primeiro bloco
ask turtles [ movimento velocidade reproducao ]
faz com que as "turtles" se movimentem e se reproduzam de acordo com os valores atribuídos para a VELOCIDADE e para a TAXA-DE-REPRODUCAO.
Por sua vez, o bloco seguinte aplica a função choque às "turtles" no caso de existir competição.
if competicao? [ ask turtles [ choque ] ]
A instrução seguinte incrementa de uma unidade a variável GERACAO.
set geracao geracao + 1
Os restantes comandos dizem respeito à componente gráfica (POPULACAO versus GERACAO). Além de permitirem desenhar sucessivos gráficos para diferentes valores dos parâmetros, a sua cor vem dada em função da TAXA-DE-REPRODUCAO.
Funções auxiliares
Passemos então às três restantes funções. Como se verifica pela janela da interface e pelo código, estas funções não são funções principais, não existe nenhum botão que as faça correr directamente. São pois funções auxiliares, incorporadas na função executar. Porque estão separadas, à parte? Para que o código possa ser mais facilmente interpretado e, em casos de erros de programação, estes serem detectados com maior rapidez.
movimento
A função movimento faz deslocar as "turtles". O comando rt (right) roda a direcção do seu movimento para a direita, neste caso, por uma quantidade angular real aleatória entre 0 e 10. O comando forward desloca-as para a frente, neste caso, por uma quantidade real aleatória entre 0 e o valor armazenado na variável distância.
to movimento [ distancia ] rt random-float 10.0 forward random-float distancia end
Relembre-se que quando esta função é utilizada na função executar a variável distância é substituída pelo parâmetro VELOCIDADE.
ask turtles [ movimento velocidade reproducao ]
Esta substituição aparece de uma forma natural, devido à relação linear existente entre estas duas grandezas.
reproducao
A função reprodução, como o nome indica, origina novas "turtles". O número de "turtles" criadas em cada iteração é dado em termos estatísticos pela taxa-de-reproducao, estando esse número compreendido entre 0 e o número de "turtles" existentes.
to reproducao if random 100 < taxa-de-reproducao [ hatch 1 [ movimento 2 set populacao populacao + 1 ] ] end
O comando hatch origina x novas "turtles", sendo x o número que se segue ao comando (neste caso 1). Esta nova "turtle" é inicialmente colocada no mesmo "patch". O comando movimento fá-la deslocar-se para outro "patch" próximo. É necessário ainda incrementar a variável população de uma unidade (o número de "turtles" criadas). Não esquecer que esta função é executada em cada iterada para todas as "turtles".
choque
A função choque materializa os efeitos de competição. A ideia intuitiva é de que, cada vez que duas ou mais "turtles" se encontram no mesmo "patch", uma delas morre.
to choque without-interruption [ if any? other-turtles-here [ ask random-one-of turtles-here [ set populacao populacao - 1 die ] ] ] end
Para concretizar esta tarefa, são usados os comandos acima. O comando without-interruption faz com que as restantes "turtles", que não estejam a executar as operações seguintes, sejam postas em espera. A linha seguinte
if any? other-turtles-here
verifica se há mais do que uma "turtle" no mesmo "patch". Se a resposta for afirmativa, (se o valor retribuído for verdadeiro) então uma das "turtles" morrerá (pelo comando die) e o valor da populacao terá de ser reduzido de uma unidade.
set populacao populacao - 1Início
Variantes e Extensões
Modifique o programa de forma a ter taxas de reprodução por geração maiores que um. Observe alterações no sistema. Introduza ainda um novo parâmetro que regule a intensidade da competição (por exemplo uma taxa de mortalidade).
Início©opyright 2004, Centro de Física Teórica e Computacional