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!