Agora escreveremos o
procedimento "compete-for-space"
Primeiramente,
diremos: se houver qualquer...
teremos que pedir às turtles que façam isto
Peça às turtles:
se houver quaisquer outras turtles aqui...
Estas palavras especiais se tornarão familiares à medida que faz isto.
Se houver quaisquer outras turtles aqui, mate-as.
Neste contexto, turtle significa que...
...se você estiver em algum lugar
com outra turtle,
então você morre.
Esta é a forma extrema de super população.
Agora precisamos escrever um procedimento
para uma condição em que turtles morrerão,
devido ao excesso populacional.
Precisamos de um parâmetro a definir,
associado ao excesso populacional.
Vamos chamar este parâmetro de "space"
Eu adicionei uma barra chamada "space".
Sabemos que ao redor de todas as turtles
há uma vizinhança de oito espaços.
Norte, Sul, Leste, Oeste,
Nordeste, Noroeste, etc.
Fizemos uma barra com valores de 1 a 8.
E eu pedirei...
Podemos facilmente contar as turtles nos vizinhos.
Então direi:
Se a contagem de turtles nos vizinhos for
oito a menos que a contagem de turtles.
Isto nos dirá o número de espaços vazios.
Se os espaços vazios forem menos
que a quantidade de espaços que uma turtle precisa para viver
então a turtle precisa morrer.
Acabamos de criar uma condição que exige que turtles morram...
...se houver menos espaços vazios que elas precisam para viver.
Nós podemos definir o espaço com qualquer número
de 1 a 8 espaços. Obviamente, se a turtle precisa de
8 espaços para viver, então terá
que ser pouco povoada.
Você pode pensar nisto como um recurso que
restringe o crescimento populacional.
Eu farei uma anotação aqui.
Restrição ao crescimento populacional.
Nós devemos adicionar comentários de forma que outras pessoas
possam entender nosso código.
Se voltarmos a isto depois, poderemos
entender o que as partes do código fazem.
Agora, temos que escrever
o procedimento "disperse"
Este será nosso último procedimento.
Para dispersar, apenas pedimos às turtles que movam
para um dos patches com nenhuma turtle.
Esta linguagem não é nenhum pouco óbvia.
É legível em inglês,
mas certamente não é fácil
quando você está começando a programar.
Este é um código-exemplo que
você pode olhar, para lembar as palavras especiais e escrever seu código.
Essencialmente, estamos falando com grupos de patches agentes,
um subgrupo de patches que atendem certa condição,
e não qualquer turtle aqui.
Então, se um patch contiver nenhuma turtle, nós
moveremos para um destes patches.
Nós somente precisamos fazer isto,
algo um pouco complicado. Se pedíssemos
às turtles que tentem fazer isto
e existisse nenhum destes patches
disponível, estas turtles poderiam continuar a verificar...
...logo o código nunca terminaria.
Então, precisamos acrescentar condições,
e somente fazemos isto se houver patches.
Apenas fazemos isto se a contagem de turtles
na tela for menor ou igual a
contagem de patches.
É possível que tenhamos mais turtles que patches...
...e então seria inútil.
Este código continuaria a rodar.
Nós não saberiamos o que está acontecendo.
Eu falo por experiência própria.
Acho que isso deve funcionar.
Vamos ver se tudo isto executa.
Ainda há algumas perguntas.
Nós definimos uma ampla população inicial.
Estas coisas ainda mudam de cor.
Vamos excluir o que eu acrescentei,
e fazer uma dispersão artificial.
Parece que algo está acontecendo.
Não estou certo do quê.
Vamos obter maior densidade...
Quando dermos um passo...
Se exigirmos que elas precisem de muito espaço,
devemos observar menor povoamento,
de fato, acontece.
Com menos espaço, obtemos maior densidade.
Olhe aqui, parece-me que temos
um modelo aproximado.
Vamos ver o que ocorre aqui
quando observamos a população.
Eu farei um desenho simples.
Como padrão, eles definem um desenho que
conta as turtles. Para que usemos esse
desenho para desenhar de verdade, temos
que fazer algo com o modelo.
Isto acontecerá por padrão sempre que
temos uma marca. A cada passo,
veremos uma marca.
Isto proporcionará um erro a princípio.
Vamos ver que tipo de erro nos dá.
Se configurarmos,
e dermos um passo.
Temos que usar o comando
"reset ticks" ao configurar.
Então, configure,
Não estou certo de que é o que pretendiamos
Vamos tentar iniciando com uma população menor
Vamos ver se isto funciona.
População inicial de 12
Estou fazendo certo?
Parece-me que a função reprodução
não está funcionando.
Vamos descobrir o que está ocorrendo aqui.
Vou inspecionar esta turtle...
320. Geração 13.
Vou lhes mostrar como depuro isto...
Vamos comentar este trecho,
e ver o que acontece por um momento.
A morte não está acontecendo
porque deveriamos ter crescimento exponencial, já que desativamos morte.
Há algo sobre a função "compete-for-space".
Vamos comentar apenas esta parte.
Estou desativando apenas a segunda regra em "compete-for-space".
E estou imaginando que ainda teremos
o mesmo problema.
Imaginei errado.
Vamos voltar e ver isto.
Esta é a regra causadora de problema...
Se qualquer turtle aqui morrer...
Ok, vejo qual é o problema.
Esta regra aqui está
matando os descendentes.
Porque quando eles nascem, esta regra verifica se há alguma turtle no patch
...e morrem em seguida.
Preciso que os descendentes dispersem, antes que eles compitam por espaço...
Então, reproduzimos e dispersamos.
Em seguida, competimos por espaço.
Estes programas quase nunca funcionam logo
de cara. Imagino que isto funcione.
O que fiz foi dizer:
depois de reproduzir, dispersem...
Vamos por "disperse" logo depois de "reproduce". Faz mais sentido.
...os pais da geração anterior morrem,
em seguida há competição por espaço.
Vamos ver se a ordem destes dois faz diferença agora.
Tudo está ativado novamente.
Então configuramos... próximo passo... agora temos crescimento exponencial
e temos uma estabilização.
Mas não estou vendo a organização,... passo, passo, passo
Não é bem o que eu esperava,
mas vamos tentar redefinir com mais espaço.
Isto se parece mais com o que eu esperava.
É como uma curva sigmóide.
Vou redefinir com maior espaço.
Crescimento mais lento, e maior variação.
Ok, acho que o modelo...
Eu diria que este modelo funciona,
temos crescimento exponencial, e então
uma certa estabilização.
Temos um tipo de configuração fixa.
Estas são as perguntas
que podem surgir quando se constroem modelos.
Por que aquilo funciona daquele modo?
Se tivermos um procedimento de dispersão diferente
provavelmente veríamos algo mais.
Uma das coisas que poderia mudar
é a dispersão, torná-la mais fisicamente realística.
Ao invés de as turtles magicamente moverem para um patch,
fazê-las migrarem da atual
localização até elas encontrarem uma nova.
Teria mais código, mas valeria a pena.
Você poderia dar cores diferentes
às famílias e assistí-las ao longo do tempo...
...um projeto engenhoso.
Ok, finalmente, para preencher a lacuna.
Temos um botão de Passo.
O botão de Prossiga pode ser um botão de Passo com
o atributo ativado para sempre.
Este é um ponto importante para notar,
o display não precisa necessariamente ser o mesmo que
o comando, mas se você não inserir
o nome do display, então o nome do comando será usado como rótulo do botão
Temos um belo modelo que
possui restrições. Em certas configurações de espaço,
realiza um bom trabalho ao modelar
crescimento exponencial e um arredondamento
da capacidade de contimento.