所以,如果我理解你的問題正確的話,我認爲以下(圍棋)的代碼將在解決的問題。如果你可以假設的積分在每個分佈是相等的(這意味着有可能轉變到彼此) ,然後在整個分配過程中左右移動,並在每個點上找出需要從右側移動多少污物,或者需要將多餘的污物從那裏移到左側。在所有情況下,您都可以假設您需要的任何污垢都能夠得到,因此可以暫時使用「負面」污垢。
// Finds out how to move dirt to transform b into a.
// assumes that the integrals over a and b are equal
func earthMover(a, b []int) []int {
r := make([]int, len(a))
for i := 0; i < len(a); i++ {
// if diff is positive it means that there is too much dirt here and it
// must be moved to the right. if it is negative it means some dirt
// needs to be pulled in from the right. In either case dirt can be
// moved over multiple spaces.
diff := b[i] - a[i]
r[i] = diff
b[i] -= diff
if i < len(a) - 1 {
b[i+1] += diff
}
}
return r
}
這裏是一個例子。負數表示污物從右側被拉入,正數表示從左側到右側。我覺得你的指標你只是總結了所有的移動數組中的數字,所以這種情況下的解決方案是5
target: [ 3 0 1 0 2 6]
source: [ 1 1 5 0 1 4]
move: [-2 -1 3 3 2 0]
現在,我看到的是,如果這是真正你想要什麼,然後你真的在尋找分佈的均值或質量中心(污垢)的差異。例如:
0 1 2 3 4 5
target: [ 3 0 1 0 2 6]
weighted: 0 +0 +2 +0 +8+30 = 40
source: [ 1 1 5 0 1 4]
weighted: 0 +1+10 +0 +4+20 = 35
正如你所看到的,目標減去源的質量中心的質量中心是我們前面拿到了號,40 - 35 = 5
嗯,好的,這個比我想象的要簡單得多。我想我必須仔細看看爲什麼這可以減少到這樣一個簡單的公式(但我現在太累了)。我也猜想在這種情況下,我的第一個適應EMD的想法並不能真正幫助解決我所看到的任務。我可能需要進一步調查。 – LiKao 2012-04-04 20:30:08