Breve introdução à programação em NetLogo

Apesar da linguagem NetLogo ser bastante fácil de aprender, não põe limites à sofisticação dos modelos que podem ser criados. É particularmente bem adaptada à modelação de sistemas compostos de indivíduos autónomos que interagem entre si. Estas características tornaram-na bastante popular e as aplicações vão desde a modelação do comportamento dos agentes no mercado de acções, à previsão da propagação de epidemias, à modelação da evasão fiscal, à modelação da evacuação de multidões, ao crescimento e declínio de civilizações antigas, à modelação das complexidades do sistema imunitário humano, à modelação da guerra de guerrilha e assistência a civis e muitas mais.

O NetLogo é baseado num novo paradigma de modelação: o uso de agentes (cf. figura).

  • Um agente é um indivíduo sintético, autónomo, munido de um conjunto de características e regras que governam o seu comportamento e com a capacidade de tomar decisões.
  • Os agentes interagem entre si e com o meio-ambiente obedecendo a um conjunto de regras.
  • Os agentes são flexíveis e têm a capacidade de aprenderem e de adaptarem o seu comportamento baseados na experiência. Tal requer alguma forma de memória. Os agentes podem ainda ter regras para mudar as suas regras de comportamento.

Agentes

O NetLogo vem equipado com três tipos de agentes (cada qual executa a sua actividade, todos em simultâneo) :

  • Turtles são agentes que se movem no mundo. O mundo é bidimensional e está dividido numa grelha de patches.
  • Cada patch é um pedaço quadrado de "terreno" sobre o qual as turtles podem movimentar-se.
  • O observador não tem localização –pode ser imaginado como o Criador que contempla o mundo formado pelas turtles e pelos patches.

Já vimos no capítulo anterior que podemos controlar um modelo em NetLogo por intermédio de botões e interruptores. O NetLogo oferece ainda uma outra forma de controlar os modelos: –o centro de comandos. Este é bastante útil pois permite executar comandos sobre o modelo e alterar os parâmetros deste. Oferece ainda uma forma didáctica de explicar, com exemplos, os comandos principais do NetLogo.

Para nos familiarizarmos com os comandos em NetLogo, vamos construir um aquário virtual com tartarugas e peixinhos.

Para tal precisamos de iniciar o NetLogo. Logo que iniciamos o NetLogo somos presenteados com um modelo vazio, que podemos modificar a nosso belo prazer, cf. figura da esquerda. O NetLogo vem também equipado com uma excelente biblioteca contendo vários modelos, os quais podem ser acedidos em Files > Models Library, cf. figura da direita, mas por ora vamo-nos cingir à construção do nosso aquário virtual.

As turtles e os patches são controlados usando respectivamente os seguintes comandos:
  • ask turtles [ comandos ]
  • ask patches [ comandos ].

Começamos por representar a água dando a cor azul aos patches. Para tal digitamos o comando ask patches [set pcolor blue] no centro de comandos e carregamos em enter.

Para dar cor às turtles usa-se o comando ask turtles [ set color cor ].

As cores podem ser especificadas quer através do nome, quer através de um número conforme a tabela seguinte:

Tanto o observer (observador), como as turtles, como os patches podem criar novas turtles. Os comandos são respectivamente:
  • crt n (o qual é a abreviação de create-turtles n). Este comando cria n turtles todas localizadas na origem.
  • ask turtles [ hatch n [ comandos ] ]. Cada turtle gera n novas turtles idênticas à progenitora e na mesma posição desta (xcor,ycor) e cada cria executa os comandos.
  • ask patches [ sprout n [ comandos ] ]. De cada patch "brotam" n turtles localizadas nas coordenadas (inteiras) do patch (pxcor,pyxor) e cada turtle executa os comandos.

Coloquemos então 10 tartarugas no aquário. Para tal digitamos o comando crt 10 no centro de comandos e carregamos em enter.

Inicialmente as tartarugas estão todas empilhadas na origem, mas já as vamos mover para as suas posições finais.

Em NetLogo além da posição (xcor,ycor) as tartarugas têm também uma orientação (heading) medida em graus a partir do eixo dos y (cf. figura da direita). A atribuição dos valores a cada uma destas variáveis é feita com os seguintes comandos:
  • set heading θ, onde θ é um número real entre 0 e 360.
  • setxy x y, onde (x,y) é um ponto dentro da janela gráfica.
  • set xcor x, onde x é um número real dentro da janela gráfica.
  • set ycor y, onde y é um número real dentro da janela gráfica.
Para alterar estas variáveis podemos usar os seguintes comandos:
  • fd l ou forward l. A turtle avança l na direcção em que está orientada.
  • lt θ ou left θ. A turtle roda θ graus para a esquerda.
  • rt θ ou right θ. A turtle roda θ graus para a direita.

De seguida ordenamos às tartarugas para avançar 10 passos com o seguinte comando:

Variáveis

Vimos já alguns exemplos de variáveis que estão predefinidas no NetLogo, por exemplo pcolor no caso dos patches e xcor, ycor, heading e color no caso das turtles. Podemos igualmente criar as nossas próprias variáveis. Estas podem ser globais, quando representam uma propriedade global do sistema (o número de gerações por exemplo), ou podem ser variáveis que só pertencem aos patches e que são usadas para representar atributos ou memória de cada um destes (a altitude ou há quanto tempo um bairro residencial é chique por exemplo), ou podem ser variáveis que só pertencem às turtles e que representam atributos ou memórias de cada uma destas (o sexo ou a posição anterior por exemplo).

Em NetLogo existem quatro tipos de variáveis. Os exemplos seguintes mostram os comandos usados para as definir:
  • patches-own [ altitude popularidade ]. Variáveis intrínsecas a cada patch.
  • turtles-own [ sexo posicao-anterior ]. Variáveis intrínsecas a cada turtle.
  • globals [ geracao ]. Variáveis globais.
  • locals [ auxiliar1 auxiliar2 ]. Variáveis temporárias definidas dentro de rotinas ou funções. (Explicá-las-emos mais tarde).

Estes comandos só funcionam na tab Procedures, que é o local onde escrevemos o código dos modelos. A escrita do código neste local tem a vantagem dos comandos poderem ser editados / corrigidos mais tarde e do código poder ser salvo para utilização posterior. Se tentar usar estes comandos no centro de comandos obterá uma mensagem de erro. Como exemplo de aplicação vamos dar sexo às tartarugas digitando o comando turtles-own [ sexo ] na tab Procedures e digitando o comando ask turtles [ set sexo (random 2) ] no centro de comandos para dar valores (0 ou 1) à variável sexo. random n é uma função que dá um número aleatório entre 0 e n - 1.

O NetLogo vem munido de uma extensa colecção de funções que pode consultar no Manual. Vejamos algumas das mais usadas:
  • count turtles. Conta o número de tartarugas.
  • random n. Fornece um número aleatório inteiro entre 0 e n - 1.
  • random-float x. Fornece um número aleatório real entre 0 e menor que x.
  • random-xcor, random-ycor. Fornecem números reais aleatórios para as coordenadas x e y, respectivamente, dentro do mundo (janela gráfica).

Também podemos construir as nossas próprias funções. Veremos mais tarde como fazê-lo.

Conjuntos de agentes

Vamos agora usar o sexo das tartarugas para alterar a aparência visual destas. Uma forma de fazê-lo consiste em dividir as turtles pelo valor da variável sexo. Podemos fazê-lo digitando o comando ask turtles with [ sexo = 0 ][ set color pink] e carregando em enter.

O que o comando anterior está a fazer é executar uma acção no conjunto das tartarugas que têm uma certa propriedade.

O NetLogo fornece uma forma poderosa de aplicar selectivamente comandos a um conjunto de agentes que verifiquem uma certa propriedade através do comando ask conjunto-de-agentes [ comandos ]. Exemplos das principais formas de construir conjunto-de-agentes:
  • turtles with [ sexo = 1 ]. Tartarugas de sexo = 1.
  • turtles with [ xcor > 0 ]. Tartarugas no lado direito do mundo.
  • patches with [ pycor > 0 ]. Patches do "hemisfério" norte.
  • turtles-here. Todas as tartarugas num certo patch que estão a ser "chamadas" por uma tartaruga ou patch dentro de um comando ask conjunto-de-agentes [ comandos ].
    Por exemplo a regra:
    as tartarugas infectadas (cor vermelha) infectam as outras que estejam no mesmo patch
    seria traduzida pelo comando:
    ask turtles with [ color = red ][ ask turtles-here [set color red] ].
  • other-turtles-here. Similar a turtles-here, mas neste caso o conjunto-de-agentes tem de ser um subconjunto das tartarugas e other-turtles-here não contém a tartaruga que as "chamou".

Estruturas de controlo

Mudemos também a aparência das tartarugas de sexo = 1. Neste caso vamos usar estruturas de controlo (a tradução em NetLogo do se e do enquanto da linguagem corrente) para ilustrar o seu uso. Para tal digitamos o comando ask turtles [ if (sexo = 1) [ set color sky ] ] no centro de comandos e carregamos em enter:

As estruturas de controlo fornecem a outra forma de executar selectivamente acções em NetLogo:
  • if condicao [ comandos ]. Se a condicao for verdadeira executa os comandos.
    Exemplo: if (sexo = 1) [ set color sky ].
  • ifelse condicao [ comandos1 ][ comandos2 ]. Se a condicao for verdadeira executa comandos1, caso contrário executa comandos2.
    Exemplo: ifelse (sexo = 0) [ set color pink ][ set color sky ].
  • while [ condicao ][ comandos ]. Enquanto a condicao for verdadeira executa comandos.
    Exemplo: ask turtles [ while [ ycor < 0 ][ set ycor (ycor + 1) ] ] (as tartarugas imigram para o hemisfério norte).
O NetLogo permite ainda o uso de operações lógicas para construir estruturas de controlo mais sofisticadas. As três operações mais comuns são o and (e), o or (ou) e o not (não) para combinar várias condições. Exemplos do que condicao pode ser:
  • condicao1 and condicao2 and condicao3,
  • condicao1 or condicao2 or condicao3,
  • not condicao.

Espécies

No NetLogo não estamos limitados ao uso de uma espécie (as turtles), podemos criar tantas quantas quisermos, cada uma com os seus próprios atributos e comportamentos. Desta forma podemos imitar ecossistemas compostos por várias espécies (coelhos, raposas e relva, por exemplo) ou economias sofisticadas formadas por produtores, consumidores, polícias, políticos e ladrões, por exemplo.

Em Netlogo as espécies são criadas escrevendo o comando breed [ especie ] no topo da tab Procedures. Por exemplo para criarmos duas espécies (tartarugas e peixes) usaríamos os comandos breed [ tartarugas ] breed [ peixes ].

Uma vez criadas, todas as novas espécies têm comandos equivalentes aos das turtles, os quais são criados automaticamente pelo NetLogo. Para usá-los basta substituir a palavra turtles, nos comandos onde esta aparece, pelo nome da especie. Exemplos:
  • create-turtles n
  • ask turtles [ comandos ]
  • ask turtles [ hatch n [ comandos ] ]
  • count turtles
  • ask turtles with [ condicao ][ comandos ]
  • turtles-here
  • other-turtles-here
  • create-tartarugas n
  • ask tartarugas [ comandos ]
  • ask tartarugas [ hatch n [ comandos ] ]
  • count tartarugas
  • ask tartarugas with [ condicao ][ comandos ]
  • tartarugas-here
  • other-tartarugas-here
Em NetLogo os indivíduos de uma espécie podem mudar de espécie. Por exemplo um peão não tem de permanecer um peão o resto da vida, pode ser promovido a rainha:
  • ask random-one-of peoes [ set breed rainhas ].

O NetLogo fornece também uma maneira de dar formas diferentes às tartarugas para que possamos distinguir as diferentes espécies.

A figura da esquerda mostra as principais formas fornecidas pelo NetoLogo. Estas formas, assim como o respectivo nome, podem ser acedidas na tab Tools > Shapes Editor, cf. figura da direita. Se na janela Shapes editor carregar no botão Import from Library, obterá ainda mais formas possíveis. Para alterar a forma das turtles usamos o comando ask turtles [ set shape nome-da-forma ].

Conhecemos agora todos os comandos que precisamos para criar um aquário com tartarugas e peixinhos. Para tal precisamos de escrever os comandos

breed [ tartarugas ] breed [ peixes ]
tartarugas-own [ sexo ]

na tab Procedures e os seguintes comandos no centro de comandos:

Rotinas e funções

O NetLogo também permite a construção dos nossos próprios comandos. A utilização mais comum é a de agrupar comandos NetLogo em unidades lógicas para facilitar a leitura do código. As rotinas são uma das formas de o fazer e são definidas da seguinte forma.

to nome-da-lista-de-comandos [parametro1 parametro2 ... parametron]
    locals [local1 local2 ...] <- Comando a utilizar, se existirem variáveis locais.
    comando1
    comando2
    comando3
    ...
end

Para se chamar a rotina, usa-se o comando nome-da-lista-comandos parametro1 parametro2 ... parametron. Na próxima secção veremos vários exemplos do uso de rotinas.

As funções são a outra forma de agrupar comandos em NetLogo. A diferença é que as funções fornecem um valor. Exemplo de uma função:

to-report quadrado [ x ]
    report x*x
end

a qual é chamada com o seguinte comando quadrado x.