Chciałbym rozwiązać następujący problem w C++:Wybór najkrótszej odległości między parami elementów
Mam 6 elementów: A1, A2, A3, B1, B2, B3. Chciałbym dopasować dokładnie jeden B do dokładnie jednego A, w taki sposób, aby suma wynikowych dopasowań była najmniejsza.
Oto jak myślałem o pisaniu prosty chciwy algorytm (może nie być optymalna, ale wydaje się wystarczająco dobre dla mnie):
- Zmierz odległość między wszystkimi parami AB, zapisać go w tablicy 2D pływa.
- Posortuj tablicę 2D jako pojedyncze wartości, podobnie jak rodzaj lambda poniżej:
- Ustaw najlepsze dopasowanie dla tego A, wyłącz wyszukiwanie odpowiednich B i A (wyłącz kolumnę i wiersz w 2D).
- Wybierz najmniejszą liczbę z wciąż dostępnej tablicy.
- itd. Itd., Dopóki nie zostaną wykonane wszystkie mecze.
Istnieją dwa interesujące pytania tutaj:
Może mi pan powiedzieć, jak się nazywa ten problem i wskazać mi niektórych odpowiednich rozwiązań do niej, w przypadku gdy istnieje?
Czy możesz mi powiedzieć, jak zaimplementowałeś powyższy chciwy algorytm w C++? Do tej pory myślałem o użyciu tej funkcji można sortować
Oto kod:
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];
});
I myślę, że zachowa vector<bool> selectedA, selectedB;
śledzić wybranych elementów, ale ja nie wiem, jak dobrze by to było.
Uwaga: OK, nie ma sensu mówić o wydajności dla 3,3 elementów, ale byłbym naprawdę zainteresowany prawdziwym rozwiązaniem tego problemu, gdy liczba elementów jest znacznie większa.
dzięki dużo wydaje węgierski Algorytm jest jeden ja dokładnie potrzebują.Wydaje się, że rozwiązania wydają się bliższe całemu bibliotekom niż tylko kilku linijkom, ale mam nadzieję rozwiązać prostą (chciwą, tylko 3-elementową) wersję problemu w zaledwie kilku linijkach. – zsero
Cieszę się, że działa dla Ciebie! =) – justhalf
Właściwie, myślę, że w przypadku 3 elementów rozwiązanie typu "brute-force" zajmie tylko 3! = 6 pętli, więc mógłbym po prostu zrobić brutalne rozwiązanie. – zsero