Acum după ce ne-am familiarizat puţin cu felul în care funcţionează NetLogo haideţi să construim propriul nostru model.
Acest model are in vedere o singura „furnică” care se mişcă la întâmplare.
Pornim NetLogo. Voi face click pe iconiţa programului, versiunea 5.0.3. Voi puteţi folosi versiunea pe care o aveţi instalată.
Voi crea butoanele de (Setup) şi (Go). Mă duc la meniul pentru butoane.
Acesta este meniul care permite construcţia interfeței. Dacă fac click pe el puteţi vedea toate obiectele pe care le pot adăuga la interfaţă.
Adăugăm un buton. Fac click pe interfaţă iar in fereastra pot sa completez ca acest buton este de (Setup).
Apoi adaug un al doilea buton pentru (Go).
Acum pot să selectez un buton cu click dreapta şi in meniu facem click pe (select) iar acum putem să-l mutăm.
Putem să îi modificăm mărimea dacă tragem cu mouse-ul de el etc. Putem modifica butonul după dorinţă.
Acum avem ambele butoane de (Setup) şi de (Go) dar sunt roşii pentru că nu au nici un limbaj în spate care să le spună ce să facă.
Nu fac nimic încă atunci când facem click pe ele. Deci trebuie să scriu comenzile.
Acum creăm codul de comandă care va fi asociat cu butoanele (Setup) şi (Go). Ne ducem la Tab-ul (Code) şi în fereastră scriem comenzile.
Primele comenzi sunt pentru “Setup" (to setup). Când facem click pe buton dorim să ştergem tot (clear-all).
Prin a şterge ne referim la a şterge întreaga “lume virtuală”, adică locul unde vedem “furnicile” sau orice alt fel de agenţi care întreprind acţiuni.
Comanda “curăţă” acea fereastră şi şterge şi tot cea ce a mai rămas după o rulare prealabilă a modelului.
Vom reseta timpul la zero (reset-ticks).
Acum vom crea o “furnică”. Trebuie să ştiţi că orice agent în NetLogo este cunoscut sub numele de “turtle” din motive istorice.
În limbajul original “Logo” pe care se bazează NetLogo toţi agenţii erau denumiţi “turtles”.
În Logo aveai la dispoziție doar o “turtle”. Aici o să avem mai multe “turtles” dar până una alta vom crea o singură “turtle” (create-turtles 1).
După care îi spunem ce să facă (ask turtle).
Îi dăm o listă de lucruri pe care să le facă - lista incepe cu paranteza [.
Îi setăm forma ca “insectă” ceea ce face ca agentul nostru să preia forma unei “furnici” (set shape "bug").
Îi setăm mărimea la 3 ca să o putem vedea (set size 3).
Setăm culoarea “roşie” (set color red). Cam asta vrem să facă acest agent şi încheiem lista (end).
Există un buton de verificare (Check) în meniu care verifică dacă codul scris de noi are erori. Facem click pe el şi programul îmi spune că am o eroare.
Îmi spune şi unde este eroare. Şi observ că am uitat să adaug pluralul pentru agenţi (ask turtles).
NetLogo presupune că întotdeauna există o “populaţie” de agenţi şi atunci când vrei ca agenţii să facă ceva ceri ca acţiunea să fie făcută de întreaga “populaţie”.
Deci pentru acest experiment vom dori ca “toţi” agenţii (adică un singur agent momentan) să facă ce am spus noi în limbaj şi adăugăm pluralul pentru agenţi.
Apăsăm din nou pe butonul de verificare care mă aduce din nou la interfaţă ceea ce îmi spune că totul ar trebui să funcţioneze.
Facem click pe (Setup) şi iată furnica noastră chiar pe mijloc.
Butonul (Go) este încă roşu ceea ce înseamnă că încă nu am scris comenzile pentru el.
Acum scriem codul pentru (Go). Ne ducem înapoi în fereastra de limbaj. Şi vom scrie cerinţele pentru “turtles” care să fie îndeplinite de butonul “Go” (to go).
Le cerem (ask turtles) să se întoarcă la dreapta 30 de grade (right 30). Apoi să înainteze patru paşi (forward 4).
Creştem unităţile de timp cu 1. Acest lucru îl face comanda (tick). Amintiţi-vă că la început am setat timpul la 0.
Apoi acţionăm comanda (tick) care avansează timpul cu o unitate de fiecare dată când iniţiem procedura.
Încheiem lista (end). Verificam. Totul pare în regulă.
Ne întoarcem la interfaţă. Facem click pe (Go) şi vedem că furnica s-a întors la 30 de grade şi apoi a înaintat 4 paşi.
Şi dacă facem click pe (Go) în continuu vedem că furnica se mişcă în cerc.
Aş vrea să se mişte în continuu fără ca eu să tot fac click pe buton.
Dacă fac click dreapta pe (Go) intru în fereastra de editare şi am opţiunea (forever) pe care o pot selecta.
Iar dacă facem asta înseamnă că programul va repeta acţiunile legate de butonul “Go” în continuu.
Dacă reduc viteza puţin vedeţi că furnica se învârte de una singură. Dacă fac din nou click pe (Go) se opreşte.
Dacă vreau să o pornesc din nou fac din nou click pe (Go) iar ca să o opresc fac din nou click pe (Go).
Dacă vreau să o pornesc de la zero fac click pe (Setup).
Dacă fac click în mod repetat vedem că furnica se plasează întotdeauna în acelaşi loc în fereastră dar îndreptată în direcţii diferite.
Comanda (Setup) plasează "furnica" în centru îndreptată într-o direcţie aleasă în mod aleatoriu.
Acum salvăm modelul. Ne ducem în meniul (File) şi facem click pe (Save As).
Îl salvăm sub numele de “ant1” şi îl vedeţi acum pe desktop.
Dacă mă duc în meniul NetLogo şi închid programul mă pot duce pe desktop fac dublu click pe iconiţa modelului salvat de noi şi NetLogo va porni modelul.
Un singur lucru este în neregulă cu modelul creat de noi: este plictisitor. Tot ce face furnica este să se mişte în cerc.
Haideţi să îl facem mai interesant. Ne ducem în fereastra de limbaj şi la comanda de întoarcere la 30 de grade scriem (right random 30).
Acum "furnica" va alege un număr la întâmplare între 0 şi 30 – 1 şi se va întoarce respectând acel număr.
De fiecare dată va alege alt număr de grade.
Putem face acelaşi lucru cu privire la numărul de paşi (forward random 4) iar furnica va alege un număr între 0 şi 4 -1 ca să meargă înainte.
Să vedem ce se întâmplă acum. Ne întoarcem la interfaţă. Facem click pe „Setup” apoi pe „Go”.
Şi vedeţi că deşi se mişcă în cerc totuşi comportamentul este mai diversificat.
Un alt lucru pe care îl puteţi observa este faptul că furnica pare să treacă prin „pereţi” dintr-o parte în alta.
Adevărul este că lumea virtuală se pliază pe margini. Vă puteţi gândi că lumea arată ca o gogoaşă sau un cilindru.
Peretele, deşi noi îl vedem ca fiind o margine se răsuceşte şi atinge celălalt perete.
Dacă furnica merge şi trece prin peretele de sus poate apărea din nou prin peretele de jos.
Sau daca trece prin peretele din lateral apare din peretele din partea opusă.
Acesta este un comportament ce poate părea puţin straniu.
Ca să remediez fac click dreapta pe „lume”, suprafaţa neagră, şi alegem (edit).
Fereastra care se deschide oferă informaţii despre sistemul de coordonate ale "lumii" şi numărul de unităţi care formează reţeaua în care este împărţită "lumea".
Dar ceea ce este important pentru noi sunt căsuţele marcate (world wraps horizontally şi world wraps vertically).
Le de-selectăm şi aplicăm comanda OK.
Acum, când furnica atinge peretele va rămâne blocată acolo şi nu se va putea mişca până nu se va putea întoarce.
Iar comportamentul furnicii pare mai real.
Deşi furnica se mişcă totuşi nu e foarte reală deoarece tot timpul se întoarce spre dreapta.
Sa scriem o comandă care să îi permită să aleagă în mod aleatoriu dacă se va întoarce la dreapta sau la stânga.
De fiecare dată când se mişcă „alege” dacă vrea să se întoarcă la dreapta sau la stânga.
Pentru a scrie această comandă aplicăm procedura de raportare (to-report coin flip?).
Procedura (report) e diferita de cea (to) pentru ca se bazeaza pe o valoare adevărată sau falsă.
Apoi vom scrie (report random 2 = 0).
Apoi incheiem (end)
Parametrul „aleator” (random) va raporta 0 in jumătate din cazuri şi 1 în cealaltă jumătate din cazuri, la întâmplare.
Dacă comanda raportează 0 atunci parametrul este „adevărat” şi dacă raportează 1 parametrul este "fals".
Valoarea raportată de această procedură va fi adevărată în jumătate din cazuri şi falsă in cealată jumătate la întâmplare.
Putem folosi acest lucru mai sus (la butonul Go) în cod scriind o excepţie ( ifelse coin-flip? [right random 30] [left random 30] ).
Dacă parametrul dat de comanda de mai jos este „adevărat” furnica se întoarce la dreapta 30 de grade iar dacă parametrul este „fals” atunci furnica se întoarce la stânga.
Deci, de fiecare dată când iniţiem procedura din spatele butonului „Go” limbajul va decide la întâmplare dacă furnica se întoarce la dreapta sau la stânga.
Hai să vedem cum merge. Facem click pe „Go” şi vedem că furnica se întoarce în direcţii diferite.
Rămâne blocată dar se întoarce când spre dreapta când spre stânga.
Singura noastră problemă este că rămâne blocată de prea multe ori.
Putem remedia acest lucru schimbând unghiul de întoarcere de la 30 de grade la 60 de grade.
Pentru ca furnica să aibă o amplitudine de întoarcere mai mare.
Pornim modelul din nou şi vedem că, într-adevăr, furnica se blochează mai rar când se loveşte de pereţi. Şi pare mai reală.
De câte ori scrieţi un program este întotdeauna o idee bună să adăugaţi comentarii. Ne întoarcem la ferastra "Code".
Un comentariu este un text pe care îl scrieţi dar care este ignorat de calculator dar poate fi de folos utilizatorilor care îl citesc.
În NetLogo un text care este scris după punct şi virgulă va fi ignorat de calculator.
Deci scriem ce face comanda pe care am scris-o, adică raportează „adevărat” sau „fals” în mod aleatoriu.
Apoi scriem ce face comanda de mai sus care determină direcţia de întoarcere (la dreapta sau la stânga).
Acum avem două „note” fie pentru noi înşine, fie pentru alte persoane care vor citi programul în legătură cu ce fac cele două comenzi scrise de noi.
Aceste note sunt de foarte mare ajutor atunci când scrieţi un program mai complicat mai ales dacă reveniţi la el după câteva zile.
Notele sunt absolut necesare chiar dacă nimeni în afară de voi nu citeşte programul.
Acum putem să salvăm modelul. Dar mai întâi îl etichetăm. Ne ducem în meniul interfeței.
Alegem (Note) şi introducem un text în câmpul apărut – numele modelului: ant1.
Facem textul mai mare.
Selectăm butoanele şi le mutăm mai jos. Le centrăm ca să arate mai frumos. Am terminat şi salvăm. Închidem NetLogo.
Vreau să vă spun că motivul pentru care vă învăţ despre NetLogo este ca voi să aveţi o idee despre cum funcţionează.
Vom folosi multe simulări generate de NetLogo în acest curs.
Nu vom scrie foarte multe dintre ele dar vreau să ştiţi cam cum funcţionează interfaţa şi cum funcţionează limbajul.
Chiar voi puteţi să faceţi câteva modificări la modele pe care le vom vizualiza.
Şi dacă sunteţi motivaţi sau aveţi cunoştinţe mai aprofundate puteţi să scrieţi voi propriile voastre modele.
Ca temă vreau să implementaţi voi acest model pe care l-am scris eu, folosind aceleaşi comenzi şi să îl faceţi să funcţioneze.
Nu veţi primi note dar este spre binele vostru să vedeţi dacă aţi înţeles ce v-am arătat.
Şi nu ezitaţi să puneţi întrebări pe forum dacă aveţi nelămuriri.