1. Introducere
StarLogo este un mediu de simulare programabil, utilizat in cercetarea comportamentelor sistemelor “descentralizate”, fara control centralizat. Exemple de asemenea sisteme sunt stolurile de pasari, aglomerari in trafic, moleculele dintr-un gaz sau coloniile de insecte. StarLogo este o extensie a limbajului de programare Logo. O versiune obisnuita de Logo permite sa creezi grafice sau animatii pe ecran, trimitind comenzi unei broscute. StarLogo extinde aceasta idee, permitind sa comanzi mii de broscute simultan, astfel dand posibilitatea crearii unei lumi virtuale.
Elementele principale in Starlogo sunt:
- Broscutele – O broscuta poate reprezenta insa orice, de la o molecula dintr-un gaz, o masina prinsa intr-un ambuteiaj, un anticorp intr-un sistem imunitar, orice. Orice broscuta are o pozitie, o directie, o culoare si un creion cu care pot desena.
- Insulitele – O insulita este o parte din mediu in care broscutele traiesc. Dar insulitele nu sunt neaparat elemente pasive. Nu… Ele pot executa comenzi StarLogo si interactiona cu broscutele. Dispunerea lor este de tip grila, si de fapt reprezinta o suprafata pe care se deplaseaza broscutele.
- Observatorul – Acesta are o viziune de ansamblu asupra broscutelor si insulitelor. Poate genera broscute noi si monitoriza activitatea broscutelor si insulitelor existente.
2. Tema proiectului
Pentru a exemplifica principalele structuri de control a broscutelor in StarLogo am decis simularea unei “lumi descentralizate”, plecind de la ideea de a genera efectul ce il are impactul unui obiect dur (o piatra) cu o fereastra.
3. Implementare
3.1 Algoritm
Pentru simularea spargerii unui geam, algoritmul ales este unul simplu, accentul punindu-se nu pe rezultate cit mai apropiate de realitate, ci pe comanda efectiva a borscutelor si pe interactiunea dintre mediul virtual si operatorul uman. Elementul pincipal atunci cind se doreste reprezentarea unui geam spart este o fisura. Putem folosi o broscuta care stie “sa scrie” (pen-down activ) si cerind broscutei sa se deplaseze dintr-un punct intr-altul, aceasta lasa desenata traiectoria ce o urmeaza, creind astfel o “fisura”.
Initial toate broscutele se afla in locul impactului obiectului dur cu geamul. Observatie: * directia de inaintare a fiecarei broscute este “inclinata” fata de directia broscutei dinainte (StarLogo face asta implicit) incit comanda de deplasare inainte (fd 10 de exemplu), face ca toate borscutele sa se pozitioneze pe un cerc cu raza de 10. * toate borscutele creeate initial de Observer se afla in punctul (0,0) in centrul ecranului. Ele trebuiesc mutate in punctul de impact, odata ce acesta este stabilit (utilizatorul apasa butonul “Set Impact Location” si face click in fereastra StarLogo)
- Ulterior broscutele se vor deplasa radial fata de acest loc (avind creionul activat, desenind astfel o fisura)
- La finalul deplasarii, fiecare broscuta va muri, nu inainte de a creea o alta broscuta identica ei, cu o traiectorie “asemanatoare”. Cu cit se indeparteaza mai mult de locul impactului, scad sansele ca broscuta sa mai poata creea o broscuta noua, fisurile termindindu-se daca distanta e prea mare fata de locul impactului. La finalizarea algoritmului, pe ecran va apare desenat geamul spart.
3.2 Prezentarea aplicatiei
In fereastra StarLogo, utilizatorul face click initial pe butonul “Set Impact Location” punctind apoi cu mouse-ul locul dorit al impactului. Rezultatul obtinut este ceva asemanator figurii de mai jos:
Parametrii de configurare (slide-urile) semnifica urmatoarele:
- Dist – lungimea minima pe care trebuie s-o aiba o fisura. Lungimea maxima este lungimea minima plus patru. De fapt, in lumea descentralizata, dist reprezinta distanta minima pe care se poate deplasa o broscuta.
- Angle – unghiul cu care variaza traiectoria unei fisuri, fata de traiectoria ce a avut-o fisura dinnainte.
- Depth – numarul de etape in care are loc spargerea. Reprezinta numarul maxim de generatii posbile pentru broscute. Fiecare broscuta genereaza o fisura, apoi creeaza “eventual” (daca nu e prea indepartata de locul impactului) o broscuta noua, care la rindul ei va desena o noua fisura (o noua etapa in spargere). Adica numarul maxim de etape de spargere este limitat de numarul maxim de generatii de broscute.
- Variation – amplitudinea maxima cu care poate oscila directia de deplasare a unei broscute nou create fata de directia de deplasare a celeilalte vechi. Se genereaza un numar aleator, cuprins intre 0 si Variation – 1, acest numar este adaugat la Angle, obtinindu-se apoi deviatia traiectoriei broscutei noi, fata de traiectoria broscutei vechi.
- Max Break Distance – distanta maxima fata de locul de impact in care mai pot aparea fisuri. Daca o broscuta e prea indepartata de locul de impact ( adica distanta intre broscuta si locul de impact > Max Break Distance) atunci broscuta moare, fara a mai genera o broscuta noua (si astfel o fisura noua).
Efectul diversilor parametrii de configurare asupra imaginii geamului spart:
Exemplul 1 – “Variation” mic, fisurile sunt “aproape” in prelungirea fisurilor de la pasul anterior.
Exemplul 2 – Max Break Distance mare, fisuri lungi, caci sunt generate fisuri, chiar daca locul acestora e indepartat de locul de impact.
3.3 Implementare
Observerul este responsabil de interactiunea utilizatorului cu lumea virtuala. Aplicatia porneste in momentul apasarii butonului “Set Impact Location”, care de fapt apeleaza procedura “setup” a Observerului.
Observerul creeaza un numar de 30 de borscute, care initial sunt plasate in punctul din centrul ecranului, punctul de coordonate (0,0); Dupa aceea, se apeleaza functia “waitmouse” care asteapta ca utilizatorul sa faca click stinga al mouse-ului, coordonatele mouseului in acel moment insemnind locul impactului. Broscutele sunt apoi mutate in locul impactului, li se cere sa activeze creionul (“pd”) si sa deseneze cu culoare verde (“setc green”) traiectoria pe care o urmeaza. Initial ele vor porni pe o directie radiala aleatoare de 360 grade (“set heading seth (random 360)”).
Pentru a downloada fisierul sursa al proiectului folositi linkurile din josul paginii. Acum sunt prezentate pe scurt, extrase comentate din codurile sursa atat pentru Observer cat si pentru Broscute.
Observer – cod sursa comentat. Comentariile nu fac parte din codul sursa efectiv, ele sunt trecute aici pentru lamuriri suplimentare.
/* Declaratii globale de variabile. Accesibile atit observerului, cit si broscutelor si insulitelor. Se pot defini si una linga alta, cu spatiu intre ele */ globals [X-coord] globals [Y-coord] globals [max_break_distance] /* functia de wait mouse. Atita timp cit mouse-ul nu este apasat, functia se reapeleaza. In momentul in care mouse-ul este apasat, se inregistreaza coordonatele acestuia, ele avind acum semnificatia de "locul de impact" */ to waitmouse ifelse mouse-down? [ setX-coord mouse-xcor setY-coord mouse-ycor ] [ waitmouse ] end /* procedura de setup. */ to setup /* ca - Kills all turtles and turns all patches black (clear all) crt 30 - create 30 turtles */ ca crt 30 waitmouse /* toturor broscutelor li se solicita */ ask-turtles [ /* broastele sunt mutate in locul de impact, au creionul activat, si vor scrie cu verde */ setxy X-coord Y-coord setc green pd /* se seteaza numarul maxim de generatii */ setcurrent-depth depth /* initial vor proni radial (random Value) intoarce un numar aleator intre 0 si Value - 1 inclusiv */ seth (random 361) /* apel catre procedura de generare a fisurilor */ glassbr_all ] end
Broscute – cod sursa. Comentariile nu fac parte din codul sursa efectiv, ele sunt trecute aici pentru lamuriri suplimentare.
/* se defineste variabila current-depth, pentru testoase */ turtles-own [current-depth] /* procedura glassbr_all e apelata de observer dupa ce broastele sunt mutate in locul de impact. Procedura este apelata pentru fiecare broscuta, variabila current_depth fiind definita pentru fiecare broscuta in parte. */ to glassbr_all /* s-a imbatrinit cu o generatie */ setcurrent-depth current-depth - 1 /* forward - fd, se cere broscutei sa inainteze pe o distanta minima - acum se deseneaza fisura efectiva din cauza ca borscuta are activat creionul */ fd dist + (random 4) /* daca broscuta e inca aprope de locul de impact, atunci genereaza o broscuta noua, pe o directie "asemanatoare" cu a ei, dupa care reapeleaza functia pentru generarea urmatoarei fisuri. Daca e prea indepartata de origine (locul impactului), atunci borscuta moare - nu mai apar alte fisuri */ if (distance X-coord Y-coord) < (20 + random max_break_distance) [ hatch [rt angle + (random variation) - ((random variation) / 2) glassbr_all ] ] die end
4. Concluzii
Programul este un program simplu insa functional, care evidentiaza conceptele de baza ale modelarii in StarLogo. Algoritmul de desenare al fisurilor poate fi imbunatatit, astfel incit desenele generate sa para cit mai reale, si poate de exemplu sa fie simulate impacte cu obiecte de diferite greutati cu sticle de diferite grosimi. Pentru obtinerea unei acurateti sporite, si un efect vizual imbunatatit, s-a testat desenarea graficului cu insulite de dimensiune 1 pixel x 1 pixel, pe o suprafata de 400x400 insulite. Memoria necesara lui StarLogo pentru a desena o asemenea lume virtuala este de 100Mb (StarLogo versiunea 1.2.2, testat in Windows 2000 Proff. Ed. ). Deoarece raspunsul mediului de simulare era foarte lent, s-au ales dimensiuni de 2 pixeli x 2 pixeli pentru fiecare insulita, pe suprafata de 200x200 insulite. Memoria necesara a scazut la 42Mb, observindu-se insa o crestere semnificativa a timpului de raspuns (desenari, apasari de butoane, etc..).
Datorita posibilitatii de a controla foarte multe broscute simultan, precum si capacitatii de a comanda fiecare insulita in parte (broscutele "simtind" insulitele pe care se afla, si astfel descurcindu-se in lumea virtuala), StarLogo este recomandat studentilor interesati in studierea sistemelor descentralizate precum si celor pasionati de studiul Inteligentei Artificiale.
5. Informatii suplimentare
Pagina oficiala Starlogo este http://education.mit.edu/starlogo/
Fisierul glassbreak.slogo - (129Kb, pentru starlogo 2.1, 2.0)
Fisierul glassbreak.slogo - (129Kb, pentru starlogo 1.2.2)
Leave a Reply