Độ phức tạp thời gian của thuật toán Held-Karp cho TSP


9

Khi tôi xem qua " Cách tiếp cận lập trình động đối với các vấn đề tuần tự " của Michael Held và Richard M. Karp, tôi đã đưa ra câu hỏi sau: tại sao độ phức tạp của thuật toán của họ đối với TSP là (k=2n1k(k1)(n1k))+(n1) (trang 199), ý tôi là họ lấy yếu tố k đâu? Nếu tôi hiểu đúng k1 có nghĩa là số lượng bổ sung cho mỗi tập hợp con của các thành phố. Vậy thì tại sao mỗi thao tác bổ sung được kết hợp với các thao tác k không biết với tôi k? Tôi cho rằng nó được kết nối bằng cách nào đó để lấy tối thiểu, nhưng tính toán tối thiểu dường như không yêu cầu nhiều hoạt động như vậy.

Thuật toán lập trình động của Held và Karp và Bellman độc lập chạy như sau: cho mỗi cặp (S,ci) , nghĩa là một đường đi qua c1 , tất cả các yếu tố của S và kết thúc tại tính toán ci

OPT[S,ci]=min{OPT[S{ci},cj]+d(cj,ci):cjS{ci}},

trong đó d(cj,ci) có nghĩa là khoảng cách giữa các thành phố cjci . Sau đó, trong công thức từ giấy k có nghĩa là kích thước của S .

Câu trả lời:


5

Phụ lục bên dưới, làm rõ các điều khoản k(k1) :

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}.(n1k)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àkk1k1k1(k1)(k2)(k1)(k2)k(k1)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(k1)nknO(k)k1O(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.


Ồ dĩ nhiên rồi! Tôi cảm thấy ngớ ngẩn khi nghĩ về điều đó bây giờ; Tôi sẽ cập nhật câu trả lời của tôi. Tôi thực sự đã nghe nhận xét chính xác đó trước đây, và chỉ cần bình luận mà không nghĩ về nó. Và vâng - viết vào một tập tin / đọc từ một tập tin sẽ cho phép bạn đi một cách hiệu quả ở mức cao tùy ý về số lượng thành phố. ... đó cũng là một nỗi đau không đáng lo ngại trừ khi bạn cố gắng giải quyết các trường hợp TSP cho mục đích thực sự. Của tôi đã được quyết định không cho một mục đích thực tế. ;)
Daniel Apon

2
Thời gian để thực hiện thuật toán Bjorklund :)
Suresh Venkat

@Suresh: Ý kiến ​​hay!
Daniel Apon

@Daniel Apon Bạn có thể, xin vui lòng, làm cho chính xác lý do tại sao chúng ta cần so sánh khi tính toán "khoảng cách một phần, tối ưu"?
Oleksandr Bondarenko

@Oleksandr: Chắc chắn, tôi sẽ thêm nó vào đầu câu trả lời của tôi.
Daniel Apon

0

Lưu ý chính

Điều quan trọng cần lưu ý là chúng tôi tính toán và lưu trữ không phải
"khoảng cách của đường dẫn tối ưu combination of k cities"
mà là
"khoảng cách của đường dẫn tối ưu cho combination of k cities AND cho end-point city from this combination".
Hiểu nó sẽ giúp với ý nghĩa của hai số nhân đầu tiên trong công thức sau.

Giai đoạn đầu

Số lượng hoạt động trong giai đoạn đầu tiên là:

k>=2(n1k1)choose city combinationof size = k1(k1)choose city to be the lastfrom k1 citiesin chosen combination((n1)(k1))choose citythat is not in chosen combinationto add to path

Thiếu siêu ký tự trong tổng có nghĩa for all k>=2 that is valid for binomial coefficient. Vì vậy, thời hạn không hợp lệ cuối cùng của tổng sẽ là Điều đó có nghĩa là tổng của chúng tôi không nắm bắt được các lựa chọn cuối cùng của thành phố để kết nối với thành phố đầu tiên. Có thành phố để kết nối với thành phố đầu tiên. Vì vậy, cuối cùng chúng tôi sẽ thêm thuật ngữ này vào tổng.k=n1

(n1n2)(n2)1
n1

Hãy biến đổi công thức thành dạng mà bạn cung cấp cũng có trên trang Wikipedia Held-Karp .

k>=2(n1k1)(k1)((n1)(k1))=k>=2(n1)!(k1)!(nk)!(k1)(nk)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n1k)k(k1)
Thao tác hệ số nhị thức dẫn đến: Vì vậy, số lượng hoạt động trong lần đầu tiên pha là
k>=2(n1k)k(k1)=k>=2(n1)!k!(n1k)!k(k1)=k>=2(n3)!(k2)!(n3(k2))!(n1)(n2)=(n1)(n2)k>=2(n3k2)=(n1)(n2)2n3
(n1)(n2)2n3+(n1)

Giai đoạn thứ hai

Giai đoạn thứ hai đang khôi phục đường dẫn tối ưu bằng các dấu hiệu chúng ta đã thực hiện trong giai đoạn đầu tiên đồng thời với khoảng cách tính toán.

Đối với mỗi đường dẫn tối ưu "cho combination of k cities AND cho end-point city from this combination", chúng tôi đã lưu thành phố thứ hai đến cuối cùng.

Để quay lại đường dẫn tối ưu, chúng ta cần yêu cầu một số cấu trúc dữ liệu trả về thành phố thứ hai đến cuối cùng "cho combination of k cities AND cho end-point city from this combination". Vì vậy, cấu trúc dữ liệu này phải là một cái gì đó như
Map<combination of k cities, Map<last city, second-to-last city>>. Như chỉ số của combination of k citieschúng ta có thể sử dụng, ví dụ , binary_string[city id]=1 if city id is in combination. Vì vậy, chúng ta cần xem xét tất cả các yếu tố combination of k citiesđể xác định kết hợp và lập chỉ mục cấu trúc dữ liệu của chúng tôi. Điều này cung cấp cho chúng tôi số lượng hoạt động cho giai đoạn thứ hai:

k>=2n1k=(n)(n1)21

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.