Я программирую шахматный AI с использованием алгоритма обрезки альфа-бета, который работает на фиксированной глубине. Я был очень удивлен, увидев, что, установив ИИ на более высокую глубину, он сыграл еще хуже. Но я думаю, что я понял, почему так.Как рассчитать порядок перемещения в оценке шахматной доски
В настоящее время это работает: все позиции указаны, и для каждого из них перечислены все позиции из этого перемещения и т. Д. ... Пока не будет достигнута фиксированная глубина: плата оценивается путем проверки того, какие части присутствуют и устанавливают значение для каждого типа штук. Затем значение пузырится до корня, используя минимаксный алгоритм с альфа-бета. Но мне нужно учитывать порядок перемещения. Например, есть два варианта: мат в 2 ходах, а другой - в 7 ходов, затем нужно выбрать первый. То же самое относится к тому, чтобы взять королеву в 3 или 6 ходах. Но так как я только оцениваю плату на самых глубоких узлах и что я только проверяю плату как результат оценки, она не знает, каковы были предыдущие шаги.
Я уверен, что есть лучший способ оценить игру, которая может объяснить способ перемещения предметов по поиску.
EDIT: Я понял, почему он играет странно. Когда я искал ходы (глубина 5), он заканчивался движением AI (уровень узла MAX). Поступая таким образом, он учитывал такие движения, как захват рыцаря с ладьей, даже если он сделал его уязвимым (алгоритм не может его увидеть, потому что он не ищет глубже этого). Итак, я изменил это, и я установил глубину до 6, так что она заканчивается уровнем узла MIN. Его движения теперь имеют больший смысл, поскольку он на самом деле мстит при атаке (чего он иногда не делал и вместо этого играл немой ход).
Тем не менее, теперь он более защищен, чем когда-либо, и не играет: он перемещает своего рыцаря, а затем переводит его обратно в то место, которое было до этого, и, следовательно, оно заканчивается потерей. Моя оценка очень стандартная, только наличие штук имеет значение для значения узла, поэтому она может свободно выбирать желаемую стратегию, не заставляя ее делать то, что ей не нужно. Замедление того, что это нормальное поведение для моего алгоритма? Является ли это признаком того, что мой алгоритм альфа-беты плохо реализован или это совершенно нормально с такой функцией оценки?
Alpha-beta нуждается в информации о ранее оцененных линиях. Не сами ходы, а значения _alpha_ и _beta_. На английском языке это примерно означает: «Я уже могу заставить счет _alpha_ использовать предыдущую строку, поэтому, если у моего оппонента есть какая-либо защита, ведущая к результату ниже, чем _alpha_, я могу перестать оценивать все остальные ходы в этой позиции». Поэтому, как только вы обнаружите помощника в 2, вы распространяете эту оценку на оставшуюся часть анализа и используете ее для обрезания помощника в 7. –
@ C.Frâncu Хорошо, я согласен, что это то, что должен делать алгоритм. Но если я только оцениваю свою доску на самой высокой глубине (и поэтому проверяю помощника на этой самой глубине), он не может найти помощника в 2, потому что он видит только результат, например, 8 ходов (если задана глубина до 8). И это проблема в том, что алгоритм просто задерживает помощника (поскольку после каждого хода он может идти глубже в поиске). – Gradapin
Это зависит от вашей реализации. В идеале, на глубине 2 вы должны понимать, что, поскольку нет никаких юридических действий, игра должна каким-то образом закончиться (либо мат, либо тупик). Что делает ваш алгоритм, когда поколение поколений не возвращает никаких ходов? –