Budowanie bota NetHack: czy analiza bayesowska to dobra strategia?

Mój znajomy zaczyna budować bota Nethacka (bota, który gra w Roguelike: NetHack). Istnieje bardzo dobry bot pracy dla podobnej gry Angband, ale działa częściowo ze względu na łatwość w powrocie do miasta i zawsze jest w stanie szumowiny niskich poziomów, aby zdobyć przedmioty.

W Nethacku problem jest o wiele trudniejszy, ponieważ gra nagradza odważne eksperymenty i jest zbudowana w zasadzie jako 1000 edge cases.

Ostatnio zasugerowałem używając jakiejś naiwnej analizy bayesowskiej, w bardzo podobny sposób powstaje spam.

Zasadniczo bot początkowo budował ciało, próbując każdego możliwego działania z każdym znalezionym przedmiotem lub stworzeniem i przechowując te informacje, na przykład, jak blisko było śmierci, obrażeń o negatywnym skutku. Z czasem wydaje się, że można wygenerować rozsądnie grywalny model.

Czy ktoś może wskazać nam dobry początek? Czy szczekam złe drzewo czy niezrozumienie idei analizy bayesowskiej?

Edit: mój przyjaciel umieścił repo Githuba ze swojej łatki NetHack , która umożliwia wiązanie Pythona. Nadal jest w dość prymitywnym stanie, ale jeśli ktoś jest zainteresowany...

Author: danieltalsky, 2010-01-22

5 answers

Chociaż Analiza Bayesa obejmuje znacznie więcej, naiwny algorytm Bayesa dobrze znany z filtrów antyspamowych opiera się na jednym bardzo podstawowym założeniu: wszystkie zmienne są zasadniczo niezależne od siebie. Na przykład w filtrowaniu spamu każde słowo jest zwykle traktowane jako zmienna, więc oznacza to założenie, że jeśli wiadomość e-mail zawiera słowo "viagra", wiedza ta ma wpływ na prawdopodobieństwo, że będzie ona również zawierać słowo "Medycyna" (lub " foo " lub "spam" lub cokolwiek innego). Na interesujące jest to, że założenie to jest oczywiście fałszywe, jeśli chodzi o język naturalny, ale nadal udaje się uzyskać rozsądne wyniki.

Teraz jednym ze sposobów na obejście założenia niezależności jest zdefiniowanie zmiennych, które są technicznie kombinacjami rzeczy (np. szukanie żetonu 'buy viagra'). To może zadziałać, jeśli znasz konkretne przypadki, których szukasz, ale ogólnie, w środowisku gry, oznacza to, że nie możesz niczego zapamiętać. Więc każdy czas, który musisz przenieść, wykonać akcję, itp., jest całkowicie niezależny od niczego innego, co zrobiłeś do tej pory. Powiedziałbym nawet najprostszych gier, jest to bardzo nieefektywny sposób, aby przejść do nauki gry.

Sugerowałbym zamiast tego rozważenie użycia Q-learning. Większość przykładów, które znajdziesz, to zazwyczaj proste gry (np. nauka poruszania się po mapie, unikając ścian, pułapek, potworów itp.). Uczenie się przez Internet jest rodzajem uczenia się bez nadzoru to naprawdę dobrze sprawdza się w sytuacjach, które można modelować jako agent wchodzący w interakcję z otoczeniem, jak gra (lub roboty). Robi to próbując dowiedzieć się, jakie jest optymalne działanie w każdym stanie w środowisku (gdzie każdy stan może zawierać tyle zmiennych, ile potrzeba, znacznie więcej niż tylko "gdzie jestem"). Sztuczka polega na utrzymaniu wystarczającego stanu, który pomaga botowi podejmować dobre decyzje bez wyraźnego punktu w "przestrzeni" twojego stanu dla każdej możliwej kombinacji poprzednich działania.

Mówiąc bardziej konkretnie, gdybyś miał zbudować bota szachowego, prawdopodobnie miałbyś problem, gdybyś próbował stworzyć politykę decyzyjną, która podejmowałaby decyzje w oparciu o wszystkie poprzednie ruchy, ponieważ zestaw wszystkich możliwych kombinacji ruchów szachowych rośnie bardzo szybko. Nawet prostszy model, w którym każdy element znajduje się na płycie, jest nadal bardzo dużą przestrzenią stanów, więc musisz znaleźć sposób na uproszczenie tego, co śledzisz. Ale zauważ, że możesz śledzić niektóre stan tak, aby twój bot nie próbował w kółko robić lewego terminu na ścianie.

Artykuł Wikipedii jest dość żargonowy, ale ten tutorial znacznie lepiej tłumaczy pojęcia na prawdziwe przykłady.

Jedynym haczykiem jest to, że musisz być w stanie zdefiniować nagrody, aby zapewnić jako pozytywne "wzmocnienie". Oznacza to, że musisz być w stanie zdefiniować Stany, do których Bot próbuje się dostać, w przeciwnym razie po prostu Kontynuuj na zawsze.

 6
Author: Rob Van Dam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-26 07:38:02

Jest precedens: potworny program rog-O-matic zdołał zagrać w rogue ' A, a nawet kilka razy powrócił z amuletem Yendora. Niestety, rogue został wydany tylko jako binarny a, a nie źródłowy, więc umarł (chyba że można skonfigurować system 4.3 BSD na MicroVAX), pozostawiając rog-o-matic nie mógł odtworzyć żadnego z klonów. Wisi, bo nie są wystarczająco blisko.

Jednak rog-o-matic jest moim ulubionym programem wszechczasów, nie tylko ze względu na to, co osiągnięte, ale ze względu na czytelność kodu i zrozumiałą inteligencję jego algorytmów. Zastosowano w nim "dziedziczenie genetyczne": nowy gracz dziedziczy kombinację preferencji od poprzedniej pary udanych graczy, z pewnym losowym przesunięciem, a następnie zostanie ustawiony przeciwko maszynie. Bardziej udane preferencje migrują w górę puli genowej, a mniej udane w dół.

Źródło może być trudne do znalezienia w dzisiejszych czasach, ale Wyszukiwanie "rogomatic" postawi Cię na / align = "left" /

 4
Author: martinwguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 13:37:10

Wątpię, by analiza bayesowska daleko Ci zajechała, ponieważ większość Nethacka jest wysoce kontekstowa. Istnieje bardzo niewiele działań, które są Zawsze złym pomysłem; większość z nich jest również ratującymi życie w" właściwej " sytuacji (skrajnym przykładem jest jedzenie Kakadu: to jest złe, chyba że jesteś głodny i obecnie polimorfizujesz się w odpornego na kamień potwora, w którym to przypadku jedzenie kakadu jest właściwą rzeczą do zrobienia). Niektóre z tych" prawie złych " działań są wymagane, aby wygrać grę (np. schody na poziomie 1, lub celowo wpadają w pułapki, aby dotrzeć do Gehennom).

To, czego mógłbyś spróbować, byłoby próbą zrobienia tego na poziomie "meta". Zaprojektuj bota jako wybierającego losowo spośród różnych "elementarnych zachowań". Następnie spróbuj zmierzyć, jak te boty radzą sobie. Następnie wyodrębnij kombinacje zachowań, które wydają się promować przetrwanie; analiza bayesowska mogłaby to zrobić wśród szerokiego korpusu gier wraz z ich "poziomem sukcesu". Na przykład, jeśli istnieją zachowania "podnieś sztylety" i "unikaj angażowania potworów w walkę wręcz", zakładam, że analiza wykaże, że te dwa zachowania pasują do siebie: boty, które podrywają sztylety bez ich użycia, i boty, które próbują rzucać pociskami w potwory bez gromadzenia takich pocisków, prawdopodobnie wypadną gorzej.

To w jakiś sposób naśladuje to, o co gracze uczący się często proszą w rec.gry.roguelike.nethack. Większość pytań jest podobna do: "Czy powinienem pić nieznane eliksiry, aby je zidentyfikować ?"lub" na jakim poziomie powinna być moja postać zanim wejdziesz tak głęboko do lochu ?". Odpowiedzi na te pytania w dużej mierze zależą od tego, co jeszcze robi gracz, a nie ma dobrej odpowiedzi absolutnej.

Trudnym punktem jest tutaj, jak zmierzyć sukces w przetrwaniu. Jeśli po prostu spróbować zmaksymalizować czas spędzony przed śmiercią, to będzie faworyzować boty, które nigdy nie opuszczają pierwszych poziomów; te mogą żyć długo, ale nigdy nie wygra. Jeśli mierzysz sukces na podstawie tego, jak głęboka jest postać przed śmiercią, to najlepsze boty będą archeolodzy (którzy zaczynają od kilofa) w szale kopania.

 4
Author: Thomas Pornin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-28 16:30:54

Najwyraźniej jest sporo Nethackowych botów. zobacz tę listę:

 3
Author: davr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-25 22:06:24

W nethacku nieznane akcje zwykle mają efekt logiczny - albo zyskujesz, albo tracisz. Sieci bayesowskie bazują na wartościach "logiki rozmytej" - działanie może dać zysk z danym prawdopodobieństwem. Dlatego nie potrzebujesz sieci bayesowskiej, tylko listę "odkrytych efektów" i może są one dobre lub złe.

Nie musisz znowu jeść Kakadu, prawda?

W sumie to zależy ile "wiedzy" chcesz dać botowi jako początek. Chcesz, żeby się nauczył. wszystko "Na Ostro", czy będziesz go karmił spoilerami, aż się wypchnie?

 1
Author: Kornel Kisielewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 01:29:30