Świat Boo

To, co za chwilę zobaczysz, jest kolejnym wcieleniem mojej pracy magisterskiej. Na początku, pozwolisz, trochę słów wprowadzenia. Ponieważ pojawiły się głosy, że to, co tutaj napisałem, jest niezrozumiałe, postaram się to jeszcze lepiej przybliżyć. Przed uruchomieniem koniecznie przeczytaj też opisy do poszczególnych wersji, to pomoże Ci się zorientować w kolejnych problemach, zarówno teoretycznych jak i praktycznych, z którymi się tu borykałem i wyjaśni Ci, dlaczego ostatnia odsłona wygląda tak, a nie inaczej.
Na początku parę uwag technicznych, potem 'o co tu chodzi', a na koniec trochę filozofii.
Aby móc ją oglądać - jest to aplet - musisz mieć przeglądarkę podłączoną do maszyny wirtualnej Javy (JVM Java Virtual Machine). JVM to taki wynalazek, który pozwala uruchamiać kod języka Java na dowolnej platformie (systemie operacyjnym) z gwarancją (dużą) uzyskania tego samego efektu. Jest to niewątpliwą zaletą tego języka, pełna przenaszalność. Aplet natomiast jest to programik uruchamiany w przeglądarce i z jej prawami. Przekłada się to na jego bezpieczeństwo, aplet nie zacznie szperać po Twoim dysku (ale, uwaga, i tu są pewne wyjątki, bo możesz sam mu na to pozwolić), ani nie spustoszy Ci systemu operacyjnego, czego z kolei nie jesteś w stanie stwierdzić uruchamiając jakiś nieznany kod wykonywalny (.exe) ściągnięty z sieci. Aplety Javy działają mniej więcej w ten sposób, że przeglądarka pobiera z serwera pakiet skompilowanych klas Javy i dostarcza go do JVM. Z tego co mi wiadomo może się to odbywać na dwa sposoby: masz Javę zainstalowaną na komputerze (ewentualnie samą JVM), a przeglądarka łączy się z nią za pomocą plugina, albo masz samą JVM bezpośrednio w przeglądarce, ale w wersji okrojonej (do oglądania samych apletów). Następnie JVM wykonuje ten kod i zwraca wyniki do przeglądarki. Jeżeli aplet się nie otwiera, to albo nie masz nigdzie JVM, albo nie masz włączonej odpowiedniej wtyczki (plugin). Pojawi się w tedy tylko czerwony krzyżyk w obszarze graficznym apletu i do widzenia. Z powyższego wynika jeszcze fakt, że to Twój procesor wykonuje ten kod, a nie procesor serwera, z tego powodu ja nie mogę przewidzieć, szybkości wykonywania się apletu, a czasem i nawet kolejności wykonywania pewnych czynności, jeżeli masz np. maszynę dwuprocesorową. Ale to inna bajka. Jeżeli nie wiesz o czym piszę, to pewnie masz jednoprocesorową.
Za cel przyjąłem w niej stworzenie inteligentnej istoty, a konkretnie programistycznej implementacji mechanizmów jej umysłu, która jest na tyle wszechstronna i adaptowalna, że potrafi poruszać się się nie tylko w konkretnym, danym jej z góry świecie, ale w dowolnym świecie, w którym się ją postawi, o ile świat ten spełnia pewne warunki. Jakiż to świat i jakie warunki musi spełniać? Na ile przypomina on świat rzeczywisty? Czy da się przy pomocy tej istoty symulować posunięcia, wybory, których musimy dokonywać na codzień? Świat, który udało mi się zasymulować to plansza nxn, przy czym ograniczyłem ją do 9x9, żeby było coś widać. Znajdują się tam rozmaite byty, od przedmiotów począwszy, a na istotach myślących skończywszy. Od wersji 1.3 jakie sobie wybierzesz spośród dostępnych. Są one w tym świecie przez Ciebie stawiane i robią to, co potrafią, tzn. przedmioty leżą i 'żyją', istoty niemyślące biegają, myślące patrzą, zapamiętują, myślą, oceniają i dopiero wykonują ruch. Wszystkie byty działają niezależnie od siebie w tym sensie, że są niezależnie wykonującymi się podprogramami (tzw. wątkami). Jednym z takich wątków jest też świat, który egzekwuje te ich ruchy modyfikując im 'życie', pozycje, pamięć i 'łudzi ich zmysły' tzn. widzącym przekazuje informacje o bytach w zasiegu ich wzroku. Wszystkie byty, przemieszczając się na jakimś obszarze, są konfrontowane z bytami tam już się znajdującymi i vice versa, jeżeli ktoś lub coś wtargnie na ich obszar doznają tego skutków. Skutek przekłada się na odpowiednią zmianę w ich 'życiu' (to ten pasek pod ikoną). Przykładowo: jeżeli kot wtargnie na pole psa, to się pogryzą i każdy coś na tym straci lub zyska, pytanie tylko kto co i ile. Za pomocą tego wskaźnika można też zasymulować skonsumowanie jakiegoś przedmiotu. Jak odnotować, że pies zjadł szynkę? Ano ustawić w opcjach, że szynka startuje z 50-cioma punktami, nie ma predkości, wzroku, ani mózgu, czyli jest przedmiotem (z tego wynika na przykład, że nie może wtargnąć na niczyje pole), a następnie ustawić, że pies odbiera szynce 50 punktów, a szynka dodaje psu powiedzmy 20. Wówczas jeżeli pies wtargnie na pole zajmowane przez szynkę, to jej 'życie' spadnie do zera, wątek umrze, czyli zakończy się odpowiedni podprogram i zostanie ona usunięta z planszy, a pies się posili jej kosztem. Do określenia takich zależności służy ostatnie okno dialogowe w wersji 1.3. Można sobie to tak oglądać w nieskończoność, ale jest tu akurat określony warunek końca - jeżeli któraś istota myśląca podniesie swój wskaźnik do maksymalnej przewidzianej wartości. I to wszystko.
Zdziwisz się, ile zjawisk można w ten sposób przedstawić, ale to już aspekt filozoficzny tego problemu. U źródeł tego programu znajduje się dosyć ogólny mechanizm podejmowania przez nas decyzji, zaczerpnięty przeze mnie z analogii życia codziennego. Mianowicie każdy z nas zmuszony jest dokonywać wyborów i to w warunkach, kiedy mamy z reguły zbyt ubogą wiedzę, by móc przewidzieć skutki tych posunięć. Krótko mówiąc wszyscy poruszamy się, albo jesteśmy po wielekroć stawiani w światach, których istoty działania nie rozumiemy, albo jeszcze nie znamy. Nasza wiedza na starcie jest zerowa. Reguły poznajemy ucząc się na błędach, doznając na przemian przyjemności i przykrości. Pierwszym naszym kryterium w dokonywaniu wyborów, niekoniecznie sprawdzającym się na dłuższą metę, jest dokonywanie takich posunięć, które pozwalają unikać nieprzyjemności, a potęgować doznania w jakimś sensie dla nas pozytywne, omijamy wrogów, a szukamy istot nastawionych przyjaźnie. Twierdzę, że gro działań ludzkich ma na celu zmaksymalizowanie pewnego wskaźnika sukcesu wyrażanego w walucie, komforcie psychicznym, bezpieczeństwie, wiedzy, św. spokoju czy jaką sobie tam miarę sukcesu jeszcze podstawisz do tego ogólnego modelu. A odbywa się to poprzez błądzenie w gąszczu zdarzeń, pośród innych konkurencyjnych osobników, wrogów lub przyjaciół i eksplorowaniu go z pewną zdobytą w międzyczasie wiedzą. Pytanie tylko, jak to robić. Pytanie czysto egzystencjalne. Wszystko to odbywa się wszak według reguł, którym musimy się podporządkować, świat którego jesteśmy elementami pozwala nam tylko na określone działania i konfrontuje nas ze skutkami naszych czynów. W ten sposób buduje w nas pewien zasób doświadczeń za pośrednictwem naszego ciała, oddziaływujących na niego bodźców. Świat zapełnia naszą pamięć, do której sięgamy, kiedy przychodzi wykonać następny ruch. Musimy jednak dbać, aby wybory były trafne, inaczej świat może nas unicestwić, gdyż nasza wytrzymałość jest ograniczona. Abstrahując od detali można się zastanawiać np. jak głęboko prowadzić rozumowania, czy rozważać dużo możliwości, czy wręcz przeciwnie, działać w sposób odruchowy, reagując tylko na bezpośrednie zagrożenie, chwytać to, co w danej chwili jest w zasięgu ręki. Jest to problem, bo przezorne przemyśliwanie naprzód, choć wydaje się synonimem mądrości, w przypadku zjawisk o dużym udziale losowości, jest w dużej mierze stratą czasu. Tym bardziej są one bezasadne, jeżeli natura zjawiska, reguły gry, nie są nam znane. Albo już zupełnie trywialna kwestia: czy w czasie kiedy będziemy przemyśliwać dwudzieste posunięcie naprzód, ktoś nie wbije nam noża w plecy? Takie mechanizmy są uwzglęnione w zrealizowanym przeze mnie modelu, może się więc zdarzyć sytuacja, kiedy ruch, poprzedzony długim procesem myślowym, nie będzie już adekwatny do sytuacji, sytuacja będzie już inna, niż w momencie kiedy to rozumowanie się zaczęło na skutek jakiegoś bodźca z zewnątrz. Iluż z nas, roztrząsając zbyt długo jakiś problem, spóźniło się z jego realizacją? Kolejnym nasuwającym się pytaniem jest jak kojarzyć ze sobą zapamiętane fakty, czy łączyć je w ciągi logicznych rozumowań, czy może szacować je ilościowo, statystycznie? Ale może mechanizmów myślenia nie będę na razie zdradzał, choć są one w tym algorytmie prostsze, niż myślisz.
Użyłem tu języka obiektowego, który rozgranicza koncepcyjnie kod. Nie jest wielkim problemem zaimplementować algorytm, w którym wszystko jest wymieszane i jednocześnie mamy dostęp do wszelkich informacji. Rzecz w tym, aby wszystko odbywało się odpowiednimi kanałami, z zachowaniem wszelkich rozdzielności, gdyż w życiu byty są rozdzielone, nieświadome siebie nawzajem, tak nam się przynajmniej wydaje. Tutaj zarówno świat, istota, jej umysł są osobnymi obiektami, które mają swoje właściwości (pola) jak i czynności, które można w ich obrębie wykonać (metody). Wszystko jest tu klasą, a poszczególne byty - obiektami tych klas. Jest więc przykładowo klasa 'istota' jako idea w sensie takim jak rozumiał to Arystoteles i jednocześnie obiekt - realnie istniejący byt - jako jej konkretyzacja. Obiekty zawierają się w sobie nawzajem: konkretny świat zamieszkują konkretne istoty, istoty te są z kolei wyposażone w konkretne narządy takie jak umysł, czy wzrok. Podobnie jak umysł należy koncepcyjnie do człowieka, człowiek zaś do świata. Składniki tej gry są więc ściśle od siebie odzielone i rozmawiają ze sobą jedynie poprzez dostępne drogi komunikacji, zmysły, ruchy w świecie rzeczywistym. Przykładowo świat jest uprawniony do kształtowania pamięci istot, o ile ją posiadają, one zaś mogą z niej czerpać, decydując się na jakieś posunięcie. W sensie informatycznym następuje uruchamianie przez jedne obiekty dozwolonych im metod innych obiektów. Oczywiście nie możesz tego zobaczyć, bo nie widzisz kodu tej gry, ale możesz mi wierzyć, że tak to jest zbudowane. Jak już wcześniej wspomniałem, do symulowania niezależności użyłem mechanizmu wątków, który daje też inne pożądane własności. Wątki są programami wykonującymi się niezależnie i w pewien sposób równolegle. Jeżeli masz jeden procesor, to jest to tylko 'w pewien sposób', tzn. i tak wykonuje się to sekwencyjnie, ale wątkom przydzielany jest ten jeden procesor w sposób w dużej mierze przypadkowy, na krótki, liczony w nanosekundach, czas, co daje niejaką pewność, że jeden nie rusza się kosztem drugiego. Ale... no właśnie, wątki zajęte w danej chwili czym innym (np. myśleniem) nie żądają jego przydzielenia, by wykonać ruch, albo dostają go rzadziej, co wykorzystują inne wątki, które tyle nie myślą, tylko wyczekują permanentnie na możliwość ruchu (procesor) i działa ten mechanizm 'noża w plecy'.
Ciekawostką, którą odkryłem przy okazji, jest właściwość, że jeden z moich zawodników, po lekkim "przeszkoleniu" potrafi DODATKOWO rozwiązać problem ośmiu hetmanów (dla niewtajemniczonych: jak ustawić osiem hetmanów na szachownicy tak, żeby się wzajemnie nie szachowały). Jest to tylko kwestia wyrażenia tego problemu w języku, który zaproponowałem, a także dzięki specjalnie zaprojektowanemu wzrokowi. Zgadnij, jak to się dzieje?...... Zobacz zresztą sam.

I pamiętaj: przeczytaj najpierw tutoriala z boku strony, oszczędzisz sobie zbędnego klikania...

ROZPOCZNIJ EKSPERYMENT


Powyżej znajduje się link do najnowszej aktualnie odsłony (na tej wersji się obroniłem), jest to wersja 1.7. Oprócz możliwości ustawiania pewnej wiedzy startowej, dla istot myślących rzecz jasna, możliwości wyboru kosztu uderzenia w ścianę, będących już w wersji 1.3 jest tutaj w końcu zaimplementowany finałowy algorytm Alpha-Beta.

starsze wersje: 1.0 1.1 1.3


pełny tekst ustawy:


© Wojciech Marchaj 2005    Powered by Free Site Templates


Podoba Ci któraś z powyższych stron? Chciałbyś mieć podobną? Zrobię taką stronę dla Ciebie!