Wprowadzenie do Złożoności
Praca domowa 1 - Opcja zaawansowana
To jest instrukcja, stanowiąca przegląd
zaawansowanej opcji pracy domowej.
Proszę o otwarcie Netlogo
etykieta multipleants.nlogo
w sekcji materiałów kursu na stronie www
Po otwarciu, interfejs powinien wyglądać
tak jak widzicie na ekranie.
Zrobiliśmy już kilka modyfikacji
w pierwszych dwóch sekcjach pracy domowej
i nie zlikwidowaliśmy ich.
A więc pierwsza rzeczą, jaką zrobię
jest zmian koloru mrówek z powrotem na stałe na czerwony.
Skasuję te dwie linie kodu.
To pozwoli uniknąć zamieszania.
Powróćmy do interfejsu,
W pracy domowej jesteśmy proszeni
o stworzenie szlaku feromonowego, który mrówki
zostawiają za sobą, a inne mogą nim podążać
i odnajdować pokarm.
Aby to przetestować i sprawdzić czy istnieje jakiś szybszy sposób
od obecnej metody, przejdźmy do sekcji kodu.
Po pierwsze, zdefiniujmy pole (patch)
i nazwijmy je feromonem, zróbmy to tu.
Następnie, przewińmy kod do ustawień
ponieważ musimy zdefiniować pola,
by nie tylko mieć gniazdo, ale również by mieć feromon.
Teraz zmienię ustawienia dla gniazda,
żeby zdefiniować pola (patches)
Zadamy polom wstępną wartość feromonu równą zero
Ustawiamy więc feromon na zero
i sprawdźmy to teraz.
Następnie będziemy chcieli,
by mrówki zostawiały za sobą ślad feromonowy
po zjedzeniu pożywienia i by oznaczały drogę powrotną do gniazda.
Następnie chcemy, by inne mówki
szły feromonowym śladem.
Aby to uzyskać, przechodzę na dół
do procedury 'return-to-nest'
i dodam tu linię kodu
by ustawić wartość feromonu dla pola
Ustawiamy wartość feromonu na obecną +1
By zwizualizować poziom feromonu
dla każdej zmiennej
ustawię etykietę zmiennej 'plabel'
by była numeryczną wartością odpowiadającego jej feromonu.
Można też użyć innego koloru
jeśli chcielibyście
ale ja sądzę, że lepsze jest posłużenie się etykietą.
Teraz sprawdźmy to
Zobaczmy, czy to działa.
Wygląda na to, że mrówki zbierają pokarm
znoszą go do gniazda zostawiając
za sobą szlak feromonowy
który narasta numerycznie.
Teraz, chcielibyśmy, by feromony
z czasem odparowywały.
Wracamy do kodu, by to zrobić.
Stwórzmy linię w procedurze 'go'
którą nazwiemy 'evaporate pheromone' (odparuj_feromon)
Teraz napiszmy tą procedurę
Chcielibyśmy, by feromon miał określoną szansę wyparowania
określimy tą szansę
liczbą pomiędzy 0 a 1.
Zdefiniujmy czasową zmienną x,
która będzie losową liczbą zmiennoprzecinkową pomiędzy 0 a 1
Następnie napiszemy instrukcję by pola
z feromonem większym od zera
aby, każde pole z takim feromonem,
jeżeli zmienna x jest mniejsza od
założonego przez nas poziomu prawdopodobieństwa
które będziemy ustawiać suwakiem (slider) ustawianym na interfejsie
i ten suwak nazwiemy
'probability-to-evaporate' (prawdopodobieństwo odparowania)
i ustawiamy wartość feromonu poziom obecny zmniejszony o 1
żeby feromon stopniowo "parował"
Chcemy to zobaczyć, więc ustawiamy 'plabel' na nową wartość
i musimy dodać suwak, o którym wspominałem.
Przechodzimy do interfejsu
do tego przycisku
wybieramy 'Slider' i wstawiamy go tu na chwilę
nazywając go 'probaility-to-evaporate'
(prawdopodobieństwo odparowania)
i będzie to wartość pomiędzy 0 a 1
i będziemy zwiększać go co 0,01
wstępnie ustawiając wartość na 0,1
Zjadłem "e".. Wciskamy OK.
Chcę przesunąć ten suwak,
żeby był pod tym drugim,
więc przesunę to okno w dół
i wyrównam z oknem naszego świata
co zawsze wygląda ładnie,
po czym przeciągnę tu suwak
Zmieńmy jeszcze szerokość jak dla pozostałych suwaków.
Chyba jest OK
Chcę to teraz sprawdzić
Powróćmy do interfejsu i uruchomijmy to.
Poziomy feromonów powinny się zmniejszać
i wygląda na to, że tak się dzieje, więc jest w porządku.
Teraz, ostatnim problemem jest sprawić
by pozostałe mrówki poszły feromonowym śladem,
a więc zajmijmy się tym teraz.
Nawiasem mówiąc, aby wybrać różne okna na interfejsie
wystarczy kliknąć kursorem
na wolnym miejscu i przeciągnąć
przycisk, suwak, lub cokolwiek
można też kliknąć prawym klawiszem myszki po wyborze przycisku
następnie edytować to w różny sposób
Przejdźmy teraz do kodu
zmienimy sposób w jaki mrówki poruszają się w swoim świecie.
Przechodzimy do procedury 'look-for-food'
i dodamy tu trochę kodu
Zdefiniujemy kilka nowych zmiennych
pod 'look-for-food', powiedzmy
że niech feromon z przodu będzie śladem po kątem 0,
za chwilę to wyjaśnię
a niech feromon na prawo będzie śladem pod kątem 45
a feromon na lewo pod kątem -45.
Ten kod jest bardzo podobny
do modelu mrówek w bibliotece modeli Netlogo
więc zasadniczo nakazujemy każdej mrówce
rozglądać się przed sobą oraz nieco po lewej i po prawej stronie
w celu zbadania
czy są w tym miejscu jakies feromony
i jeśli tak jest, to iść tym śladem,
a jeśli nie ma, to powinny poruszać się w losowym kierunku
co sprowadza się do pozostawienia poniższego kodu bez zmian.
Następnie napiszemy serię
zdań warunkowych "jeżeli-to-w-przeciwnym razie"
piszemy "if-else", otwieramy nawias jeśli feromon po prawej jest większy
niż ten na wprost, lub jeśli feromon po lewej
jest większy niż feromon na wprost, zamknąć nawias,
jeżeli feromon po prawej
jest większy niż feromon po lewej, to idziemy na prawo 45 stopni
a jeżeli nie, to 45 stopni w lewo,
a jeśli żadna z tych opcji nie jest prawdą,
wtedy feromon jest z przodu, lub nie ma go w ogóle.
A więc, powiedzmy, jeśli feromon na wprost równa się 0,
wtedy posuwamy się do przodu z tym co pozostało.
Musimy otworzyć nawias
i zamknąć nawias na końcu.
Sprawdźmy to.
Mamy komunikat, że nie ma czegoś takiego
jak 'set-at-angle' (określ kąt),
to prawda, nie zdefiniowaliśmy jesze tego
Przewińmy cały kod do końca.
Dodamy jeszcze 'reporter' (procedurę raportującą)
żeby zaraportować 'set-an-angle',
następnie wprowadzamy kąt,
niech 'p' będzie polem po prawej i na wprost.
To są komendy i procedury (primitives) wbudowane w Netlogo.
Żeby sprawdzić co dana komenda oznacza
można ją zaznaczyć i kliknąć prawym klawiszem myszy
i przejść do QuickHelp,
gdzie znajdziemy wyjaśnienie, co taka wbudowana komenda oznacza.
A więc, po prawej i na wprost.
Uzyjemy już wprowadzonych kątów
oraz odległości na wprost, która również wynosi 1.
Jeżeli 'p' równa się wartości pustej
to znaczy, że nie ma feromonu,
więc raportuj 0
w przeciwnym razie raportuj jaki jest feromon,
raportuj feromon 'p'
Sprawdźmy teraz kod.
Brakuje zamykającego nawiasu w tym miejscu.
Mamy więc komunikat o błędzie.
Wygląda na to, że zapomniałem o tym nawiasie.
Widzę też, że brakuje kilku nawiasów
w tych liniach tutaj.
Dodam co trzeba. Przepraszam za przeoczenie.
Sprawdźmy to teraz.
Wygląda na to, że wszystko działa poprawnie.
Wróćmy do interfejsu.
Wygląda na to, że zachowanie jest OK.
Możemy się nad tym przez chwilę pochylić
i wysnuć bardziej konkretne wnioski,
ale zostawię to już dla Was.
Zauważam, że wiele mrówek
gromadzi się w narożnikach swego świata.
Możemy to naprawić.
Przejdźmy do ustawień (settings)
i kliknijmy "world wraps horizontally" (świat zawija sie poziomo) oraz
"world wraps vertically" (świat zawija się pionowo) i dajemy OK
Teraz wygląda jakby mrówki poruszały się bardzo szybko
i wyjadały wszelką żywność,
przez około 73 taktów, a we wcześniejszym świecie
zanim dodaliśmy feromony
mieliśmy 128 taktów.
To już wszystko co się tyczy pracy domowej nr 1
Mam nadzieję, że się dobrze bawiliście.
Do następnego razu i do zobczenia!