F#中的2D动态编程

时间:2012-07-11 11:22:00

标签: f# dynamic-programming

我需要在F#中用2D实现一个简单的动态编程算法。对于简单的1D案例,Seq.unfold似乎是要走的路,例如, https://stackoverflow.com/a/7986083/5363

是否有一种很好的(有效的)方法可以在2D中实现类似的结果,例如在函数式中重写以下伪代码:

  let alpha = 
    let result = Array2D.zeroCreate N T
    for i in 0 .. N-1 do
      result.[0, i] <- (initialPi i) * (b i observations.[0])
    for t in 1 .. T-1 do
      for i in 0 .. N-1 do
        let s = row t-1 result |> Seq.mapi (fun j alpha_t_j -> alpha_t_j * initialA.[i, j]) () |> Seq.sum
        result.[t, i] <- s * (b i observations.[t])
    result 

假设所有缺少的函数和数组都在上面定义。

1 个答案:

答案 0 :(得分:1)

编辑:实际读取代码,这至少是功能性的,确实有一个稍微不同的返回类型,尽管你可以通过转换避免这种情况

let alpha = 
    let rec build prev idx max = 
        match idx with
        |0 -> 
            let r = (Array.init N (fun i -> (initialPi y) * (b i observations.[0]))
            r:: (build r 1 max)
        |t when t=max -> []
        |_ ->  
             let s = prev |> Seq.mapi (fun j alpha_t_j -> alpha_t_j * initialA.[i, j]) () |> Seq.sum
             let r = Array.init N (fun i -> s * (b i observations.[t]))
         r:: build r (idx+1 max)
    build [] 0 T |> List.toArray