所有延續教程我能看到的是在固定長度的延長體(即數據結構具有已知的一些項目,因爲它正在走過情結延續
我實現深度優先搜索Negamax(HTTP:// EN .wikipedia.org /維基/ Negamax),並在代碼的工作,我想使用continuation
重寫代碼我的代碼如下所示
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評估遊戲狀態和r會產生一個增量值(當前未使用)用於增量評估,isTerminal會評估該位置是否爲結束位置。
問題是我必須註冊未知數量的動作(每個剩餘的list.map迭代)才能繼續,而實際上我無法想象這樣做的有效方式。
因爲這是一個指數算法,我顯然希望保持這種儘可能高效(雖然我的大腦好痛試圖弄清楚這是我們的,所以我想要的答案不是一個有效率的多)
謝謝