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.