我想用C++解決以下問題:選擇元素對之間的最短距離
我有6個元素:A1,A2,A3,B1,B2,B3。我希望完全匹配一個B到一個A,以這樣的方式,所得匹配的總和最小。
這裏是我想過寫一個簡單的貪心算法(可能不是最優的,但似乎不錯,足以讓我):
- 測量所有AB對之間的距離,將其保存在一個二維數組彩車。
- 將二維數組排序爲單個值,如下面的排序lambda:
- 設置該A的最佳匹配,禁用搜索所選B和A(禁用2D中的一列和一行)。
- 從仍然可用的數組中選擇最小的數字。
- 等等,直到所有匹配成功。
這裏有兩個有趣的問題:
你能告訴我怎麼叫這個問題,並指出我給它一些適當的解決方案,在它們存在的情況下?
你能告訴我你將如何在C++中實現上述貪婪算法?到目前爲止,我想過使用此功能進行排序
下面是代碼:
float centerDistances[3][3]; // .. random distances
vector<int> idx(9);
for (size_t i = 0; i != idx.size(); ++i) idx[i] = i;
sort(idx.begin(), idx.end(), [](int i1, int i2)
{
return centerDistances[0][i1] < centerDistances[0][i2];
});
我想我會保持一個vector<bool> selectedA, selectedB;
跟蹤選定的元素,但我不知道它會如何。
注意:好的,關於3,3個元素的性能沒有意義,但是當元素數量大得多時,我真的很關心這個問題的真正解決方案。
非常感謝的作品,似乎匈牙利算法是一個我正好需要。看起來解決方案似乎更接近整個圖書館,而不僅僅是幾行,我仍然希望通過幾行解決問題的簡單(貪婪,僅3個元素)版本。 – zsero
很高興爲您效力! =) – justhalf
實際上,我認爲對於3個元素,蠻力解決方案只需要3個! = 6個循環,所以我可能只是做一個蠻力解決方案。 – zsero