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.

Início

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
geracaomantem o número de iterações já decorridas
populacaomantem o número de bichos de uma dada geração
Funções principais
prepararlimpa e inicializa as variáveis e a caixa de visualização. cria tambem todas as turtles posicionando-as de forma aleatória.
executaractualiza o sistema de cada vez que é executada traçando um gráfico da população total em cada iteração.
Funções auxiliares
movimentoroda as turtles de forma aleatória e desloca-as de acordo com o valor dado no argumento
reproducaopara cada turtle dá origem a outra de acordo com a taxa de reprodução escolhida
choquese 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 - 1
Iní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