Hãy áp dụng Branch and Bound cho Knapsack , hy vọng điều này sẽ làm cho khái niệm rõ ràng với bạn.
Chúng tôi có mục, được dán nhãn đến . là giá trị của th mục, và trọng lượng của nó. Chúng tôi cố gắng lắp chúng vào một chiếc ba lô có thể chứa tổng trọng lượng lên tới và chúng tôi cố gắng tối đa hóa tổng giá trị của vật phẩm chúng tôi đặt trong chiếc ba lô.1 n v i i w i Tn1nviiwiT
Cách tiếp cận backtrack thông thường là cơ sở của chúng tôi. Trước tiên, chúng tôi đặt vào gói, sau đó giải quyết vấn đề cho các mục còn lại bằng đệ quy. Sau đó, chúng tôi xóa khỏi gói và giải quyết vấn đề cho các mục lại và chúng tôi trả lại cấu hình tốt nhất mà chúng tôi đã tìm thấy. n - 1 v 1 n - 1v1n−1v1n−1
Việc quay lại này là phần 'Chi nhánh' của Chi nhánh và Giới hạn. Bạn phân nhánh (trong trường hợp Knapsack) hai trường hợp: 'mục là một phần của giải pháp' và 'mục không phải là một phần của giải pháp'. Bạn có thể hình dung đây là một cây nhị phân, trong đó con trái là một trường hợp và con phải là trường hợp khác. Cây này là cây tìm kiếm (hoặc không gian tìm kiếm ): độ sâu của nó là và do đó nó có các nút . Do đó, thuật toán có số mũ theo thời gian chạy theo số lượng vật phẩm.i n O ( 2 n )iinO(2n)
Bây giờ chúng ta đến phần 'Giới hạn': chúng tôi cố gắng tìm các tiêu chí sao cho có thể nói 'cấu hình này không bao giờ hoạt động, vì vậy chúng tôi có thể không bận tâm đến việc tính toán này'. Một ví dụ về tiêu chí như vậy là 'trọng lượng của các vật phẩm chúng tôi đã đặt trong ba lô vượt quá ': nếu chúng tôi đã thêm, giả sử, vật phẩm đầu tiên vào ba lô và do đó đã đầy, có không có điểm nào cố gắng đưa các vật phẩm đến trong ba lô, nhưng cũng không có lý do gì để cố gắng khớp bất kỳ tập hợp con nào của cho đến trong ba lô, vì nó đã đầy, vì vậy nó đã đầy chúng tôi lưu khoảng trường hợp. Một ví dụ khác là 'n / 2 n / 2 + 1 n n / 2 + 1 n 2 n / 2Tn/2n/2+1nn/2+1n2n/2ngay cả khi tôi đặt tất cả các mục còn lại, giá trị của các mục tôi đã đặt sẽ không vượt quá cấu hình tốt nhất tôi đã tìm thấy cho đến nay '.
Các tiêu chí này về cơ bản cắt bỏ các phần của cây tìm kiếm: tại một số nút, bạn nói, ví dụ 'cây con bên trái sẽ không cho tôi cấu hình tốt hơn, vì X', vì vậy bạn quên đi cây con đó và bạn không khám phá nó. Một cây con có chiều sâu mà bạn cắt ra theo cách này giúp bạn tiết kiệm các nút , có thể tăng một chút tốc độ nếu bạn may mắn.O ( 2 ngày )dO(2d)
Lưu ý rằng điều này được gọi là ' Bounding ' bởi vì nó thường liên quan đến một số loại thấp hơn hoặc trên ràng buộc: đối với tiêu chí ' ngay cả khi tôi đưa vào tất cả các mục còn lại, giá trị của các mặt hàng tôi đã đưa vào sẽ không vượt quá cấu hình tốt nhất Tôi đã tìm thấy cho đến nay ', giá trị của cấu hình tốt nhất của bạn cho đến nay là giới hạn thấp hơn đối với cấu hình tốt nhất, do đó, bất cứ điều gì sẽ không bao giờ vượt qua giới hạn thấp hơn này đều thất bại.
Bạn có thể làm cho phần 'Bounding' phức tạp như bạn muốn. Ví dụ, các vấn đề lập trình số nguyên thường được giải quyết bằng cách sử dụng thư giãn: bạn thư giãn chương trình của mình thành chương trình tuyến tính, bạn có thể giải quyết trong thời gian đa thức, và sau đó bạn có thể loại bỏ rất nhiều trường hợp cho các biến nhị phân của bạn sẽ không bao giờ giải quyết được. Sau đó bạn phân nhánh trên các tùy chọn còn lại.
Lưu ý rằng Branch and Bound thường chỉ giúp bạn tăng tốc độ trong thực tế, nhưng không phải trên lý thuyết: thật khó để nói chính xác có bao nhiêu cây tìm kiếm bị cắt bằng cách sử dụng phương pháp phỏng đoán của bạn. Điều này được chứng thực bằng số lượng heuristic khác nhau được sử dụng trong thực tế về các vấn đề như vậy. Nếu bạn không may mắn, cây tìm kiếm còn lại vẫn rất lớn ngay cả với rất nhiều ràng buộc.