Создание бота NetHack: является ли Байесовский анализ хорошей стратегией? - PullRequest
27 голосов
/ 22 января 2010

Мой друг начинает создавать бот NetHack (бот, который играет в игру Roguelike: NetHack). Есть очень хороший рабочий бот для аналогичной игры Angband, но он работает частично из-за легкости возвращения в город и всегда в состоянии отбросить низкие уровни, чтобы получить предметы.

В NetHack проблема намного сложнее, потому что игра вознаграждает за трудные эксперименты и построена в основном как 1000 крайних случаев.

Недавно я предложил использовать какой-то наивный байесовский анализ, почти так же, как и спам.

По сути, бот сначала строит корпус, выполняя каждое возможное действие с каждым найденным предметом или существом и сохраняя эту информацию, например, как близко к смерти, получая ущерб от негативного эффекта. Со временем кажется, что вы можете создать разумно воспроизводимую модель.

Может ли кто-нибудь указать нам правильное направление, каким будет хороший старт? Я лаю не на том дереве или неправильно понимаю идею байесовского анализа?

Редактировать: Мой друг выставил репозиторий github своего патча NetHack , который разрешает привязки Python. Это все еще в довольно примитивном состоянии, но если кому-то интересно ...

Ответы [ 5 ]

6 голосов
/ 26 января 2010

Хотя байесовский анализ охватывает гораздо больше, наивный байесовский алгоритм, хорошо известный по спам-фильтрам, основан на одном очень фундаментальном допущении: все переменные практически не зависят друг от друга. Так, например, при фильтрации спама каждое слово обычно рассматривается как переменная, что означает, что если в письме содержится слово «виагра», то это знание влияет на вероятность того, что оно также будет содержать слово «лекарство» (или «foo»). или "спам" или что-нибудь еще). Интересно, что это предположение совершенно очевидно неверно, когда речь идет о естественном языке, но все же удается получить разумные результаты.

Теперь один из способов, с помощью которого люди иногда обходят предположение о независимости, состоит в том, чтобы определить переменные, которые являются технически комбинациями вещей (например, поиск токена «купить виагру»). Это может сработать, если вы знаете, какие конкретные случаи нужно искать, но в целом в игровой среде это означает, что вы вообще ничего не помните. Поэтому каждый раз, когда вам нужно двигаться, выполнять действие и т. Д., Оно совершенно не зависит от всего, что вы делали до сих пор. Я бы сказал, что даже для самых простых игр это очень неэффективный способ изучения игры.

Я бы предложил вместо этого использовать q-learning. Большинство примеров, которые вы найдете, обычно так или иначе являются простыми играми (например, научиться ориентироваться на карте, избегая стен, ловушек, монстров и т. Д.). Усиленное обучение - это тип обучения в режиме онлайн без присмотра, которое действительно хорошо работает в ситуациях, которые могут быть смоделированы как агент, взаимодействующий с окружающей средой, такой как игра (или роботы). Он делает это, пытаясь выяснить, каково оптимальное действие в каждом состоянии среды (где каждое состояние может включать столько переменных, сколько необходимо, гораздо больше, чем просто «где я»). Хитрость заключается в том, чтобы поддерживать достаточное количество состояний, которые помогают боту принимать правильные решения, не имея четкой точки в «пространстве» вашего состояния для каждой возможной комбинации предыдущих действий.

Проще говоря, если бы вы строили шахматного бота, у вас, вероятно, возникли бы проблемы, если бы вы попытались создать политику принятия решений, которая принимала бы решения на основе всех предыдущих ходов, начиная с набора всех возможных комбинаций шахматных ходов. растет очень быстро. Даже более простая модель, в которой каждая фигура находится на доске, по-прежнему представляет собой очень большое пространство состояний, поэтому вам нужно найти способ упростить то, что вы отслеживаете. Но обратите внимание, что вы можете отслеживать какое-то состояние, чтобы ваш бот не просто пытался снова и снова превращать левый член в стену.

Статья в Википедии довольно жаргонизна, но этот урок намного лучше переводит концепции в примеры из реального мира.

Единственный улов в том, что вам нужно уметь определять награды, чтобы обеспечить их как положительное «подкрепление». То есть вы должны иметь возможность определять состояния, в которые пытается добраться бот, иначе это будет продолжаться вечно.

4 голосов
/ 28 января 2010

Я сомневаюсь, что байесовский анализ унесет вас далеко, потому что большая часть NetHack очень контекстная Очень мало действий, которые всегда плохая идея; большинство из них - также спасатели жизни в «правильной» ситуации (крайний пример - поедание кокатриса: это плохо, если вы не голодаете и в настоящее время не превращаетесь в монстра, стойкого к камням, и в этом случае поедание кокатриса является правильным решением. ). Некоторые из этих «почти плохих» действий требуются для победы в игре (например, подняться по лестнице на уровень 1 или умышленно упасть в ловушку, чтобы добраться до Геэнном).

То, что вы могли бы попробовать, это попытаться сделать это на «мета» уровне. Проектируйте бота как случайного выбора среди множества «элементарных поведений». Тогда попробуйте измерить, как живут эти боты. Затем извлеките комбинации поведения, которые, кажется, способствуют выживанию; Байесовский анализ может сделать это среди широкого круга игр наряду с их «уровнем успеха». Например, если есть поведение «подбирать кинжалы» и «избегать вовлечения монстров в ближнем бою», я бы предположил, что анализ покажет, что эти два поведения хорошо сочетаются друг с другом: боты, которые подбирают кинжалы без их использования, и боты, которые пытаются бросать ракеты в монстров, не собирая такие ракеты, вероятно, будет хуже.

Это как-то имитирует то, что часто просят обучающиеся геймеры в rec.games.roguelike.nethack. Большинство вопросов похоже на: «Должен ли я пить неизвестные зелья, чтобы идентифицировать их?» или «какой уровень должен быть у моего персонажа перед тем, как глубоко в подземелье?». Ответы на эти вопросы в значительной степени зависят от того, что еще делает игрок, и нет хорошего абсолютного ответа.

Трудный момент здесь заключается в том, как измерить успех в выживании. Если вы просто попытаетесь максимизировать время, проведенное перед смертью, вы предпочтете ботов, которые никогда не покидают первые уровни; те могут жить долго, но никогда не выиграют игру. Если вы измеряете успех по тому, как глубоко персонаж уходит перед смертью, то лучшими ботами будут археологи (начинающие с кирки) в безумном раскопе.

4 голосов
/ 22 января 2010

Прецедент есть: чудовищная мошенническая программа преуспела в игре мошенника и даже несколько раз возвращалась с амулетом Йендора. К сожалению, мошенник выпустил только двоичный файл, а не исходный код, поэтому он умер (если вы не можете установить систему 4.3BSD на MicroVAX), в результате чего rog-o-matic не может воспроизводить ни одного из клонов. Он просто зависает, потому что они не достаточно близко подражают.

Однако rog-o-matic, я думаю, моя любимая программа всех времен, не только из-за того, чего она достигла, но и из-за читабельности кода и понятного интеллекта его алгоритмов. Он использовал «генетическое наследование»: новый игрок унаследовал бы комбинацию предпочтений от предыдущей пары успешных игроков с некоторым случайным смещением, а затем был бы настроен против машины. Более успешные предпочтения будут перемещаться вверх в генофонде, а менее успешные - вниз.

В наши дни может быть трудно найти источник, но поиск "rogomatic" укажет вам путь.

3 голосов
/ 26 февраля 2010

По-видимому, есть немало ботов Nethack. Проверьте это объявление:

1 голос
/ 22 января 2010

В нетхаке неизвестные действия обычно имеют логический эффект - либо вы получаете, либо проигрываете. Байесовские сети основаны на значениях «нечеткой логики» - действие может дать выигрыш с заданной вероятностью. Следовательно, вам не нужна байесовская сеть, просто список «обнаруженных эффектов» и, хороши они или нет.

Не нужно снова есть Кокатрису, не так ли?

В целом все зависит от того, сколько «знаний» вы хотите дать боту как стартерам. Ты хочешь, чтобы он выучил все "трудным путем", или ты будешь кормить его спойлерами, пока он не набит?

...