Как создать хорошую функцию оценки для игры?

Я пишу программы, чтобы иногда играть в настольные игры. Основная стратегия-стандартная альфа-бета обрезка или аналогичные поиски, иногда дополненные обычными подходами к эндшпионам или открытиям. Я в основном играл с вариантами шахмат, поэтому, когда приходит время выбрать мою функцию оценки, я использую базовую функцию оценки шахмат.

однако теперь я пишу программу, чтобы играть в совершенно новую настольную игру. Как выбрать хорошую или даже достойную оценку функции?

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

описание игры: игра играется на доске 10 на 10 с фиксированной шесть штук на стороне. Этот части имеют определенные правила движения и взаимодействуют определенным образом, но ни одна часть никогда не захватывается. Цель игры состоит в том, чтобы иметь достаточно ваших частей в определенных специальных квадратов на доске. Цель компьютерной программы-предоставить игрока, который конкурирует или лучше, чем нынешние человеческие игроки.

8 ответов


найдите несколько кандидатов для своей функции оценки, например, мобильность (#возможных ходов) минус мобильность противника, затем попробуйте найти оптимальный вес для каждой метрики. Генетические алгоритмы, похоже, работают довольно хорошо для оптимизации весов в функции оценки.

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

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


Я начну с основ и постепенно переходит к более сложным материалом.

базовый агент и структура тестирования

независимо от того, какой подход вы принимаете, вам нужно начать с чего-то очень простого и тупого. Лучший подход для немого агента-случайный (генерируйте все возможные ходы, выбирайте один наугад). Это послужит отправной точкой для сравнения всех ваших других агентов. Вам нужна сильная основа для сравнения. Что-то, что принимает различные агенты, позволяет играть некоторое количество игр между ними и возвращает матрицу производительности. Основываясь на результатах, вы вычисляете пригодность для каждого агента. Например, ваша функция tournament(agent1, agent2, agent3, 500) будет играть 500 игр между каждой парой агента (играя первый / второй) и возвращает вам что-то вроде:

  x         -0.01       -1.484   |  -1.485
0.01          x         -1.29    |  -1.483
1.484       1.29          x      |  2.774

здесь, например, я использую 2 очка для победы, 1 очко для функции подсчета очков, а в конце просто суммирую все, чтобы найти фитнес. Эта таблица сразу говорит мне, что agent3 и agent1 не совсем agent2.

Итак, как только эти две важные вещи настроены, вы готовы экспериментировать с вашими функциями оценки.


давайте начнем с выбора функций

  1. прежде всего вам нужно создать not a terrible функции оценки. Под этим я подразумеваю, что эта функция должна правильно определить 3 важных аспекта (победа/ничья/поражение). Этот звучит очевидно, но я видел значительное количество ботов, где создатели не смогли правильно настроить эти 3 аспекта.

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

  3. если у вас нет специалиста, или даже просто создали правила своей игры 5 минут назад, не стоит недооценивать человека возможность поиска скороговорки. Даже после игры в пару игр умный человек может дать вам идеи, как он должен был играть (это не значит, что он может реализовать идеи). Используйте эти идеи как функции.

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

  5. после того, как вы закодировали эти функции и использовали их отдельно, чтобы увидеть, что работает лучше всего (не спешите отбрасывать функции, которые не выполняют разумные сами по себе, они могут быть полезны в сочетании с другими), вы готовы экспериментировать с комбинациями.

построение лучших оценок путем объединения и взвешивания простых функций. есть несколько стандартных подходы.

  1. создайте функцию uber на основе различных комбинаций ваших функций. Он может быть линейным eval = f_1 * a_1 + ... f_n * a_n (f_i характеристики, a_i коэффициенты), но это может быть что угодно. Затем создайте множество агентов с абсолютно случайными весами для этой функции оценки и используйте генетический алгоритм, чтобы воспроизвести их друг с другом. Сравните результаты с помощью платформы тестирования, отбросьте пару явных неудачников и мутируйте пару победителей. Продолжить же процесс. (Это приблизительный план, подробнее о GA)

  2. используйте идею обратного распространения из нейронных сетей для обратного распространения ошибки с конца игры для обновления весов вашей сети. Вы можете прочитать больше, как это было сделано с нарды (я не писал ничего подобного, так что извините за краткость).

вы можете работать без функции оценки! это может показаться безумным человек, который только слышал о minimax / alpha-beta, но есть методы, которые не требуют оценки вообще. Один из них называется Поиск Дерева Монте-Карло и как Монте-Карло в названии предполагает, что он использует много случайных (он не должен быть случайным, он может использовать ваши предыдущие хорошие агенты) игры для создания дерева. Это огромная тема сама по себе, поэтому я дам вам свое объяснение на самом высоком уровне. Вы начинаете с корня, создаете свою границу, которую пытаетесь расширить. Однажды вы расширяете что-то, вы просто случайно идете к листу. Получать результат от листьев, вы backpropagate результат. Сделайте это много-много раз и соберите статистику о каждом ребенке текущего рубежа. Выберите лучший. Существует значительная теория, которая относится к тому, как вы балансируете между разведкой и разработкой, и хорошо читать, что есть UCT (алгоритм с верхней степенью уверенности)


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

кроме того, проверьте приобретение стратегии для игры Отелло на основе обучения с подкреплением (ссылка PDF), где учитывая правила игры, можно узнать хорошую "функцию выплаты". Это тесно связано с TD-Gammon ...

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


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

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

Я думаю, что нет никакого способа, кроме как понять игру как можно лучше и, для начала, оставить неизвестные как случайные на функции оценки (или просто из картины, пока неизвестные не станут более известными).

конечно, если вы поделитесь дополнительной информацией об игре, вы можете получить лучшие идеи от сообщества.


Как я понимаю, вы хотите, чтобы хорошая статическая функция оценки использовалась в листьях вашего дерева min-max. Если это так, то лучше всего помнить, что цель этой статической функции оценки состоит в том, чтобы обеспечить оценку того, насколько хороша эта плата для компьютерного игрока. Так

f (board1) > f(board2)

тогда должно быть верно, что board1 лучше для компьютера (он, скорее всего, в конечном итоге выиграет), чем в board2. Конечно, никакая статическая функция никогда полностью корректно для всех плат.

Итак, вы говорите ,что" цель игры состоит в том, чтобы иметь достаточно ваших фигур в определенных специальных квадратах на доске", поэтому первый удар по f(доске) будет просто подсчитать количество штук, которые компьютер имеет на этих специальных квадратах. Затем вы можете утончить его больше.

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


хотя вы можете использовать различные методы машинного обучения, чтобы придумать функцию оценки (TD-Learning, используемый в таких проектах, как gnubackgammon, является одним из таких примеров), результаты определенно зависят от самой игры. Для нард он работает очень хорошо, потому что стохастический характер игры (rolling dice) заставляет учащегося исследовать территорию, которую он, возможно, не захочет делать. Без такого важного компонента вы, вероятно, получите функцию оценки, которая является хорошей против себя, но не против других.

поскольку материальная разница может быть неприменима, важна ли концепция мобильности - т. е. сколько возможных ходов у вас есть? Лучше ли контролировать определенную область доски, чем нет? Поговорить с людьми, которые играют в игру, чтобы узнать некоторые подсказки.

хотя предпочтительнее иметь как можно более хорошую функцию оценки, вам также нужно настроить алгоритм поиска, чтобы вы могли искать как глубоко как это возможно. Иногда это на самом деле больше беспокоит, так как глубокий поиск с функцией оценки medicore может переиграть неглубокие поиски с хорошей функцией оценки. Все зависит от домена. (gnubackgammon играет экспертную игру с 1-слойным поиском, например)

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

Я настоятельно рекомендую посмотреть эти слайды.


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

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

в искусственная симуляция жизни, которую я написал, чтобы развить охоту на стаи и защиту стаи, система подсчета очков, которую я использовал, была только для руководства эволюцией, а не для обрезки. Я дал каждому существу одно очко за то, что родился. За каждую точку энергии, которую они потребляли в своей жизни, я давал им еще одну точку. Затем я использовал сумму точек их поколения, чтобы определить, насколько вероятно каждое из них будет воспроизводиться. В моем случае я просто использовал пропорцию общих точек их поколения, которые они приобрели. Если бы я хотел развить существ, которые были великолепны в уклонении,я бы забил за то, что они съели очки.

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

Не зная больше о вашем игра мне было бы трудно рассказать вам, как построить функцию. Есть ли четкие значения чего-то, что указывает на выигрыш или проигрыш? Есть ли у вас способ оценить минимальную стоимость, чтобы закрыть разрыв?

Если вы предоставите больше информации, я был бы рад попытаться предоставить больше информации. Есть много отличных книг на эту тему.

Яков


принимать во внимание, что это не nescessarily правда, что функция достойную оценку, даже не существует. Для этого утверждения я предполагаю, что функция оценки должна быть низкой сложности (P).