Salutare! Sunt John Boward si sunteti la cursul de complexitate
Vom trece in revista cateva solutii pentru setul final de probleme
din cadrul seriei Dinamica, nivelul avansat...
...si o sa ne distram impreuna. Vom construi un model NetLogo de la zero
si veti vedea cum abordez eu scrierea modelelor.
Bineinteles ca exista diferite moduri de lucru,
dar cel mai important atunci cand incepi sa programezi, este sa te joci cu incercarile
si sa nu-ti fie teama sa faci greseli, pentru ca doar asa vei invata,
din o mie de greseli.
Am trecut de multe ori prin aceste modele,
am scris sute si sute de modele si sunt sigur ca voi face greseli
in scrierea acestuia,
dar asta face parte din programare.
La nivelul avansat, vom scrie
un model
care utilizeaza un model "agent-based" de crestere a populatiei.
Modelul nu va fi bazat efectiv pe o ecuatie, ci vom crea mici entitati
care se reproduc si vom vedea daca putem
sa cream un comportament ca cel pe care
il descrie modelul logistic al populatiei.
Deci, vom obtine acest model de comportament,
dar il vom extrage
din comportamentul efectiv al agentilor.
Este interesant din punct de vedere filosofic
faptul ca, desi aceste modele sunt de nivel inferior,
comportamentul colectiv este generat
de proprietatile agentilor si interactiunile dintre acestia.
Sa trecem la treaba! Acesta este Netlogo, ecranul pe care il vedem la pornire.
Este o simpla interfata.
Atunci cand pornesc un model nou,
intotdeauna adaug un buton Setup,
de obicei si un buton Step,
intr-un model de acest gen
si un buton Go.
Evident, aceste butoane apeleaza niste proceduri care inca nu au fost scrise.
De asemenea, am intotdeauna grija
sa aliniez totul si sa las aceeasi spatiere intre toate butoanele.
Este doar o ciudatenie de-a mea, dar eu asa procedez.
De asemenea, etichetez modelele
ca sa imi pot da seama pe viitor
despre ce e vorba.
Acestea sunt operatiunile de baza pe care le fac atunci cand incep un model.
Acum sa incepem. Sa vedem ce vrem sa facem:
vrem sa cream niste agenti si vrem ca acestia sa se reproduca
si vom trasa un grafic, sa vedem daca arata ca acea curba sigmoida.
Deci vom si trasa.
Deci vom termina cu operatiunile de baza
si vom numi acest grafic
"population" ("populatie").
Stim deja ca va fi un grafic
populatie in functie de timp, deci ar fi o idee buna
sa etichetam deja axele,
ca sa nu uitam.
Ok, am terminat cu unele din lucrurile preliminare.
Mai departe, vom face un modul de setup
care creaza niste agenti.
Sa trecem la cod si sa scriem "to setup"
Intotdeauna scriu prima data inceputul si sfarsitul,
pentru ca stiu ca sunt obligatorii.
Stim ca vrem sa cream un anumit numar de agenti inital,
probabil ca vom avea un slider pentru asta,
dar putem sa facem...
Sau hai sa facem chiar acum un slider, ca sa scapam si de asta.
Mergem inapoi in interfata.
Facem un slider si il vom denumi
"initial-population" ("populatie initiala").
Si voi copia asta...
Astfel vom crea
un numar de populatie initiala,
iar apoi avem posibilitatea
de a le atribui acestor entitati noi anumite proprietati.
Hai sa setam culoarea lor sa fie verde.
Setam forma sa fie
sa spunem... cerc
si setam dimensiunea la... sau mai bine sa le lasam asa.
Initial, vor aparea cu dimensiunea 1.
Imediat, vom observa o problema
si vreau sa va arat asta
deoarece
butonul Setup functioneaza acum si va crea implicit 50 de indivizi.
Iar acum,
voi rula Setup si veti observa ca pare sa se fi creat un singur agent,
dar de fapt sunt 27
si sunt toti creati
fix unul peste celalalt.
Pentru a-i face sa se miste,
va trebui sa mergem inainte.
Le spunem fiecaruia sa mearga inainte 10.
Cand rulam Setup, vom vedea ca,
dat fiind faptul ca au o directie aleatorie, s-au indepartat toti spre exterior.
Totusi, asta nu este chiar ceea ce ne dorim, nu?
Arata prea organizat si prea... artificial.
In plus, nu am scapat de cel initial.
Asta imi aduce aminte ca, aproape de fiecare data cand facem un Setup,
trebuie sa incepem cu "clear-all" ("sterge-tot").
Prescurtarea pentru asta este simplu "ca".
"clear-all" va sterge totul.
In loc sa folosim comanda "create",
care este modul cel mai simplu
de a crea o populatie de agenti,
vom folosi altceva, si anume,
vom cere patch-urilor
Si voi cere unui anumit numar de patch-uri "n"
din populatia initiala
deci voi cere fix atator patch-uri
sa faca
"sprout" ("a incolti").
Si evident, odata ce-am decis cui ma adresez, adica patch-urilor
si ce le cer sa faca, adica acest "sprout",
care le spune:
<
fiecare dintre voi trebuie "sa incolteasca"
si apoi sa isi seteze culoarea verde si forma cerc
si sa mearga 10 inainte>>... nu mai avem nevoie de acest "10 inainte".
Hai sa vedem daca functioneaza.
Aproape sigur,
va cere patch-urilor in mod aleator, de fiecare data cand il vom apasa,
va cere in mod aleator unui anumit set de patch-uri...
27 in acest caz, sau acum 80...
Deci acum avem o populatie initiala de patch-uri,
pe care o putem controla prin aceasta simpla linie de cod.
Ok, urmatorul pas
este sa ne gandim: ce vrem sa facem cu acestea?
O sa vrem sa le cerem
acestor agenti, acestor mici puncte verzi...
O sa vrem sa se reproduca.
Trebuie sa fie capabile sa moara,
pentru ca vrem generatii care sa nu se suprapuna.
Deci, sa avem o generatie de parinti care da nastere unei alte generatii, iar generatia de parinti moare.
Asta inseamna ca trebuie sa putem urmari generatiile.
De asemenea, este necesar
sa se disperseze,
ca sa nu ajunga unele peste celelalte.
In plus, ne va fi mai usor sa le urmarim vizual,
daca vor sta fiecare pe patch-ul sau.
Ok. Nu vrem sa avem nici un fel de imperechere.
Am putea face asta, dar ar complica mai mult lucrurile.
Sa vedem cum facem asta. Voi spune ca
ele se vor reproduce la fiecare pas in timp.
Eu voi spune Step, iar ele vor face tot ce trebuie sa faca.
Asadar, acesta e un fel de pseudocod.
Voi spune ca ele trebuie
sa se reproduca,
parintii trebuie sa moara,
iar cele care raman sa se disperseze.
Asta este!
Acestea vor fi numele procedurilor pe care inca nu le-am scris,
dar aceasta procedura Step va apela toate aceste proceduri.
Asadar, sa ne gandim cum ar trebui sa functioneze reproducerea.