2010-01-22 23 views
26

Mój znajomy zaczyna budować bot NetHack (bot, który gra w Roguelike: NetHack). Jest bardzo dobry działający bot do podobnej gry Angband, ale działa on częściowo ze względu na łatwość powrotu do miasta i zawsze jest w stanie niszczyć niskie poziomy, aby zdobyć przedmioty.Budowanie bota NetHack: czy Bayesian Analysis to dobra strategia?

W NetHack problem jest o wiele trudniejszy, ponieważ gra nagradza ballsy za eksperymentowanie i jest zbudowana w 100 przypadkach.

Niedawno zasugerowałem użycie jakiejś naiwnej analizy bayesowskiej, w bardzo podobny sposób, w jaki tworzony jest spam.

Zasadniczo bot mógłby najpierw zbudować korpus, próbując każdej możliwej akcji z każdym znalezionym przedmiotem lub stworzeniem i przechowując te informacje, na przykład, jak blisko śmierci, z powodu negatywnego skutku. Z czasem wydaje się, że można wygenerować rozsądnie odtwarzany model.

Czy ktoś może wskazać nam właściwy kierunek, jaki byłby dobry początek? Czy szczerzę złe drzewo lub nie rozumiem idei analizy bayesowskiej?

Edytuj: Mój przyjaciel wstawił github repo of his NetHack patch, który umożliwia powiązania Pythona. Wciąż jest w dość prymitywnym stanie, ale jeśli ktoś jest zainteresowany ...

+0

Brzmi świetnie. W jakim języku? – Trevoke

+1

Robi to w Pythonie, korzystając z powiązań Python NetHack. – danieltalsky

+3

Korekta: napisał wiązania Pythona. – danieltalsky

Odpowiedz

6

Chociaż analiza bayesowska obejmuje znacznie więcej, algorytm Naive Bayes, dobrze znany z filtrów spamowych, 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ść zawiera słowo "viagra", wiedza ta wpływa na prawdopodobieństwo, że będzie zawierała również słowo "medycyna" (lub "foo"). "lub" spam "lub cokolwiek innego). Ciekawe jest to, że założenie to jest oczywiście fałszywe, jeśli chodzi o język naturalny, ale wciąż udaje mu się uzyskać rozsądne wyniki.

Jednym ze sposobów, w jaki ludzie czasami omijają założenia dotyczące niezależności, jest definiowanie zmiennych, które są technicznie kombinacjami rzeczy (np. Wyszukiwanie tokena "kup viagrę"). To może zadziałać, jeśli znasz konkretne przypadki, ale ogólnie rzecz biorąc, w środowisku gry oznacza to, że nie możesz na ogół niczego zapamiętać. Tak więc za każdym razem, gdy musisz się ruszać, wykonywać akcję, itd., Całkowicie niezależnie od wszystkiego, co dotychczas robiłeś. Powiedziałbym, że nawet w przypadku najprostszych gier jest to bardzo nieefektywny sposób nauki gry.

Proponuję zamiast tego skorzystać z funkcji q-learning. Większość przykładów znajdziesz zazwyczaj w zwykłych grach (jak nauka nawigacji po mapie przy jednoczesnym unikaniu murów, pułapek, potworów itp.). Uczenie się wzmacniające jest rodzajem uczenia się bez nadzoru, które sprawdza się bardzo dobrze w sytuacjach, które mogą być modelowane jako agenci współdziałające ze środowiskiem, takim 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 więc na utrzymywaniu stanu, który pomaga botowi w podejmowaniu właściwych decyzji bez posiadania wyraźnego punktu w "przestrzeni" państwa dla każdej możliwej kombinacji poprzednich działań.

Mówiąc w bardziej konkretny sposób, gdybyś zbudował bota szachowego, prawdopodobnie miałbyś problemy, gdybyś próbował stworzyć strategię decyzyjną, która podejmowała decyzje w oparciu o wszystkie wcześniejsze ruchy od zestawu wszystkich możliwych kombinacji szachów. ruchy rosną bardzo szybko. Nawet prostszy model, w którym każdy element jest na planszy, wciąż jest bardzo dużą przestrzenią stanów, więc musisz znaleźć sposób na uproszczenie tego, co śledzisz. Zauważ jednak, że możesz śledzić stan, aby Twój bot nie tylko próbował wrzucać go do ściany na raz.

Wikipedii article jest dość żargon ciężki, ale ten tutorial ma o wiele lepszą pracę przekładając koncepcje na rzeczywistych przykładów.

Jeden połów polega na tym, że musisz mieć możliwość zdefiniowania nagród jako pozytywnego "wzmocnienia". Trzeba umieć definiować stany, do których próbuje dotrzeć bot, w przeciwnym razie będzie to trwać wiecznie.

1

W sieci nieznane akcje zwykle mają efekt boolowski - albo zyskujesz, albo tracisz. Sieci bayesowskie opierają się na wartościach "logiki rozmytej" - działanie może dawać zysk z określonym prawdopodobieństwem. W związku z tym nie potrzebujesz sieci bayesowskiej, tylko listę "odkrytych efektów" i czy są one dobre czy złe.

Nie trzeba znowu jeść Cockatrice, prawda?

W sumie zależy to od "wiedzy", którą chcesz dać bota jako przystawkę. Czy chcesz, aby nauczył się wszystkiego "na własnej skórze", czy nakarmisz go spoilerem, dopóki nie zostanie wypchany?

+0

Nie ma problemu z karmieniem spoilerów, naprawdę, ale ręczna praca wymagana przy tworzeniu korpusu informacji w spojlerach to dużo. Chodzi mi o to, że bot Angband znacznie wykorzystuje spoilery. Naprawdę wynik jest jedyną ważną rzeczą, ale nawet ze wszystkimi spoilery na świecie, że z pewnością jest wiele zasad do stworzenia. Ponadto nie zgadzam się, że akcje w NetHack są binarne. Czasem nawet nie wiesz, jaki wpływ ma działanie. Myślę, że mógłbyś zebrać wiele statystyk dotyczących każdej akcji, takich jak: zakręty przed śmiercią, liczba HP w zadawanych obrażeniach, itd. – danieltalsky

+0

Również w przypadku zjedzenia cockatrice ... powoduje to natychmiastową śmierć, a większość z tych działań szybko bańka na dno "działań, które pomogą przetrwać". – danieltalsky

+0

Niestety, Angband jest o wiele bardziej "uporządkowany" niż NetHack - reguły w Angband są stosunkowo proste i nie ma zbyt wielu "specjalnych przypadków" (dla których NetHack jest sławny;>). Pomyślę o tym więcej. –

4

Istnieje precedens: monstrualny program rog-o-matic odniósł sukces, grając zbójeckich, a nawet wrócił z amuletem Yendor kilka razy. Niestety, łobuz został wydany tylko binarnie, a nie źródłowo, więc umarł (chyba, że ​​możesz skonfigurować system 4.3BSD na MicroVAX), pozostawiając rog-o-matic niezdolnym do odtworzenia żadnego z klonów. Po prostu wisi, ponieważ nie są wystarczająco blisko emulacji.

Jednakże, Rog-o-matic jest, jak sądzę, moim ulubionym programem wszechczasów, nie tylko ze względu na to, co osiągnął, ale także z uwagi na czytelność kodu i zrozumiałą inteligencję jego algorytmów. Używało ono "dziedziczenia genetycznego": nowy gracz odziedziczyłby kombinację preferencji z poprzedniej pary odnoszących sukcesy graczy, z pewnym losowym przesunięciem, a następnie byłby nastawiony przeciwko maszynie. Lepsze preferencje będą migrować w puli genów, a mniej skuteczne w dół.

Źródło może być trudne do znalezienia w tych dniach, ale wyszukiwanie "rogomatic" ustawi Cię na ścieżce.

+0

Mój przyjaciel docenił, że został wskazany w kierunku Rog-o-matic. Nadal staram się, aby ktoś w tym celu dał swój wkład w przydatność algorytmu bayesowskiego. – danieltalsky

+2

@martinwguy - rog-o-matic działa teraz, dzięki projektowi Roguelike Restoration - http://rogue.rogueforge.net/ –

4

Wątpię, że analiza bayesowska da ci daleko, ponieważ większość NetHack jest wysoce kontekstualna. Jest bardzo mało działań, które są zawsze złym pomysłem; większość z nich jest również ratownikami życia w "właściwej" sytuacji (ekstremalnym przykładem jest jedzenie cockatrice: to jest złe, chyba że głodujesz i obecnie poljorphed w odpornym na kamień potworze, w takim przypadku jedzenie cockatrice jest słuszne). Niektóre z tych "prawie złych" działań są wymagane, aby wygrać grę (np. Wchodzenie po schodach na poziomie 1 lub celowe wpadanie w pułapki, aby dotrzeć do Gehennomu).

To, co możesz spróbować, to próbować zrobić to na poziomie "meta". Zaprojektuj bota jako losowego wybierania spośród wielu "elementarnych zachowań". Następnie spróbuj zmierzyć, jak te boty się zmieniają. Następnie wyodrębnij kombinacje zachowań, które wydają się sprzyjać przetrwaniu; Analiza bayesowska mogłaby to zrobić w szerokim gronie gier wraz z ich "poziomem sukcesu". Na przykład, jeśli istnieją zachowania "podnosząc sztylety" i "unikaj angażowania potworów w zwarcie", zakładam, że analiza ta pokaże, że te dwa zachowania dobrze pasują do siebie: boty, które wybierają sztylety bez ich używania, oraz boty, które próbują rzucać pociski w potwory bez zbierania takich pocisków, prawdopodobnie będzie gorzej.

To w pewien sposób naśladuje to, o co często pytają gracze w grze rec.games.roguelike.nethack. Większość pytań jest podobna do: "czy powinienem wypić nieznane mikstury, aby je zidentyfikować?" lub "jaki poziom powinien być moją postacią przed pójściem tak głęboko w lochu?". Odpowiedzi na te pytania silnie zależą od tego, co jeszcze robi gracz, i nie ma dobrej, absolutnej odpowiedzi.

Trudnym punktem jest tutaj pomiar sukcesu w przeżywaniu. Jeśli po prostu starasz się zmaksymalizować czas spędzony przed śmiercią, będziesz faworyzował boty, które nigdy nie opuszczają pierwszych poziomów; te mogą długo żyć, ale nigdy nie wygrają. Jeśli mierzysz sukces dzięki temu, jak głęboko postać przechodzi przed śmiercią, najlepszymi botami będą archeolodzy (którzy zaczynają od kilofa) w szaleńczym szale.

2

Wygląda na to, że istnieje duża liczba botów Nethack. Check out this listing:

+0

Darn ... miał tam też fajne roboty: '( Tutaj jest archiwum .org link do strony głównej, niestety nie ma podstrony z listą bota: http://web.archive.org/web/20100817092911/http://taeb.sartak.org/ – davr

+0

Przepraszam za to. Działa teraz, przekierowuje do kanonicznego adresu URL, który jest http://taeb.github.io/bots.html – sartak

Powiązane problemy