Как выбрать узел с помощью Alpha Beta

Я реализую AI для игры Othello, используя MiniMax с обрезкой Alpha Beta. Я реализовал алгоритм альфа-бета, который сообщает мне значение, которое я могу получить, но не указывает, какой узел мне следует выбрать? Итак, мой вопрос заключается в том, как я могу использовать Alpha-Beta, чтобы сказать мне, какой узел я должен выбрать, а не то, каким будет результирующее значение. Вот псевдокод для моего алгоритма Alpha-Beta.

01 function alphabeta(node, depth, α, β, maximizingPlayer)
02      if depth = 0 or node is a terminal node
03          return the heuristic value of node
04      if maximizingPlayer
05          v := -∞
06          for each child of node
07              v := max(v, alphabeta(child, depth – 1, α, β, FALSE))
08              α := max(α, v)
09              if β ≤ α
10                  break (* β cut-off *)
11          return v
12      else
13          v := ∞
14          for each child of node
15              v := min(v, alphabeta(child, depth – 1, α, β, TRUE))
16              β := min(β, v)
17              if β ≤ α
18                  break (* α cut-off *)
19          return v

person Matthew Fennell    schedule 31.12.2016    source источник
comment
не то, каким будет результирующее значение, но вам это тоже нужно. Вам нужно вернуть 2 вещи. Точный ответ будет зависеть от определения вашего node , языка программирования и т. д.   -  person Henk Holterman    schedule 31.12.2016
comment
@HenkHolterman Зачем мне возвращать результирующее значение? Если бы мое дерево было, например, бинарным деревом поиска, мне просто нужно было бы знать, какой из двух узлов выбрать, а не какое значение? Конечно, мне понадобится это значение, чтобы определить, какой узел выбрать.   -  person Matthew Fennell    schedule 31.12.2016
comment
Вы только что сами себе ответили: определить, какие...   -  person Henk Holterman    schedule 31.12.2016
comment
Я не думаю, что вы понимаете мой вопрос. Алгоритм определяет, какой путь выбрать, и получает правильный результат, который должен быть получен. Мне просто нужно вернуться, чтобы узнать, какой узел был выбран начальным, но поскольку у меня есть только конечный результат, как я могу узнать путь к узлу с этим значением?   -  person Matthew Fennell    schedule 31.12.2016


Ответы (1)


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

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

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

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

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

person Philipp Claßen    schedule 01.01.2017
comment
Просто чтобы уточнить, таблица транспонирования может добавить значительные накладные расходы (меньше, если вы используете хэширование Зобриста). Но эти затраты обычно значительно компенсируются уменьшением размера дерева поиска. - person Nathan S.; 03.01.2017
comment
@НатанС. Истинный. Отсутствие накладных расходов предполагает, что поиск уже использует таблицу транспонирования, но до сих пор я не видел оптимизированного поиска Alpha Beta без таблиц транспонирования. По крайней мере, в шахматах каждый движок использует его, в основном для улучшения порядка ходов. Я думаю, то же самое касается и других подобных игр (например, Reversi). - person Philipp Claßen; 04.01.2017
comment
@PhillipClaßen Совершенно верно - единственная игра, в которой вы не будете использовать таблицу транспонирования, - это игра, в которой очень мало транспозиций. - person Nathan S.; 06.01.2017