При использовании Minimax с отсечкой альфа-бета, возможно ли иметь альфа и бета в качестве переменных класса вместо отправки их через рекурсию?
Вместо:
private ValuedMove AlphaBetaSearch(Board state)
{
return MaxValue(state, 0, int.MinValue, int.MaxValue);
}
private ValuedMove MaxValue(Board state, int d, int alpha, int beta)
{
if (d == depth || state.GameRunning == false)
return new ValuedMove(Heuristic.BoardValue(state, Player));
ValuedMove v = new ValuedMove(int.MinValue);
foreach (Move move in LegalMoves)
{
ValuedMove minCheck = MinValue(state.ImagineMove(move), d + 1, alpha, beta);
if (v.Value >= beta)
return v;
alpha = Max(alpha, v.Value);
}
return v;
}
private ValuedMove MinValue(Board state, int d, int alpha, int beta)
{
//Minimax and Alpha-Beta logic here
}
Могу ли я написать:
int alpha, beta;
private ValuedMove AlphaBetaSearch(Board state)
{
alpha = int.MinValue;
beta = int.MaxValue;
return MaxValue(state, 0);
}
private ValuedMove MaxValue(Board state, int d)
{
//Minimax and Alpha-Beta logic here
}
private ValuedMove MinValue(Board state, int d)
{
//Minimax and Alpha-Beta logic here
}
Я спрашиваю, потому что, когда я пытался оптимизировать код, делая это (я думал, что, если мне не нужно отправлять целые числа для каждой рекурсии, я мог бы очистить немного времени), мой шахматист неожиданно стал идиотом, жертвуя своей королевой, чтобы убить пешку, и делая другие глупые ошибки.
Он постоянно выступает намного беднее своего «обычного альфа-бета» противника, что, я думаю, объясняется тем, что он также ищет только небольшой процент дерева по сравнению со своим противником (оба используют одинаковую глубину, но модифицированный игрок кажется, сокращает более агрессивный, и тем самым уменьшает количество посещаемых узлов). Я сделал это дважды сейчас, чтобы убедиться, и я не изменяю ничего, кроме того, что я вычеркнул здесь.
Если я правильно понял алгоритм альфа-бета, это не должно иметь никакого значения, но для моего шахматиста это так. Я что-то делаю не так?
Итак, мой главный вопрос сейчас не в том, является ли это разумной оптимизацией или практикой кода, а скорее в том, должно ли это быть возможно или нет.