Systemy agentowe na przykładzie Starlogo
Starlogo
W trakcie zajęć będziemy pracować w środowisku Starlogo.
Jeżeli nie jest on zainstalowany, proszę go pobrać ze strony [http://education.mit.edu/starlogo/download/starlogo-2.2/starlogo-2.2.zip].
w przypadku braku środowiska uruchomieniowego Java zainstalowanego w systemie, proszę ściągnąć poniższą wersję:
[http://education.mit.edu/starlogo/download/starlogo-2.2/starlogo-2.2-installer.exe].
Bohaterowie
Środowisko Starlogo zawiera trzy główne typy elementów, które podlegają modyfikacjom.
Są nimi:
- Żółwie (ang. Turtles) Główne stworki zamieszkujące świat Starlogo. Pozwalają na modelowanie praktycznie dowolnych typów obiektów obiektów poruszających się w świecie i wykonujacych działania. Jak choćby mrówki czy samochody w korku ulicznych, albo przeciwciała w systemie immunologicznym. Każdy żółw ma przypisaną: pozycję, położenie, kierunek ruchu, kolor pisaka (ang. pen). Istnieje możliwość ustanawiana własnych właściwości i przypisywania ich żółwiom. Starlogo pozwala na kontrolowanie równoczesnego działania setek żółwi.
- Pola (ang. Patches) Są to fragmenty ziemi w świecie Starlogo. Mają kształt kwadratowych obszarów, które posiadają własny kolor oraz przypisane im przez programistę właściwości. Mogą się po nich poruszać jak tez wykonywać inne operacje zamieszkujące świat Starlogo żółwie. Pola ułożone są w formie przypominającej kratownicę (ang. grid), każde kwadratowy punkt na formatce odpowiada jednemu polu.
- Obserwator. Służy do patrzenia "z góry" na modelowany "świat": np. żółwie umieszczone na kratownicy. Ma również możliwość tworzenia nowych żółwi oraz pół jak i wpływu na ich stan.
Interface użytkownika Starlogo
Interfejs zawiera dwa główne okna:
- StarLogo window
- Control Center window
proszę uruchomić Starlogo przy użyciu pliku: starlogo-windows.bat i zapoznać się z interface-m systemu.
Ćwiczenie 1. Uruchamianie programu
W zakładce Turtle wpiszmy:
fd 10
Następnie proszę wpisać:
rt 10
fd 10
proszę powtórzyć polecenie dwa razt fd 10 zaobserwować zachowanie żółwi przy granicy ekranu.
Kilka przydatnych poleceń:
rt kąt (right) - obrót w prawo np. rt 10 - obrót w prawo o 10 st.
lt kąt (left) - obrót w lewo analogicznie
fd ile (forward) - idź do przodu o "ile" pól.
Aby wyczyścić ekran należy przejść przełączyć się do Observer command i napisać:
clear-turtles
albo równoważne
ct
inne istotne komendy w oknie obserwatora:
clear-graphics, która czyści stan pól na czarne, pozostawiając żółwie w dotychczasowym stanie i clear-all, która czyści całą formatkę.
clear-graphics
clear-all
obie te komendy mają skrótowe odpowiedniki
cg
ca
Aby na nowo utworzyć żółwie na ekranie, proszę posłużyć się poleceniem create-turtles albo crt z argumentem liczba żółwi:
crt 280
Ćwiczenie 2. Pętle programu
Polecenie repeat służy do powtarzania określoną ilość razy poleceń w nawiasie:
repeat 36 [fd 2 rt 10]
Powtórzy 36 razy dla każdego żółwia polecenie "na przód o 1" i "w prawo o 10 stopni". Proszę poeksperymentować z innymi wartościami fd a później rt.
Polecenie pd, pendown służy do opuszczenia pisaka żółwia, który od tego momentu zaczyna zostawiać za sobą ślad w kolorze, który aktualnie posiada.
Proszę powtórnie wykonać powyższe polecenie (repeat…) poprzedzając je rozkazem pd.
proszę uzupełnić poniższy kod:
pd repeat [fd rt ]
Aby wyczyścić, to co żółwie po sobie zostawiły, w zakładce obserwatora proszę wpisać polecenie czyszczące stan pół (patrz kilka punktów wyżej).
Ćwiczenie 3. Procedury
Zdefiniujemy teraz procedurę czyszczącą ekran i tworząca żółwie na środku ekranu. Nazwiemy ją setup. Procedura ta definiowana jest w zakładce obserwatora, w następujący sposób:
to setup
...
end
słowo to rozpoczyna procedurę a słowo end kończy ją. Pomiędzy znajduje się ciąg poleceń, które zostaną wykonane, po wywołaniu w linii poleceń setup.
uzupełnijmy powyższy kod używanymi wcześniej poleceniami do czyszczenia okna i tworzenia nowych żółwi (proszę uzupełnić odpowiednie wartości).
to setup
clear-all
crt 280
end
Proszę wywołać tą procedurę poprzez setup <enter> w linii poleceń obserwatora.
Proszę napisać procedurę o nazwie go, w oknie żółwia, która pozwoli jednym poleceniem zapisać przykład z (repeat…) dla żółwia. Proszę uzupełnić poniższy kod:
to go
...
end
Ćwiczenie 4. Przyciski na formatce.
Przypiszemy teraz procedury setup oraz go do przycisków na ekranie.
Proszę wybrać przycisk create or edit a button (niebieski przycisk z palcem w pasku narzędzi pod menu).
Pojawi się okno wpisywania właściwości nowego przycisku. Proszę uzupełnić StarLogo intruction:
setup
zaznaczyć pole wyboru (radiobutton): Observer!!
Możemy modyfikować położenie przycisku na formatce kursorem myszki.
Analogicznie tworzymy przycisk dla polecenia go.
W oknie nowego przycisku wpisujemy
go
upewniamy się, że zaznaczone jest pole: Turtle.
Testujemy poprawność działania obu przycisków.
Modyfikujemy przycisk go, ponownie wybierając przycisk /create or edit a button// i klikając w przycisk go.
Zmienimy go tak, by funkcja gouruchamiała się w nieskończoność. W tym celu zaznaczmy właściwość Forever. Przykład na obrazku poniżej:
Uruchamiamy funkcje go klikając przycisk.
Ćwiczenie 5. Zmienne i suwaki.
Zamiast wpisywania wprost wartości parametrów, można posłużyć się zmiennymi. Są one definiowane jako wyrazy, oprócz słów kluczowych StarLogo.
Dodajmy do formatki suwak, który pozwala zmienia wartość zmiennej w podanym zakresie. Tworzymy go korzystając z przycisku (z zielonym suwakiem ) create or edit slider.
Uzupełniamy nazwę zmiennej Variable: dystans, następnie zakres zmiennej na <1,10> oraz current: 5.
Poniższy obrazek pokazuje przykładowe ułożenie elementów na formatce.
Zmieńmy procedurę go, zastępując wartość liczbowo przy poleceniu fd zmienną dystans.
to go
repeat 36 [fd dystans rt 10]
end
Uruchamiamy procedurę go wciskając przycisk. Możemy w trakcie działania programu zmieniać dynamicznie wartość zmiennej dystans.
Aby zapisać projekt, proszę wybrać polecenie z menu File->Save Project as…
Ćwiczenie 6. Pola
Proszę utworzyć nowy projekt File->New project…
Z poziomu zakładki obserwatora można uruchamiać polecenia dla żółwi oraz pól, przy użyciu poleceń odpowiedni: ask-turtles, ask-patches
np.
ask-turtles [fd 10]
ask-patches [setpc green]
polecenie setpc lub setpatchcolor zmienia kolor pola na ustalony. (np. yellow, green, red, white, sky, magneta…). Można używać również wartości liczbowych z przedziału <0, 140>.
Proszę w zakładce obserwatora zdefiniować procedurę setuporaz przypisać ją do przycisku na formatce. Ma ona:
- czyścić ekran
- tworzy nowe żółwie w ilości podanych przez zmienną ile, obsługiwaną przy pomocy suwaka na formatce
- korzysta polecenia ask-patches, by pokolorować wszystkie pola na żółto
Zmodyfikować, aby kolorowane były nie wszystkie pola, a jedynie wybrana losowo cześć.
Skorzystać z funkcji random.
Ćwiczenie 7. Praktyczne zastosowanie modelowania przykład Mrówki
- M.Resnick Turtles Termites Traffic Jams Explorations
Mrówki potrafią pozostawiać "ślad feromonowy", który jest rozpoznawalny dla innych mrówek. W ten sposób mrówki mogą komunikować się o miejscach, gdzie znajduje się pokarm.
M. Resnick przeprowadził eksperyment z kolonią prawdziwych mrówek:
- zobacz jak zamodelować to doświadczenie przy pomocy StarLogo. Otwórz sample-projects, biology: ants.
- zapoznaj się z innymi przykładami dostępnymi w StarLogo. W podkatalogu:
- sample-projects, np. biology:termits, rabbits. social-systems, np. traffic, physics, np. perfume, i in.
- adventure-projects: np. gaussian, disease, i in.
Zazwyczaj przycisk start albo go uruchamia przykład. A w menu Windows->Info Window znajduje się opis eksperymentu.
Ćwiczenie 8. Automaty komórkowe:
Automaty komórkowe - wikipedia
Gra w życie:
Gra w życie - wikipedia
Gra w życie (Life, The game of life) – jeden z pierwszych i najbardziej znanych przykładów automatu komórkowego, wymyślony w roku 1970 przez brytyjskiego matematyka Johna Conwaya.
http://pl.wikipedia.org/wiki/Automaty_kom%C3%B3rkowe
http://pl.wikipedia.org/wiki/Gra_w_%C5%BCycie
Odpowiedzmy na następujące pytania:
- Jakie są reguły gry w życie?
- Czym jest sąsiedztwo?
- Czym w ogólności charakteryzują się automaty komórkowe?
Jak napisać grę w życie w StarLogo?
Kod programu Gra w życie w Starlogo:
; Gra w zycie
; Stan biezacy kazdego pola przechowujemy w kolorze
; kolor czarny - pole martwe, inny - pole zywe
; Stan w kroku kolejnym przechowujemy w zmiennej alive-next
; wartosc 0 - pole zywe, wartosc 1 - pole martwe
; definicja zmiennej alive-next dla kazdego pola
patches-own [ alive-next ]
; metoda czyszczaca plansze
to setup
ca
end
; kroki gry
to go
next-step ; wyznacz kolejny stan
color-patches ; pokoloruj pola zgodnie z wyznaczonym powyzej stanem
end
to next-step
ask-patches [ ; wykonuj polecenia na wszystkich polach
let [:licznik 0] ; definicja zmiennej lokalnej licznik
; sprawdz stany (kolory) wszystkich 8 sasiadow
; jesli zywy (nie czarny) zwieksz licznik o jeden
if (pc-at -1 -1) != black [set :licznik :licznik + 1]
if (pc-at -1 0) != black [set :licznik :licznik + 1]
if (pc-at -1 1) != black [set :licznik :licznik + 1]
if (pc-at 0 -1) != black [set :licznik :licznik + 1]
if (pc-at 0 1) != black [set :licznik :licznik + 1]
if (pc-at 1 -1) != black [set :licznik :licznik + 1]
if (pc-at 1 0) != black [set :licznik :licznik + 1]
if (pc-at 1 1) != black [set :licznik :licznik + 1]
; Regula Zycia
; Jesli komorka jest martwa (czarna)
; i ma dokladnie 3 zywych sasiadow
; to staje sie zywa
; w przeciwnym razie pozostaje martwa
if pc = black
[ ifelse :licznik = 3
[set alive-next 1]
[set alive-next 0] ]
; Regula Smierci
; Jesli komorka jest zywa (nie czarna)
; i ma 2 lub 3 zywych sasiadow
; to pozostaje zywa
; w przeciwnym razie umiera
if pc != black
[ ifelse (:licznik = 2) or (:licznik = 3)
[set alive-next 1]
[set alive-next 0] ]
]
end
to color-patches
ask-patches [ ; wykonuj polecenia na wszystkich polach
; jesli komorka ma byc martwa
; pokoloruj ja na czarno
; w przeciwnym razie na czerwono
ifelse alive-next = 0
[ setpc black ]
[ setpc red ]
]
end
Plik programu StarLogo do ściągnięcia tutaj.
Przeanalizujmy powyższy kod
Programujemy w modelu "żółw-pole-obserwator". Pola w systemie StarLogo tworzą siatkę i maja stany - automat komórkowy.
Są to stan bieżący i następny, bieżący chcemy widzieć na ekranie, wiec wizualizujemy go określonym kolorem, a stan w następnym kroku chcemy zapamiętać, wiec możemy dodać polom właściwość (np. dodamy mu właściwość <alive-next>, która będzie przechowywać stan w następnym kroku)).
- dodajemy do kazdego pola zmienna alive-next
patches-own [alive-next]
Zatem jak sterować przepływem (zmianą) stanów? Z jakiego poziomu możemy to zrobić?
- kierujemy przepływem stanów z poziomu obserwatora.
- w kodzie StarLogo: metoda next-step, w której sprawdzamy jaki jest stan dla danego pola - pozwala policzyć sąsiadów, zaaplikować reguły gry w życie zmieniając wartość <alive-next>, a drugim krokiem jest przeniesienie tej wartości na kolor - żywych na czerwono, dwie metody next-step, color-patches
- Skoro korzystamy z dwóch kolorów pól, dlatego żółwie nie są potrzebne!!
- metoda "setup" do czyszczenia ekranu
to setup
ca
end
- zapisujemy metodę go,
to go
...
end
która uruchamia te dwie metody (najpierw next-step, potem color-patches)
- metoda "next-step"
to next-step
...
end
oraz
color-patches
- z poziomu obserwatora odpytujemy pola
to next-step
ask-patches [
....
]
end
Potrzebujemy jeszcze obliczyć liczbę żywych sąsiadów:
- zmienna gdzie będziemy to pamiętać to count: deklarowanie zmiennych "let [ … ]" (lokalna zmienna z dwukropkiem)
let [:count 0]
- sprawdzenie koloru sąsiadów:
-
-
-
- sprawdzanie kolorów "pc-at .. .." (funkcja ,która pozwala sprawdzić kolor pola, używa względnych współrzędnych)
-
-
-
-1 1 | 0 1 | 1 1 |
-1 0 | 0 0 | 1 0 |
-1 -1 | 0 -1 | 1 -1 |
pc-at 1 1
- pod warunkiem życia (kolor inny niż czarny) zwiększamy licznik
if (pc-at 1 1) != black [ set :count :count + 1 ]
- to samo dla wszystkich sąsiadów (czyli dla wszystkich par, 8 razy).
- zapisujemy reguły gry w życie
- jeżeli komórka jest martwa i ma 3 sąsiadów to staje się żywa
-
-
-
- warunek "if", "ifelse"
- komórka martwa : kolor czarny (pc = black)
-
-
-
if pc = black
[ ifelse :count = 3 [set alive-next 1] [set alive-next 0] ]
- jeżeli komórka żywa i ma 2, 3 sąsiadów to pozostaje żywa, inaczej umiera
if pc != black
[ifelse (:count = 2) or (:count = 3) [set alive-next 1] [set alive-next 0] ]
i juz! :-)
- teraz musimy jeszcze po sprawdzeniu wszystkich sąsiadów przenieść informacje o stanie z alive-next w kolor pola dopisujemy metode "color-patches", ktora sprawdza stan alive-next i jeśli =1 (komórka żywa) to maluje ją na czerwono a kiedy jest równa 0 to kolorują ją na czarno
to color-patches
ifelse alive-next = 0
[setpc black]
[setpc red]
end
- w pierwszej iteracji, po narysowaniu, wszystkie pola maja
alife-next = 0
- po każdym wywołaniu next-step (które jedynie sprawdza i zapisuje stan pól) należny uruchomić color-patches kolorujące pola zatem utworzyliśmy metodę "go"
- Sprawdźmy działanie tego programu!
Przydatne linki
- Spis poleceń http://education.mit.edu/starlogo/commands.html