Có một phương pháp chung để đánh giá sự tối ưu của một thuật toán tối ưu hóa không?


9

Có một phương pháp chung để đánh giá tính tối ưu của thuật toán tối ưu hóa, ví dụ thuật toán giải một bài toán NP-hard hoặc NP-Complete khác?

Phương pháp duy nhất tôi đưa ra cho đến nay là so sánh kết quả của thuật toán với các giải pháp tối ưu đã biết.

Nếu không, có phương pháp cụ thể cho một số vấn đề đặc biệt?

EDIT Để làm rõ: Bằng sự tối ưu, ý tôi là mức độ gần với kết quả của giải pháp tối ưu.


Có lẽ một câu hỏi cho cstheory.stackexchange.com ?
Luciano

Làm thế nào để bạn xác định 'sự tối ưu' của một thuật toán tối ưu hóa? Bạn có muốn phân tích mã nguồn của nó và sau đó báo cáo hệ số gần đúng của nó là gì không?
Alex ten Brink

Bạn có nghĩa là "hiệu quả" của một thuật toán được sử dụng để "mô tả các thuộc tính của thuật toán liên quan đến bao nhiêu loại tài nguyên mà nó tiêu thụ". Các thuật toán cũng được chia thành chính xác và heuristic. Các thuật toán chính xác đảm bảo tìm ra giải pháp tối ưu nhưng có thể mất hàng thế kỷ thời gian cpu (đối với các vấn đề NP-hard kích thước thực tế) trong khi các heuristic sẽ tìm ra giải pháp gần với tối ưu toàn cầu trong thời gian hợp lý hơn. (phút hoặc giờ tùy thuộc vào kích thước đầu vào.
Florents Tselai

Câu trả lời:


3

Nó phụ thuộc vào loại vấn đề.

Nếu có sơ đồ gần đúng thời gian đa thức (PTAS) cho vấn đề (ví dụ Euclidian TSP), thì bạn có thể nhận được một giải pháp gần tùy ý với giải pháp tối ưu trong thời gian đa thức. Điều đó có nghĩa là, với mỗi e > 0, có một thuật toán thời gian đa thức sẽ tìm ra một giải pháp gần đúng cho vấn đề của bạn, được đảm bảo nằm trong (1+ e ) của giải pháp tối ưu. Trong trường hợp đó, bạn sẽ chỉ so sánh độ phức tạp của thời gian chạy / bộ nhớ cho hai thuật toán cho cùng một giá trị của e . Nếu một thuật toán có thể tạo ra cùng một "đảm bảo tối ưu" so với thuật toán kia, nhưng với chi phí thời gian / bộ nhớ thấp hơn, thì đó có lẽ là thuật toán tốt hơn.

Nếu vấn đề là APX, nhưng không phải là PTAS , tức là nếu có các thuật toán xấp xỉ thời gian đa thức được đảm bảo để tạo ra các giải pháp nằm trong một yếu tố không đổi của giải pháp tối ưu, thì bạn có thể so sánh hệ số không đổi đó. Một trong những yếu tố thấp hơn sẽ tạo ra các giải pháp tốt hơn (nhưng thường với chi phí thời gian chạy / chi phí bộ nhớ cao hơn)

Nếu vấn đề nằm ở cả hai lớp đó, thì tôi nghĩ cách tốt nhất bạn có thể làm là so sánh các giải pháp của chúng cho một tập hợp các vấn đề ngẫu nhiên hoặc cho các vấn đề với các giải pháp tối ưu đã biết.


1

Tôi không nghĩ có một cách chung để làm điều đó, nhưng chắc chắn có những phương pháp để làm điều đó.

Lấy ví dụ, vấn đề SET-COVER. Đối với những người không biết vấn đề như sau:

Cho một tập hợp các phần tử B={1,2,...,m}và một số tập hợp con S_1, S_2, ..., S_ncó liên kết B. Bạn đang cố gắng tìm số lượng tối thiểu của các tập hợp con này sao cho liên minh vẫn còn B. Một ví dụ điển hình trong thế giới thực của vấn đề này là nơi bạn được cung cấp một bộ sưu tập các khu phố và bạn đang cố gắng tìm những nơi tối ưu để đặt trường sao cho mỗi khu phố được phục vụ cách dtrường học gần nhất một khoảng cách . Trong trường hợp này, Blà tập hợp các vùng lân cận và S_xbao gồm tất cả các tập hợp trong dthị trấn x.

Bạn chứng minh rằng vấn đề này là NP-HOÀN THÀNH. Tuy nhiên, có một giải pháp tham lam đơn giản, trong đó bạn liên tục chọn tập hợp S_icó số lượng phần tử không được phát hiện lớn nhất. Và bạn có thể chứng minh rằng thuật toán này làm tốt .

Nếu thuật toán tối ưu bao gồm các ktập hợp, thuật toán tham lam sẽ bao gồm không nhiều hơn k ln(n)các tập hợp trong đó ln là logarit tự nhiên.


1

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.

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.