Phụ lục bên dưới, làm rõ các điều khoản k(k−1) :
Vì vậy, nếu bạn kiểm tra các thuật ngữ trong biểu thức, bạn có thể hình dung (dưới dạng tương tự), thuật ngữ là một phép liệt kê của tất cả các chuỗi nhị phân chứa 1 có vị trí 1 ở vị trí đầu tiên. Nói cách khác, chúng ta để cho mỗi vị trí trong chuỗi nhị phân đại diện cho sự lựa chọn liệu một trong số thành phố trong vấn đề có nằm trong tập hợp con chính xác mà chúng ta đang xem xét tại thời điểm đó hay không. Vì vậy, đối với 5 thành phố, 10101 tương ứng với tập hợp con {1,3,5}.(n−1k)kn
Do đó, để tính toán trên tất cả các tập hợp con của {1, ..., }, chúng ta chỉ cần đếm qua từng tập hợp con nhị phân (tức là đếm qua chuỗi nhị phân) có kích thước = 2 (tức là chuỗi nhị phân có kích thước chứa hai 1), sau đó kích thước = 3, sau đó kích thước = 4, ... sau đó kích thước = n. (Lưu ý rằng tập hợp kích thước = 1 chỉ phải chứa thành phố đầu tiên và do đó, việc tính khoảng cách một phần của nó là không liên quan, vì khoảng cách từ 1 -> tất cả các thành phố khác trong tập hợp con -> 1 chính xác là 0.)nn
Tại mỗi tập hợp con với thành phố, chúng ta phải xem xét tối đa ứng cử viên - đường dẫn một phần, tối ưu. Cụ thể, đường dẫn tổng, tối ưu có thể đi ngang qua tập hợp con đã cho và kết thúc ở bất kỳ thành phố , ngoại trừ thành phố đầu tiên. Sau đó, với mỗi đường dẫn phụ ứng cử viên như vậy, chúng tôi tính toán chuyến tham quan tối ưu đến điểm đó là mức tối thiểu của bất kỳ đường dẫn phụ nào trước đó, size = cộng với khoảng cách từ thành phố đầu cuối cho đường dẫn phụ đó đến thành phố đầu cuối cho đường dẫn ứng viên hiện tại. Điều này đưa ra những so sánh như vậy mà chúng ta phải thực hiện. Sự khác biệt giữa thuật ngữ vàkk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)thuật ngữ trong phân tích được liên kết là một sự khác biệt về công chứng (tôi sẽ tổng hợp trên một phạm vi khác, theo định nghĩa của tôi về so với họ đã làm). Tuy nhiên, ít nhất, nó nên minh họa độ phức tạp bậc hai của thuật ngữ đó.k
Thật thú vị - Tôi vừa hoàn thành mã hóa thuật toán chính xác này trong C ++ một vài phút trước. (Vì vậy, hãy tha thứ cho tiếp tuyến từ lý thuyết thuần túy vào một cuộc thảo luận thực tế nhỏ. :))
Nó tốn thời gian và không gian - ít nhất là dưới sự thực hiện của tôi. Thực tế mà nói, khi yêu cầu không gian của bạn tăng nhanh, chúng trở nên đau đớn hơn so với yêu cầu về thời gian. Chẳng hạn, trên PC của tôi (có 4 GB RAM), tôi có thể giải quyết các trường hợp với tối đa 24 thành phố - nhiều hơn thế và tôi hết bộ nhớ.O(2nn2)O(2nn)
Tất nhiên, tôi chỉ có thể là một lập trình viên tồi, và bạn có thể làm tốt hơn tôi trong thực tế. :)
Chỉnh sửa: Một chi tiết cụ thể hơn về một chi tiết của câu hỏi của bạn: Thuật ngữ xuất phát từ thực tế là bạn phải, trong trường hợp xấu nhất, tính khoảng cách tối ưu một phần từ các tập con trước đó (có nhiều nhất trong số họ, lưu ý rằng được tính tổng trong phân tích mà bạn đã liên kết) với phân tích hiện tại. Điều này đòi hỏi, một lần nữa trong trường hợp xấu nhất, so sánh với các tập hợp con có kích thước với tổng số .k(k−1)nknO(k)k−1O(k2)
Ngoài ra, nếu lời giải thích của tôi không đủ rõ ràng, đây là một số ghi chú bài giảng hay của Vazirani ( PDF ). Cuộn xuống P. 188 để thảo luận về TSP, bao gồm phân tích về Held-Karp.