Zbudujmy teraz drugi model na bazie pierwszego Pierwszą rzeczą jest skopiowanie pierwszego modelu 'Ant1.nlogo' Mogę to zrobić tutaj prawym klawiszem myszki, komendą 'skopiuj'. Następnie wykonuję komendę 'V', lub control 'V' Albo komendę, która w waszym systemie umożliwia kopiowanie plików Zróbmy kopię chcę też zmienić nazwę na 'Ant2.nlogo' Klikamy dwa razy prawym klawiszem otwieramy plik Teraz zmienimy etykietę w pliku przez kliknięcie prawym klawiszem na tej etykiecie wybierając 'Edit' i zmieniając nazwę na 'Ant2' Teraz, skoro mamy mrówkę poruszającą się losowo, dajmy jej coś do jedzenia Przechodzimy do kodu I przygotujemy jakiś pokarm dla mrówki więc w procedurze Setup napiszemy 'grow food' (wyhoduj jedzenie) Ok, ale teraz musimy wskazać systemowi jak to zrobić Przechodzimy więc na dół i tworzymy nową procedurę 'to grow food' (wyhoduj jedzenie) i to co ona będzie robić to: 'ustaw kolor pola na zielony' end (koniec) Pozwólcie mi, że wyjaśnię czym są pola (patches) Przechodzimy z powrotem do interfejsu Widzicie tu nasz świat, którym jest ten czarny obszar Możemy na nim kliknąć prawym klawiszem i wybrać edycję (Edit) Widzimy tu system współrzędnych dla tego świata prawdopodobnie ledwie to widać u was Ale możecie to otworzyć w swoim Netlogo i przyjrzeć się temu Współrzędne (0,0) są w samym środku A zakres współrzędnych to -16 do +16 dla współrzędnych w pionie oraz od -16 do +16 w poziomie A więc cały kwadrat to siatka 33 na 33 pola które właśnie nazywamy 'patches' (pola) Widzimy tu też liczbę pikseli na pole i to jest 13 A więc każde pole ma swoje własne cechy takie jak kolor Wracam teraz do kodu Zapisałam już, ze kolor wszystkich pól ma być zielony Zobaczmy więc co się stanie, gdy wykonam Setup Rzeczywiście, wszystkie pola stały się zielone Możemy więc potraktować to jako pole trawy dla mrówek Przejdźmy znów do kodu i dopiszmy go trochę, tak żeby mrówki jadły trawę żeby to osiągnąć napiszmy tu: jeśli kolor pola jest zielony to znaczy, zapiszmy to w komentarzu jeśli żółw znajduje się na polu zielonym nakazujemy tu żółwiowi sprawdzić kolor swego pola każdy żółw jest zawsze na konkretnym polu I teraz, jeśli pole jest zielone to napiszmy, co ma się teraz wydarzyć Mrówka ma zjeść porcję trawy co oznacza zmianę koloru ponownie na czarny napiszemy 'ustaw pcolor na czarny' Następnie potrzebujemy śledzenia jak dużo trawy zostało zjedzone piszemy więc 'ustaw zjedzony pokarm' na 'zjedzony pokarm' + jeden zrobimy jeszcze jedną, zwyczajową rzecz a jest to ustawienie na ciele mrówki etykiety mówiącej ile pokarmu zjadła mrówka piszemy 'ustaw etykietę zjedzony pokarm' to wszystko są polecenia mówiące, co mają robić żółwie i powinnam napisać ten nawias poniżej, o tu, w tym miejscu uzupełnię też tabulatory, żeby wyglądało to przejrzyście Mam teraz te dwa nawiasy, ten i ten tutaj zaznaczające polecenia wydawane żółwiom Każemy im tu skręcić w prawo lub w lewo przesunąć się do przodu o 4 sprawdzić, czy na polu jest jedzenie jeśli pole jest zielone, to ustawić je na czarne oraz zwiększyć ilość zjedzonego pokarmu o 1 a też "przyodziać" etykietę mówiącą ile pokarmu zjadł dany żółw Ok, została nam do zrobienia jedna rzecz to zdefiniowanie parametru 'zjedzony pokarm' A więc żółwie muszą mieć pewną zmienną która jest z nimi związana, którą nazwiemy 'zjedzony pokarm' możemy sobie wyobrazić, że to ich żołądek który gromadzi zjedzony pokarm w tym modelu zakładamy, że żółwie niczego nie trawią Piszemy więc: żółwie posiadają parametr 'zjedzona żywność' to zdanie ustanawia zmienną zwaną 'zjedzony pokarm' która jest specyficzna dla każdego żółwia każdy żółw ma swoją niezależną zmienną więc każdy żółw będzie miał inną ilość zjedzonego pokarmu tu, w setupie ustawię tą zmienną na zero piszemy: ustaw 'zjedzony pokarm' na zero to żebyśmy byli pewni, że każdy żółw zaczyna od zera i stopniowo akumuluje ilość zjedzonego pokarmu sprawdźmy poprawność kodu - jest ok Wracamy do interfejsu Zwolnijmy model, abyśmy widzieli jak żółwie jedzą pokarm A więc żółw, a raczej mrówka wędruje przez swój świat wędruje sobie losowo i za każdym razem, gdy wchodzi na zielone pole, wyjada z niego pokarm Pamiętajmy, że porusza się krokami o długości od 1 do 3 więc zjada pokarm tylko w polach, na które docelowo przechodzi Widzimy jak sobie wędruje, możemy to trochę przyspieszyć i możemy obserwować wędrówkę mrówki zjadającej pokarm Prawdopodobnie nie widzicie tego u siebie ale mrówka ma etykietę mówiącą ile pokarmu już zjadła To naprawdę dużo jedzenia dla jednej mrówki A więc następną rzeczą jaką zrobimy będzie danie naszej mrówce całej kolonii Dodajmy więc więcej mówek Sposobem na zrobienie tego jest dodanie populacji i pozwólmy użytkownikowi naszego obiektu określać rozmiar populacji Przejdźmy do menu interfejsu i wybierzmy suwak (slider) Umieszczę ten suwak tutaj oraz nazwę związaną z nim zmienną globalną 'populacją' Określmy minimalną populację na 1 a maksymalna niech będzie, powiedzmy 200 Możemy umożliwić użytkownikowi zmieniać ją o 1 A wartością początkową będzie 50 co wydaje się sensowną wartością Użyjmy teraz Zastosuj (Apply) i OK Przesunę jeszcze suwak, wybierz, przesuwamy go tutaj Ale teraz musimy określić kod mówiący co zrobić ze zmienną 'populacja' Przechodzimy więc do zakładki z kodem i zamiast komendy 'utwórz jednego żółwia' napiszę 'utwórz populację żółwi' A więc użytkownik określi liczność populacji żółwi A kod stworzy taką ich liczbę Zobaczmy więc, co się stanie gdy użyjemy Setup Mamy więc teraz 50 naszych mrówek w samym środku Użyjmy teraz Go Widzimy jak mówki poruszają się po świecie zwolnię trochę Wszystkie wykonują te same czynności, ale każda podejmuje losowe decyzje więc widzimy, że każda zachowuje się odrobinę inaczej a jeśli przyspieszymy model widzimy, że zaczyna to przypominać prawdziwe mrówki które poruszają się wyjadając pokarm Spróbujmy zwiększyć ich populację 130 wydaje się dobrą liczbą Teraz mamy prawdziwy tłok Są tak stłoczone, że myślę abyśmy przeszli do kodu i je zmniejszyli Ustalmy ich rozmiar na 1 Zobaczmy, co to zmieni Setup i Go Widzimy, że teraz mrówki są znacznie mniejsze prawdopodobnie nie widzicie ich zbyt dobrze ale teraz zdecydowanie dają więcej miejsca jedna drugiej I znowu zapewne nie widać tego na waszych ekranach ale każda mrówka ma małą etykietę mówiącą ile pokarmu zjadła Co jeszcze chcielibyśmy wiedzieć to ile pokarmu zjadła cała kolonia Chcę więc dodać wykres który będzie pokazywał, ile pokarmu zjada kolonia w czasie żerowania Przechodzimy ponownie do menu interfejsu I wybieramy opcję wykresu Wstawię ten wykres tutaj na dole Teraz będę musiała podać kilka rzeczy odnośnie do tego wykresu Nazwę go 'Całkowity zjedzony pokarm' Nazwijmy oś X: całkowity zjedzony pokarm natomiast oś Y to czas I nazwijmy pisak, kolor pisaka pozostawmy czarny Nadajmy pisakowi nazwę: całkowity zjedzony pokarm to nie ma i tak znaczenia Teraz wpisujemy formułę wykresu tu definiujemy, co chcemy mieć na wykresie To będzie: suma zjedzonego pokarmu przez żółwie Ta procedura zsumuje ilość pokarmu zjedzonego przez każdego żółwia i tą sumę zobrazuje na wykresie w czasie Ok, zastosujmy to Uuupss. Zrobiłam błąd Dałam złe nazwy, pomyliłam oś X i Y To oś X powinna obrazować czas, a oś Y całkowity zjedzony pokarm Zaznaczmy teraz wykres i przesuńmy go zwiększymy też jego wysokość dla lepszej widoczności I zobaczmy jak to działa. Setup i Go Widzimy, że wykres sam dostosowuje skalę Liczba na osi X się zmienia Wykres pokazuje nam z jaką szybkością zjadany jest pokarm Można byłoby teraz spróbować pozmieniać liczebność populacji i sprawdzić, jak to wpływa na tempo zjadania pokarmu Aby zakończyć nasz model umożliwmy jeszcze użytkownikowi regulację innych jego zmiennych A więc, na przykład, utwórzmy suwak który umożliwia użytkownikowi zmianę maksymalnego rozmiaru kroku i maksymalny kąt, o jaki mrówka skręca Zaznaczę teraz nasz wykres i przesunę go by zrobić miejsce na dwa dodatkowe suwaki Wybieramy suwak i mamy teraz zmienną nazwijmy ja: maksymalny rozmiar kroku Niech wartością minimalną będzie 1 a maksymalną 10 Wartość początkową ustalmy na 4 OK, przesuńmy to tutaj Oba suwaki podnieśmy nieco do góry I teraz stworzymy jeszcze jeden suwak który nazwiemy: maksymalny kąt skrętu minimalny kąt ustalmy na 1 stopień A maksymalny 180 stopni Wartość początkową na 60 stopni, tak mamy obecnie w kodzie Zastosujmy to, ok Zaznaczmy ten suwak i przesuńmy go Teraz musimy te zmienne uwzględnić w kodzie A więc w tym miejscu, zamiast wartości 60 wpiszmy 'maksymalny kąt skrętu' i tak samo tutaj: 'maksymalny kąt skrętu' Ok, mamy teraz: w prawo losowo o maksymalny kąt skrętu w lewo losowo o maksymalny kąt skrętu Jeśli uważaliście na to, to mogliście zauważyć że 'random' (losowo) zwraca wartość pomiędzy zerem a maksymalnym kątem skrętu minus 1 A więc będąc ścisłym maksymalny kąt skrętu nie wynosi 180 ale jest o 1 stopień mniejszy Ale nie chcę teraz się tym przejmować I dalej, tu w tym miejscu, robimy to samo Zamiast wartości 4 wstawimy 'maksymalny rozmiar kroku' Nawiasem mówiąc, zdałam sobie sprawę że ten kod jest trudno widoczny dla Was więc wgrałam go na stronę z materiałami do kursu, kod Ant2.nlogo abyście mogli go dla siebie ściągnąć i mu się przyjrzeć I mogli go użyć w waszej pracy domowej A więc teraz sprawdźmy, czy to wszystko działa Zdaje się być w porządku Jeszcze jedna przydatna rzecz, którą winnam Wam powiedzieć o Netlogo to to, że czasami Netlogo potrafi się zaciąć i nawet gdy klikacie Go, to nie pomaga, bo program wykonuje tyle poleceń A więc w Narzędziach mamy tu komendę Halt (Stop) której możecie użyć do zatrzymania programu, która zawsze zadziała To czasami się przydaje, gdy program zawiesza się i nie działa Go Ok, zróbmy eksperyment, zwiększmy maksymalny krok Ustalmy go na 10 i zobaczmy, co się stanie Teraz widać, że duża liczba mrówek zdaje się utykać na krawędziach Możemy bawić się tymi trzema zmiennymi i sprawdzać jak wpływa to na czas zjedzenia całego pokarmu Chcielibyśmy, żeby model się zatrzymywał gdy już całe pożywienie jest zjedzone abyśmy widzieli dokładnie, ile to zajmuje czasu Dołożę więc komendę, która to zrobi przejdę do procedury Go (idź) i dopiszemy tu procedurę zatrzymania Piszemy: jeżeli nie ma pól których kolor jest zielony to znaczy, że wszystkie stały się już czarne wtedy zatrzymaj się (stop) Takiej składni używamy w Netlogo Możemy używać 'not' lub 'any' w odniesieniu do pytania o jakikolwiek atrybut pola Ok, spróbujmy raz jeszcze jak to zadziała Ustawmy jeszcze liczebność populacji na 200 rozmiar kroku na 4 maksymalny kąt skrętu: 60 i zobaczmy jak szybko mrówki zjedzą całość pożywienia Zrobiły to w 105 taktach Zachowajmy teraz nasz model Wybieramy w menu File (plik) i wybieramy opcję Save (zachowaj) I to już koniec naszego drugiego modelu