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