0

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

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

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

EDIT: Я понял, почему он играет странно. Когда я искал ходы (глубина 5), он заканчивался движением AI (уровень узла MAX). Поступая таким образом, он учитывал такие движения, как захват рыцаря с ладьей, даже если он сделал его уязвимым (алгоритм не может его увидеть, потому что он не ищет глубже этого). Итак, я изменил это, и я установил глубину до 6, так что она заканчивается уровнем узла MIN. Его движения теперь имеют больший смысл, поскольку он на самом деле мстит при атаке (чего он иногда не делал и вместо этого играл немой ход).

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

+0

Alpha-beta нуждается в информации о ранее оцененных линиях. Не сами ходы, а значения _alpha_ и _beta_. На английском языке это примерно означает: «Я уже могу заставить счет _alpha_ использовать предыдущую строку, поэтому, если у моего оппонента есть какая-либо защита, ведущая к результату ниже, чем _alpha_, я могу перестать оценивать все остальные ходы в этой позиции». Поэтому, как только вы обнаружите помощника в 2, вы распространяете эту оценку на оставшуюся часть анализа и используете ее для обрезания помощника в 7. –

+0

@ C.Frâncu Хорошо, я согласен, что это то, что должен делать алгоритм. Но если я только оцениваю свою доску на самой высокой глубине (и поэтому проверяю помощника на этой самой глубине), он не может найти помощника в 2, потому что он видит только результат, например, 8 ходов (если задана глубина до 8). И это проблема в том, что алгоритм просто задерживает помощника (поскольку после каждого хода он может идти глубже в поиске). – Gradapin

+0

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

ответ

1

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

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

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

0

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

Кроме того, из того, что вы описали, вам нужен поиск покоя.

Все это (и многое другое) объясняется в wiki программирования шахмат. Вы должны это проверить: https://chessprogramming.wikispaces.com/Checkmate#MateScore https://chessprogramming.wikispaces.com/Quiescence+Search

Смежные вопросы