Tôi không chắc chắn làm thế nào để vẽ song song giữa thuật toán Wagner của Fischer và dtw algo. Trong cả hai trường hợp, chúng tôi muốn tìm khoảng cách của mỗi kết hợp chỉ mục (i, j).
Trong Wagner hay Fischer, chúng tôi bắt đầu khoảng cách bằng số lần chèn mà chúng tôi phải thực hiện từ chuỗi này sang chuỗi khác.
let wagnerFischer (s: string) (t: string) =
let m, n = s.Length, t.Length
let d = Array2D.create (m + 1) (n + 1) 0
for i = 0 to m do d.[i, 0] <- i
for j = 0 to n do d.[0, j] <- j
for j = 1 to n do
for i = 1 to m do
d.[i, j] <- List.min [
d.[i-1, j ] + 1;
d.[i , j-1] + 1;
d.[i-1, j-1] + if s.[i-1] = t.[j-1] then 0 else 1; ]
printfn "edit matrix \n %A" d
d.[m,n]
trong DWT, chúng tôi bắt đầu ranh giới ở + vô cùng vì chúng tôi không muốn 'bỏ qua' bất kỳ số nào của chuỗi, chúng tôi luôn muốn khớp với một mục khác.
Những gì tôi không thấy là những gì thay đổi giữa DWT và WF algo ngăn không cho sử dụng để cập nhật khoảng cách theo cách đồng nhất. Trong DWT, chúng tôi thêm chi phí một cách có hệ thống, trong khi trong thuật toán WF, chúng tôi có chức năng không phải là nhà này, viết các trường hợp khác nhau
Tôi hiểu cả hai thuật toán, nhưng không tạo ra sự liên quan giữa những khác biệt trong cập nhật hàm chi phí .. Có ý tưởng nào để hiểu sự khác biệt bằng trực giác không?
let sequencebacktrack (s: 'a seq) (t:'a seq) (cost:'a->'a->double) (boundary:int->double) =
let m, n = s |> Seq.length, t |> Seq.length
let d = Array2D.create (m + 1) (n + 1) 0.
for i = 0 to m do d.[i, 0] <- boundary(i)
for j = 0 to n do d.[0, j] <- boundary(j)
t |> Seq.iteri( fun j tj ->
s |> Seq.iteri( fun i si ->
d.[1+i, 1+j] <- cost tj si + List.min [d.[1+i-1, 1+j ];
d.[1+i , 1+j-1];
d.[1+i-1, 1+j-1]; ] ))
printfn "edit matrix \n %A" d
d.[m,n]
//does not work
let wagnerFischer2 (s: string) (t: string) =
sequencebacktrack s t (fun a b -> if a = b then 0. else 1.) (id >> double)
let b = wagnerFischer2 "ll" "la"