Neste capítulo vamos mostrar técnicas de terminar a execução do código em NetLogo, assim como a capacidade que as turtles têm para desenhar a trajectória por onde passaram. Para o ilustrar vamos usar o modelo da marcha aleatória.
Matematicamente a marcha aleatória é a formalização da ideia intuitiva de avançar passo a passo, cada um numa direcção ao acaso. Por esta razão a marcha aleatória é também conhecida por passeio do bêbado.
A marcha aleatória é um processo probabilístico simples com aplicações em diversos campos, que vão desde:
Com este programa pretendemos estudar a marcha aleatória numa rede regular em dimensão um ou dois. O guião das turtles é o seguinte:
Uma das características principais e mais surpreendentes da marcha aleatória é a de que a distância da partícula ao ponto de partida é, em média, proporcional à raiz quadrada do tempo: d = k√t.
Esta relação está também presente nos fenómenos de difusão de partículas em fluidos. A título de curiosidade mencionamos que Einstein (no ano milagroso de 1905) utilizou a teoria cinética de fluidos para calcular a constante de proporcionalidade entre o tempo e a distância quadrática percorrida, em termos de constantes fundamentais das partículas e do fluido. Em 1908 a relação de Einstein permitiu a Perrin determinar experimentalmente o número de Avogadro.
O leitor é agora convidado a interagir com este modelo através do seguinte applet:
Para correr este modelo no ambiente NetLogo, basta seguir o link marcha-aleatoria, se tiver instalado o software
Para iniciar o programa de marcha aleatória, deve em primeiro lugar seleccionar o numero-de-abelhas que vão executar as trajectórias partindo da origem. Pode também seleccionar a dimensao da rede, assim como o tamanho-do-lado.
Se quiser que o programa pare quando uma das trajectórias atingir uma determinada distância limite, deve colocar o interruptor limite? em on e definir o raio-limite da circunferência. Caso contrário, se quiser que as trajectórias continuem indefinidamente, basta colocar o interruptor limite? em off.
Depois de ter escolhido todos estes parâmetros, deve premir preparar e depois executar para começar / parar o procedimento da marcha aleatória.
Comecemos por experimentar o modelo numa rede de dimensao 2, com tamanho-do-lado = 1, com raio-limite = 200 (o raio-limite destina-se a evitar o problema da forma toroidal do mundo, o qual implica que não haja pontos tão distantes quanto quisermos) e para uma abelha (esquerda) ou cem abelhas (direita):
Para uma abelha não é perceptível a existência de qualquer padrão, porém quando tomamos muitas abelhas, para fazermos a média da distância à origem em função do tempo, emerge um padrão: –a distância média percorrida é proporcional à raiz quadrada do tempo. O mesmo comportamento também pode ser observado em dimensao 1, mantendo todos os outros parâmetros inalterados:
Matematicamente, prova-se que esta relação é válida para qualquer dimensão.
Para observarmos com mais detalhe a trajectória das abelhas, podemos mudar o tamanho-do-lado da rede para 5, por exemplo, e tomar um numero-de-abelhas pequeno, 20 por exemplo, para que o écran não fique demasiado apinhado de abelhas:
Uma das propriedades curiosas da marcha aleatória em dimensão 1 ou 2, é a de que todos os pontos da rede são visitados mais cedo ou mais tarde. O mesmo já não acontece em dimensão 3, ou superior: –um bêbado encontra sempre o caminho para casa, mas um pássaro bêbado geralmente nunca mais encontra o ninho!
O modelo está dividido nas seguintes secções:
tempo | contém o número de iterações já decorridas |
media | contém a distância quadrática média das turtles à origem |
turtles: distancia | propriedade de cada turtle que contem a distância desta à origem |
preparar | limpa e inicia todas as variáveis, cria e inicia as turtles. |
executar | itera as regras de movimento das turtles, actualiza as variáveis, desenha as variáveis globais na janela gráfica e pára o programa quando uma das turtles cruza a fronteira. |
globals [ tempo media ] turtles-own [ distancia ] to preparar ca set tempo 0 create-custom-turtles numero-de-abelhas [ set heading 90 set shape "bee" set size 15 pd ] if limite? [ ask patches with [ raio-limite = int distancexy 0 0 ][ set pcolor 3 ] ] end to executar set media 0 ask turtles [ ifelse dimensao = 1 [ rt 180 * (random 2) ][ rt 90 * (random 4) ] fd tamanho-do-lado set distancia distancexy 0 0 set media media + distancia * distancia if limite? and distancia >= raio-limite [ die stop ] ] set tempo tempo + 1 set media media / numero-de-abelhas ifelse count turtles = numero-de-abelhas [ plot media ][stop] end
Vejamos em detalhe cada componente lógica do código:
A primeira declaração indica a existência de duas variáveis globais (tempo e media).
globals [ tempo media ]
A variável tempo conta o número de ciclos desde o começo do programa, enquanto que a variável media contem a distância quadrática média das turtles à origem.
A segunda declaração indica a existência de uma variável global para cada turtle:
turtles-own [ distancia ]
a qual contem a distância desta à origem.
to preparar ca set tempo 0 create-custom-turtles numero-de-abelhas [ set heading 90 set shape "bee" set size 15 pd ] if limite? [ ask patches with [ raio-limite = int distancexy 0 0 ][ set pcolor 3 ] ] end
A rotina preparar, tem o objectivo de preparar a simulação, ou seja, limpa resultados anteriores e devolve às variáveis os valores iniciais.
A instrução create-custom-turtles numero-de-abelhas [ comandos ] cria numero-de-abelhas localizadas na origem, cada uma com a sua cor e com as condições iniciais impostas pelo comando set. O comando pd (o mesmo que pen-down) faz com que cada turtle passe a desenhar a sua trajectória com a cor da turtle.
to executar set media 0 ask turtles [ ifelse dimensao = 1 [ rt 180 * (random 2) ][ rt 90 * (random 4) ] fd tamanho-do-lado set distancia distancexy 0 0 set media media + distancia * distancia if limite? and distancia >= raio-limite [ die stop ] ] set tempo tempo + 1 set media media / numero-de-abelhas ifelse count turtles = numero-de-abelhas [ plot media ][stop] end
A rotina executar parte das condições iniciais e modifica-as através da aplicação sucessiva de um conjunto de regras.
O comando die retira de circulação a turtle em questão. O primeiro comando stop pára a execução da instrução ask turtles, mas o programa continua enquanto houver turtles que tenham sobrevivido (que não tenham cruzado a fronteira). O segundo comando stop termina a execução do programa, pois não está dentro de uma instrução ask, nem dentro de um ciclo while.
Usamos o comando stop para parar a execução do programa, pois uma vez que uma turtle tenha cruzado a fronteira, deixa de fazer sentido calcular distâncias, pois a turtle dá a volta ao mundo e aparece do outro lado, ficando outra vez mais perto da origem.