2010-01-22 9 views
26

Ein Freund von mir fängt an, einen NetHack-Bot zu bauen (ein Bot, der das Roguelike-Spiel spielt: NetHack). Es gibt einen sehr guten funktionierenden Bot für das ähnliche Spiel Angband, aber es funktioniert teilweise wegen der Leichtigkeit, in die Stadt zurückzukehren und immer in der Lage zu sein, niedrige Levels abzuschöpfen, um Gegenstände zu erhalten.Aufbau eines NetHack-Bot: Ist die Bayessche Analyse eine gute Strategie?

In NetHack ist das Problem viel schwieriger, weil das Spiel bally Experimente belohnt und im Grunde als 1.000 Rand Fälle gebaut wird.

Vor kurzem schlug ich vor, eine Art naive Bayesian-Analyse zu verwenden, ganz ähnlich wie Spam.

Grundsätzlich würde der Bot zuerst ein Korpus bauen, indem er jede mögliche Aktion mit jedem Gegenstand oder jeder Kreatur, die er findet, ausprobiert und diese Information speichert, zum Beispiel wie nahe ein Tod, eine Verletzung negativer Wirkung war. Im Laufe der Zeit scheint es, als könnten Sie ein vernünftig spielbares Modell erstellen.

Kann uns jemand in die richtige Richtung weisen, was ein guter Anfang wäre? Banne ich den falschen Baum an oder missverstehe ich die Bayes'sche Analyse?

Bearbeiten: Mein Freund legte eine github repo of his NetHack patch, die Python-Bindungen ermöglicht. Es ist immer noch in einem ziemlich primitiven Zustand, aber wenn jemand interessiert ist ...

+0

Das klingt genial. In welcher Sprache? – Trevoke

+1

Er macht es in Python, mit den Python NetHack-Bindungen. – danieltalsky

+3

Korrektur: Er schrieb die Python-Bindungen. – danieltalsky

Antwort

6

Obwohl die Bayessche Analyse viel mehr umfasst, basiert der aus Spamfiltern bekannte Naive Bayes Algorithmus auf einer sehr grundlegenden Annahme: Alle Variablen sind im Wesentlichen unabhängig voneinander. So wird zum Beispiel bei der Spam - Filterung jedes Wort normalerweise als Variable behandelt. Das heißt, wenn die E - Mail das Wort "viagra" enthält, beeinflusst dieses Wissen die Wahrscheinlichkeit, dass es auch das Wort "Medizin" (oder "foo") enthält 'oder' Spam 'oder irgendetwas anderes). Das Interessante ist, dass diese Annahme in der natürlichen Sprache offensichtlich falsch ist, aber immer noch zu vernünftigen Ergebnissen führt.

Ein Weg, wie Menschen manchmal die Unabhängigkeitsannahme umgehen, ist die Definition von Variablen, die technisch eine Kombination von Dingen sind (wie die Suche nach dem Token "Buy Viagra"). Das kann funktionieren, wenn Sie bestimmte Fälle kennen, nach denen Sie suchen, aber im Allgemeinen bedeutet dies, dass Sie sich in einer Spielumgebung im Allgemeinen an nichts erinnern können. Jedes Mal, wenn du dich bewegst, führst du eine Aktion aus usw., die völlig unabhängig von allem ist, was du bisher getan hast. Ich würde sogar für die einfachsten Spiele sagen, dass dies ein sehr ineffizienter Weg ist, um das Spiel zu lernen.

Ich würde vorschlagen, stattdessen mit q-Learning zu untersuchen. Die meisten Beispiele, die du findest, sind normalerweise nur einfache Spiele (wie das Lernen, wie man eine Karte navigiert, während man Mauern, Fallen, Monster usw. meidet). Reinforcement Learning ist eine Art von nicht überwachtem Online-Lernen, das in Situationen, in denen ein Agent als Interaktion mit einer Umgebung wie einem Spiel (oder Robotern) fungieren kann, wirklich gut funktioniert. Es versucht, herauszufinden, was die optimale Aktion in jedem Zustand in der Umgebung ist (wo jeder Zustand so viele Variablen wie nötig enthalten kann, viel mehr als nur 'wo bin ich'). Der Trick besteht dann darin, gerade genug Status beizubehalten, der dem Bot hilft, gute Entscheidungen zu treffen, ohne einen eindeutigen Punkt in Ihrem Zustandsraum für jede mögliche Kombination von vorherigen Aktionen zu haben. Wenn man einen Schachbot bauen wollte, hätte man wahrscheinlich Schwierigkeiten, wenn man versucht hätte, eine Entscheidungsstrategie zu erstellen, die auf der Grundlage aller vorherigen Züge seit der Auswahl aller möglichen Kombinationen von Schach Entscheidungen trifft Bewegungen wachsen sehr schnell. Sogar ein einfacheres Modell, wo jedes Stück auf dem Brett ist, ist immer noch ein sehr großer Zustandsraum, so dass Sie einen Weg finden müssen, um zu vereinfachen, was Sie verfolgen. Aber beachte, dass du einen Zustand im Auge behalten musst, damit dein Bot nicht immer wieder versucht, einen linken Begriff in eine Wand zu setzen.

Die wikipedia article ist ziemlich Jargon schwer, aber diese tutorial macht einen viel besseren Job, die Konzepte in reale Beispiele zu übersetzen.

Der einzige Haken ist, dass Sie in der Lage sein müssen, Belohnungen zu definieren, die als positive "Verstärkung" bereitgestellt werden. Das heißt, Sie müssen in der Lage sein, die Zustände zu definieren, zu denen der Bot zu gelangen versucht, anderenfalls wird er für immer fortgeführt.

1

In Nethack haben unbekannte Aktionen normalerweise einen booleschen Effekt - entweder Sie gewinnen oder Sie verlieren. Bayessche Netzwerke basieren auf "Fuzzy-Logik" -Werten - eine Aktion kann einen Gewinn mit einer gegebenen Wahrscheinlichkeit ergeben. Daher benötigen Sie kein bayesisches Netzwerk, sondern nur eine Liste der "gefundenen Effekte" und ob sie gut oder schlecht sind.

Keine Notwendigkeit den Cockatrice wieder zu essen, oder?

Alles in allem hängt es davon ab, wie viel "Wissen" Sie dem Bot als Starter geben wollen. Willst du, dass er alles "auf die harte Tour" lernt, oder willst du ihm Spoiler geben, bis er voll ist?

+0

Kein Problem, Spoiler zu füttern, wirklich, aber die manuelle Arbeit, die erforderlich ist, um ein Korpus der Informationen in Spoilern zu schaffen, ist eine Menge. Ich meine, der Angband-Bot nutzt Spoiler deutlich. Wirklich das Ergebnis ist das einzig Wichtige, aber selbst mit all den Spoilern auf der Welt ist das sicher eine Menge zu erstellender Regeln. Auch stimme ich nicht überein, dass Aktionen in NetHack binär sind. Manchmal weißt du nicht einmal den Effekt einer Handlung. Ich denke, du könntest eine Reihe von Statistiken über jede Aktion sammeln, wie: vor dem Tod dreht, Anzahl der HP in Schaden verursacht, etc. – danieltalsky

+0

Auch im Falle des Essens der Cockatrice ... verursacht es den sofortigen Tod und die meisten dieser Aktionen würde schnell auf den Boden von "Aktionen, die das Überleben helfen würden". – danieltalsky

+0

Leider ist Angband viel "ordentlicher" als NetHack - die Regeln in Angband sind relativ einfach und es gibt nicht viele hartcodierte "Spezialfälle" (für die NetHack berühmt ist;>). Ich werde darüber mehr nachdenken. –

4

Es gibt einen Präzedenzfall: das monströse rog-o-matic-Programm gelang es, Schurken zu spielen und kam sogar einige Male mit dem Amulett von Yendor zurück. Unglücklicherweise wurde Rogue nur als Binärdatei und nicht als Quelle veröffentlicht, also ist es gestorben (es sei denn, Sie können ein 4.3BSD-System auf einer MicroVAX einrichten), so dass Rog-O-Matic keinen der Klone spielen kann. Es hängt einfach, weil sie nicht nah genug Emulationen sind.

Allerdings ist rog-o-matic meines Erachtens mein Lieblingsprogramm aller Zeiten, nicht nur wegen dessen, was es erreicht hat, sondern wegen der Lesbarkeit des Codes und der verständlichen Intelligenz seiner Algorithmen. Es verwendete "genetische Vererbung": ein neuer Spieler würde eine Kombination von Präferenzen von einem vorherigen Paar von erfolgreichen Spielern mit etwas zufälligem Versatz erben und dann gegen die Maschine antreten. Erfolgreichere Präferenzen würden im Genpool nach oben und weniger erfolgreiche nach unten wandern.

Die Quelle kann heutzutage schwer zu finden sein, aber die Suche nach "rogomatic" wird Sie auf den Weg bringen.

+0

Mein Freund schätzte, dass er in Richtung Rog-O-Matic zeigte. Ich halte immer noch Ausschau nach jemandem, der zu diesem Zweck einen Bayesian-Algorithmus als geeignet erachtet. – danieltalsky

+2

@martinwguy - rog-o-matic arbeitet jetzt, dank dem Roguelike Restoration Projekt - http://rogue.rogueforge.net/ –

4

Ich bezweifle Bayesian Analyse wird Sie weit bringen, weil die meisten von NetHack sehr kontextabhängig ist. Es gibt sehr wenige Aktionen, die immer eine schlechte Idee sind; Die meisten sind auch Lebensretter in der "richtigen" Situation (ein extremes Beispiel ist das Essen eines Cockatrice: das ist schlecht, es sei denn, Sie verhungern und sind derzeit in ein steinresistentes Monster verwandelt, in welchem ​​Fall das Essen der Cockatrice das Richtige ist). Einige dieser "fast schlechten" Aktionen sind erforderlich, um das Spiel zu gewinnen (z. B. die Treppe auf Stufe 1 hinaufzusteigen oder absichtlich in Fallen zu fallen, um Gehennom zu erreichen).

Was Sie versuchen könnten, würde versuchen, es auf der "Meta" -Ebene zu tun. Entwerfen Sie den Bot als zufällige Auswahl unter einer Vielzahl von "elementaren Verhaltensweisen". Versuchen Sie dann zu messen, wie diese Bots abschneiden. Dann extrahiere die Kombinationen von Verhaltensweisen, die das Überleben zu fördern scheinen; Bayesianische Analyse könnte dies in einem breiten Korpus von Spielen zusammen mit ihrem "Erfolgslevel" tun. Zum Beispiel, wenn es Verhaltensweisen gibt, "Dolche aufheben" und "Monster im Nahkampf angreifen", würde ich annehmen, dass die Analyse zeigen würde, dass diese beiden Verhaltensweisen gut zusammenpassen: Bots, die Dolche sammeln, ohne sie zu benutzen, und Bots, die es versuchen werfen Sie Raketen auf Monster, ohne solche Raketen zu sammeln, wird wahrscheinlich schlechter gehen.

Dies ahmt irgendwie nach, was Lernspieler oft in rec.games.roguelike.nethack verlangen. Die meisten Fragen sind ähnlich wie: "Sollte ich unbekannte Tränke trinken, um sie zu identifizieren?" oder "Welches Level sollte mein Charakter sein, bevor ich so tief in den Kerker gehe?". Die Antworten auf diese Fragen hängen stark davon ab, was der Spieler sonst macht, und es gibt keine gute, absolute Antwort.

Ein schwieriger Punkt hier ist, wie man den Erfolg beim Überleben misst. Wenn Sie einfach versuchen, die Zeit vor dem Sterben zu maximieren, werden Sie Bots bevorzugen, die nie die ersten Stufen verlassen; Diese können lange leben, werden das Spiel aber nie gewinnen. Wenn Sie den Erfolg daran messen, wie tief der Charakter vor dem Absterben geht, dann sind die besten Bots Archäologen (die mit einer Spitzhacke beginnen) in einem Grabrausch.

2

Anscheinend gibt es eine gute Anzahl von Nethack-Bots da draußen. Check out this listing:

+0

Darn ... er hatte auch ein paar coole Bots da: '( Hier ist ein Archiv .org Link zur Hauptseite, leider haben sie nicht die Unterseite mit den Bot Listings: http://web.archive.org/web/20100817092911/http://taeb.sartak.org/ – davr

+0

Sorry. Es funktioniert jetzt und es wird zur kanonischen URL weitergeleitet, die http://taeb.github.io/bots.html lautet – sartak