Tôi muốn giải quyết vấn đề sau trong C++:Chọn khoảng cách ngắn nhất giữa các cặp thành phần
Tôi có 6 phần tử: A1, A2, A3, B1, B2, B3. Tôi muốn kết hợp chính xác một B với chính xác một A, theo cách mà tổng số kết quả phù hợp là nhỏ nhất.
Sau đây là cách tôi nghĩ về cách viết một thuật toán tham lam đơn giản (có thể không được tối ưu, nhưng dường như đủ tốt cho tôi):
- Đo khoảng cách giữa tất cả các cặp AB, lưu nó trong một mảng 2D của nổi.
- Sắp xếp mảng 2D thành các giá trị riêng lẻ, giống như lambda sắp xếp bên dưới:
- Đặt kết quả phù hợp nhất cho A, tắt tìm kiếm B và A đã chọn (tắt cột và hàng 2D).
- Chọn số nhỏ nhất từ mảng vẫn có sẵn.
- v.v., cho đến khi tất cả các kết quả phù hợp được thực hiện.
Có hai câu hỏi thú vị ở đây:
Bạn có thể cho tôi biết thế nào là vấn đề này được gọi là, và chỉ cho tôi một số giải pháp phù hợp với nó, trong trường hợp họ tồn tại?
Bạn có thể cho tôi biết cách bạn triển khai thuật toán tham lam ở trên trong C++? Cho đến nay tôi nghĩ về việc sử dụng chức năng này để sắp xếp
Đây là mã:
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];
});
Và tôi nghĩ rằng tôi muốn giữ một vector<bool> selectedA, selectedB;
để theo dõi các yếu tố được lựa chọn, nhưng tôi không biết nó sẽ như thế nào.
Lưu ý: OK, không có điểm nói về hiệu suất cho 3,3 phần tử, nhưng tôi thực sự quan tâm đến giải pháp thực sự cho vấn đề này, khi số lượng phần tử lớn hơn nhiều.
Cảm ơn rất nhiều, có vẻ như Hungary Thuật toán là một trong tôi chính xác cần thiết.Dường như các giải pháp dường như gần gũi hơn với toàn bộ thư viện hơn là chỉ một vài dòng, tôi vẫn hy vọng giải quyết phiên bản đơn giản (tham lam, 3 yếu tố duy nhất) của vấn đề chỉ trong một vài dòng. – zsero
Rất vui được làm việc cho bạn! =) – justhalf
Thực ra, tôi nghĩ cho 3 yếu tố, giải pháp brute-force sẽ chỉ mất 3! = 6 vòng, vì vậy tôi chỉ có thể làm một giải pháp brute-force. – zsero