Будет ли работать мой алгоритм искусственного интеллекта для игры python шашек, и если нет, какие другие мне следует рассмотреть? - PullRequest
0 голосов
/ 03 августа 2020

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

Для любого игрока:

  • Обычный ход + 0
  • Захватить обычную фигуру + 1
  • Захватить короля + 2
  • Ход, в результате чего король + 2
  • Выиграйте игру +10 (ИИ должен сильно предпочитать этот путь, если другой не дает более сильного и безопасного краткосрочного преимущества.)
  • Ничья игра (Не обращайте внимания на путь, если это не единственный оставшийся вариант. Статистика c 1 очко добродетели. )
  • Проиграть игру (Не обращайте внимания на путь, если это не единственный оставшийся вариант. Статистика c 0 Очков добродетели.)

Я также играю со следующим:

  • Движение, которое заканчивается у стены + 0,5
  • Движение, которое получает контроль над центром без угрозы + 0,75
  • Движение, которое приводит к потенциальному захвату нескольких частей ИИ (за штуку) -0.25
  • Движение, в результате которого фигура "застревает" (в пределах 1 Turn) -0.5

Затем ИИ проходит через X уровней (скажем, 4) ходов глубоко в дереве поиска и подсчитывает очки как для игрока, так и для противника для каждой ветви .

Я отслеживаю следующее (для каждой ветви):

  • Общее количество очков для AI
  • Общее количество очков для человеческого противника
  • Вероятность выбора оппонентом ветки (см. Ниже)
  • Ветвь «Доброта» (см. Ниже)
  • Всего ветвей (комбинаций ходов)

Чтобы выбрать лучший, вот алгоритм, который я разработал, но еще не определил, будет ли он работать хорошо:

Базовая вероятность перемещения противника = 100 / Всего ветвей * (набранные очки противников-людей + 1) Ветвь игрока «Доброта» = вероятность оппонента-человека * Общее количество очков для игрока ИИ

Затем ИИ выбирает переместите ветку с наибольшим количеством очков "Доброта" или выберите одну наугад в случае ie.

Пример: доступно 4 филиала. В одном из них человек будет королем один раз, а ИИ захватит 2 фигуры и один раз короля.

100/4 хода * (1 очко противника + 1) = 50 очков вероятности оппонента-человека

50 Вероятность человеческого оппонента * 5 Очков ИИ-игрока набрано = 250 Очков «Добродетели» передвижения

Единственное, что я могу добавить, это чтобы оценить «благоприятность» всей доски в конце каждой ветви и умножить ее на оценку «доброты». Благоприятность, означающая общее количество очков за все фигуры, королей, контроль центра / стены как заданное конечное состояние. Хотя чем больше я расширяю это, тем больше мне кажется, что я должен выбрать одно или другое. Либо количество очков, так как каждый из ходов в ветви рассчитывается или оценивается результат благоприятности конечной доски для каждой ветви, а не оба.

Может быть что-то вроде: (Доска Благоприятность / 2) * Доброта = Конечное значение ветви

Тем не менее, я на правильном пути здесь? Будет ли этот подход работать (не в части благоприятствования, общей оценки и оценки «доброты» для данной ветви), или я нахожусь на совершенно неправильном пути? Спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 03 августа 2020

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

Обычно игрок следующий игрок считается «максимальным» игроком, а другой игрок - «минимальным» игроком. Когда у вас есть игра с идеальной информацией (ничего не скрывается) с нулевой суммой для двух игроков (в этом случае все конечные результаты - выигрыш / проигрыш / ничья), существует довольно простая модель того, как играть - построение полного дерева game.

Итак, максимальный игрок считает все свои ходы и выбирает ход, который возвращает максимальное значение. Но, с учетом здесь на самом деле просит минимального игрока сделать то же самое, за исключением того, что минимальный игрок принимает минимальное значение (а затем просит максимального игрока сделать это рекурсивно и так далее). Если вы продолжите это до конца игры, в шашках вы получите все выигрыши, проигрыши и dr aws, которым могут быть присвоены 100, -100 и 0. (Точные значения не имеют значения, только порядок следования. Значения.) Имея достаточно времени, вы можете перебирать все дерево и играть идеально.

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

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

  • Альфа-бета-обрезка сохраняет результат, но делает дерево намного меньше.
  • Реальные игры больше похожи на графики что деревья. Таблицы транспонирования обнаруживают транспозиции в повторяющиеся состояния и избегают повторного поиска в одном и том же дереве дважды.
  • Итеративное углубление помогает вам перебирать дерево, чтобы настроить, насколько глубоко вы ищете. с самого начала, экономя много вычислений и значительно увеличивая мощность программы.
  • Машинное обучение можно использовать для настройки значений, которые вы настраиваете вручную, или для всего процесса (ala AlphaZero )
  • Поиск по дереву Монте-Карло предлагает образцы возможных строк воспроизведения в дереве, что может помочь в дорогостоящей работе по настройке оценочной функции.

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

Редактировать: Обратите внимание, что хороший подход к разработке программного обеспечения было бы заставить минимаксный поиск работать с очень простой оценкой fu nction (например, посчитать разницу в материалах и разницу между королем). Когда это сработает, вы можете искать слабые места в игре. Более обширная функция оценки поможет исправить эти недостатки. Затем вы можете повторить этот процесс.

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

1 голос
/ 03 августа 2020

Вы на правильном пути, и в другом ответе уже есть много деталей, но я хочу выделить одну вещь: вам следует сосредоточиться на оценке позиций , а не на оценке ходов . Ценность хода - это просто значение позиции, в которой он заканчивается.

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

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

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

...