Vấn đề xác định xem một chương trình có "hiệu suất tối ưu" A hay "hiệu suất tối ưu" B cho bất kỳ định nghĩa nào về "hiệu suất tối ưu" nói chung là không thể giải quyết được (bằng chứng dưới đây). Điều này ngụ ý rằng không có phương pháp duy nhất nào có thể cho bạn biết thuật toán tối ưu như thế nào.
Tuy nhiên, có những phương pháp thường được áp dụng khi phân tích các thuật toán gần đúng. Thông thường, các thuật toán gần đúng được đánh giá bởi sự đảm bảo của chúng về mức độ giải pháp của nó so với giải pháp tối ưu. Tôi sẽ đưa ra một ví dụ về vấn đề và xấp xỉ, mà tôi sẽ chứng minh bằng cách sử dụng phương pháp 'giới hạn dưới', đây là một phương pháp được sử dụng rất phổ biến để chứng minh các tỷ lệ.
Vấn đề được đặt ra là vấn đề 'Tải xe tải': chúng tôi có rất nhiều xe tải giống hệt nhau (bao nhiêu tùy thích), mỗi chiếc có khả năng mang tải trọng tối đa T. Chúng tôi có n đối tượng chúng tôi muốn tải trong các xe tải này cho vận chuyển. Mỗi đối tượng tôi có trọng lượng w_i, trong đó w_i <= T (vì vậy không có vật phẩm nào không thể tự lắp vào xe tải). Các mục không thể được chia thành các phần. Chúng tôi muốn lấp đầy xe tải để chúng tôi cần càng ít xe tải càng tốt. Vấn đề này là NP-đầy đủ.
Có một thuật toán xấp xỉ rất dễ dàng cho vấn đề này. Chúng tôi chỉ đơn giản là bắt đầu tải một chiếc xe tải với các mặt hàng, cho đến khi chiếc xe tải đầy đến mức các mặt hàng tiếp theo sẽ không phù hợp. Sau đó, chúng tôi lấy một chiếc xe tải khác và tải chiếc xe tải này với mặt hàng không phù hợp với chiếc xe tải trước đó. Chúng tôi không tải thêm bất kỳ vật phẩm nào trên chiếc xe tải này: thay vào đó, chúng tôi lấy một chiếc xe tải mới, chúng tôi lại lấp đầy nó với rất nhiều vật phẩm cho đến khi nó không còn phù hợp nữa, đặt vật phẩm cuối cùng đó lên xe tải của chính nó và cứ thế.
Thuật toán này được gọi là xấp xỉ 2 cho vấn đề: nó sử dụng nhiều nhất gấp đôi số lượng xe tải mà giải pháp tối ưu cần có. "Nhiều nhất" là rất quan trọng: chúng ta có thể may mắn và tìm ra giải pháp tối ưu, nhưng ít nhất chúng ta sẽ không làm quá tệ.
Để chứng minh điều này, trước tiên chúng tôi xác định giới hạn thấp hơn về số lượng xe tải tối ưu chúng tôi cần. Đối với điều này, hãy tưởng tượng rằng chúng ta được phép cắt các mục thành nhiều phần: sau đó chúng ta có thể dễ dàng lấp đầy mọi chiếc xe tải nhưng chiếc cuối cùng hoàn toàn. Số lượng xe tải chúng tôi cần nếu chúng tôi làm điều đó là giới hạn thấp hơn cho số lượng xe tải chúng tôi cần cho câu hỏi ban đầu: trong trường hợp 'tốt nhất', giải pháp tối ưu luôn lấp đầy mọi xe tải, trong trường hợp đó là số lượng xe tải là bằng nhau, nhưng nếu các giải pháp tối ưu khiến xe tải không được lấp đầy, thì nó chỉ có thể cần nhiều xe tải hơn.
Bây giờ chúng tôi xem xét thuật toán gần đúng của chúng tôi. Lưu ý rằng trong mỗi bước, chúng tôi (một phần) lấp đầy hai xe tải. Cũng lưu ý rằng bằng cách thuật toán hoạt động, các mục trong xe tải thứ nhất và mục trong xe tải thứ hai không thể khớp với xe tải thứ nhất, vì vậy tổng của chúng ít nhất là T. Điều này có nghĩa là mỗi bước, chúng tôi tải ít nhất là đầy đủ xe tải giá trị các mặt hàng trên hai xe tải. Bây giờ so sánh điều này với giới hạn dưới của chúng tôi: trong trường hợp đó, chúng tôi tải một vật phẩm có giá trị đầy đủ trên một xe tải. Nói cách khác, thuật toán gần đúng của chúng tôi tính toán (theo thời gian tuyến tính) một giải pháp trông rất giống với "giải pháp" ràng buộc thấp hơn của chúng tôi, nhưng sử dụng hai xe tải thay vì một. Do đó, chúng tôi sử dụng nhiều nhất gấp đôi số xe tải so với thuật toán tối ưu, bởi vì chúng tôi sử dụng nhiều nhất gấp đôi số xe tải so với giới hạn dưới của chúng tôi về thuật toán tối ưu.
Thuật toán này đưa ra một xấp xỉ hệ số gần đúng: nó nhiều nhất là xấu gấp 2 lần so với giải pháp tối ưu. Một số ví dụ về các biện pháp khác: nhiều nhất là C nhiều hơn giải pháp tối ưu (lỗi phụ gia, khá hiếm gặp), nhiều nhất là c log n lần tệ như giải pháp tối ưu, nhiều nhất là xấu nhất so với giải pháp tối ưu, nhiều nhất là c 2 ^ (dn) xấu như giải pháp tối ưu (rất tệ; chẳng hạn, TSP chung chỉ chấp nhận các thuật toán với loại bảo đảm này).
Tất nhiên, nếu bạn muốn chắc chắn rằng yếu tố bạn chứng minh là yếu tố tốt nhất bạn có thể chứng minh, bạn nên cố gắng tìm các trường hợp trong đó giải pháp mà thuật toán của bạn đưa ra thực sự tệ đến mức có thể.
Cũng lưu ý rằng đôi khi chúng tôi sử dụng các thuật toán gần đúng cho các vấn đề không phải là NP-hard.
Tôi đã học được điều này (trong số rất nhiều) trong khóa học thuật toán gần đúng tại trường đại học của tôi.
Bằng chứng không thể giải quyết được: hãy coi P là một vấn đề và A và B là các thuật toán gần đúng cho P trong đó A và B không có cùng 'tính tối ưu' đối với một số định nghĩa hợp lý về 'sự tối ưu' và trong đó thời gian chạy của A và B đều là omega (1) (hoàn toàn chậm hơn thời gian không đổi, nghĩa là chúng trở nên chậm hơn đối với các trường hợp lớn hơn) và trong đó cả A và B luôn dừng lại.
Đặt D là chương trình tuyên bố rằng nó có thể tính toán như sau: đưa ra một số chương trình C tính toán gần đúng cho P, quyết định xem nó có tốt như A hay tốt như B cho các đầu vào đủ lớn hay không (do đó bạn có thể sử dụng điều này để phân loại các chương trình theo sự lạc quan của họ).
Sau đó chúng ta có thể sử dụng D để giải quyết vấn đề tạm dừng. Đặt E là chương trình và F là đầu vào cho chương trình này. Chúng tôi sẽ sử dụng D để quyết định xem E có dừng lại ở đầu vào F.
Chúng tôi thiết kế một chương trình G thực hiện như sau: đưa ra một đầu vào S cho vấn đề P, nó chạy E trên F và A trên S song song: nó thực hiện E trong một thời gian, sau đó A, sau đó E lại và tiếp tục. Nếu E dừng trên F, nó dừng chạy A và thay vào đó chạy B trên S và trả về kết quả của B. Nếu A dừng lại trước khi E dừng lại, nó sẽ trả về kết quả của A.
Sử dụng D trên G bây giờ quyết định xem E có dừng trên F hay không: nếu E dừng trên F, thì đối với đầu vào S đủ lớn, E dừng trên F trước khi A dừng trên S (vì thời gian E dừng lại không phụ thuộc vào kích thước của đầu vào, không giống như A). Do đó, D báo cáo rằng G có các đặc điểm tối ưu của B. Nếu E không dừng lại trên F, D sẽ báo cáo rằng G có các đặc điểm tối ưu của A.