A marcha aleatória

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:

  • a Física, modelando o movimento aleatório de partículas microscópicas imersas num fluido composto por moléculas muito mais pequenas - fenómeno conhecido como movimento browniano;
  • à Economia, sendo o exemplo mais simples, e o primeiro neste ramo do conhecimento, a teoria do movimento browniano aritmético (Louis Bachelier, 1900) onde o preço de um activo cotado em bolsa sobe e desce um cêntimo ao acaso com igual probabilidade, pois, em média, não há nenhuma razão para que os compradores estejam mais certos que os vendedores e vice-versa;
  • passando pela Biologia, por exemplo na propagação de estímulos dentro do cérebro; etc.

O modelo

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:

  1. As turtles movem-se ao acaso ao longo das direcções da rede.
  2. Quando as turtles se afastam mais do que o raio limite da origem, a peça acaba.

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 = kt.

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.

Interagindo com o modelo

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.

Conclusões

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!

Breve análise do código

O modelo está dividido nas seguintes secções:

Variáveis globais
tempocontém o número de iterações já decorridas
mediacontém a distância quadrática média das turtles à origem
turtles: distanciapropriedade de cada turtle que contem a distância desta à origem
Rotinas principais
prepararlimpa e inicia todas as variáveis, cria e inicia as turtles.
executaritera 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.

O código

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:

Variáveis globais

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.

Rotinas principais
preparar
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.

executar
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.