todos los tutoriales de continuación que podemos encontrar son en continuaciones de longitud fija (es decir, la estructura de datos tiene un número conocido de artículos ya que está siendo atravesadoContinuación Complejo en Fa #
Me estoy poniendo en práctica depthFirstSearch negamax (http: // en .wikipedia.org/wiki/negamax) y mientras que el código funciona, me gustaría volver a escribir el código usando continuaciones
el código que tengo es el siguiente
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
la actualizará cuando actualiza un gamestate con un con un movimiento dado, eval evalúa el estado del juego y r crea un incremento (actualmente no utilizado) para la evaluación incremental y esTerminal evalúa si la posición es o no una posición final.
El problema es que tengo que registrar un número desconocido de acciones (cada iteración list.map restante) a la continuación, y realmente no puedo concebir una forma eficiente de hacerlo.
Dado que este es un algoritmo exponencial, obviamente estoy buscando mantener esto tan eficiente como sea posible (aunque mi cerebro daña tratando de resolver esto nuestra, por lo que sí quiero la respuesta más de un uno eficiente)
Gracias