7

私が見つけることができるすべての継続チュートリアルは、固定長の継続に関するものです(つまり、データ構造には、トラバースされているため、既知の数のアイテムがあります

私は 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

ここで、 update は特定の動きでゲームの状態を更新し、 eval はゲームの状態を評価し、インクリメンタル評価のためにインクリメンター (現在は使用されていません) を返し、 isTerminal は位置が終了位置かどうかを評価します。

問題は、不明な数のアクション (残っているすべての list.map 反復) を継続にサインアップする必要があり、実際にこれを行う効率的な方法を思いつかないことです。

これは指数関数的なアルゴリズムなので、明らかにこれを可能な限り効率的に保つようにしています (ただし、これを理解しようとすると頭が痛くなるので、効率的なものよりも答えが必要です)。

ありがとう

4

1 に答える 1