Все учебники по продолжению, которые я могу найти, посвящены продолжениям с фиксированной длиной (т. Е. Структура данных имеет известное количество элементов при прохождении по ней
Я реализую DepthFirstSearch Negamax (http://en.wikipedia.org/wiki/Negamax) и пока кодработает, я хотел бы переписать код, используя продолжения
код, который у меня есть, выглядит следующим образом
let naiveDFS driver depth game side =
List.map (fun x ->
//- negamax depth-1 childnode opposite side
(x, -(snd (driver (depth-1) (update game x) -side))))
(game.AvailableMoves.Force())
|> List.maxBy snd
let onPlay game = match game.Turn with
| Black -> -1
| White -> 1
///naive depth first search using depth limiter
let DepthFirstSearch (depth:int) (eval:Evaluator<_>) (game:GameState) : (Move * Score) =
let myTurn = onPlay game
let rec searcher depth game side =
match depth with
//terminal Node
| x when x = 0 || (isTerminal game) -> let movescore = (eval ((),game)) |> fst
(((-1,-1),(-1,-1)),(movescore * side))
//the max of the child moves, each child move gets mapped to
//it's associated score
| _ -> naiveDFS searcher depth game side
, где обновление обновляет состояние игры с заданным ходом, eval оценивает состояние игрыи возвращает инкремент (в настоящее время не используется) для инкрементальной оценки, а isTerminal оценивает, является ли позиция конечной позицией или нет.
Проблема заключается в том, что мне нужно зарегистрировать неизвестное количество действий (каждый оставшийся список.map итерацию) к продолжению, и я на самом деле не могу придумать эффективный способ сделать это.
Поскольку это экспоненциальный алгоритм, я, очевидно, стремлюсь сохранить его как можно более эффективным (хотя мойМозг болит, пытаясь понять это наше, поэтому я хочу получить ответ больше, чемэффективный)
Спасибо