Làm thế nào để chứng minh thuật toán tham lam là chính xác


29

Tôi có một thuật toán tham lam mà tôi nghi ngờ có thể đúng, nhưng tôi không chắc. Làm thế nào để tôi kiểm tra xem nó có đúng không? Các kỹ thuật để sử dụng để chứng minh một thuật toán tham lam chính xác là gì? Có các mô hình hoặc kỹ thuật phổ biến?

Tôi hy vọng điều này sẽ trở thành một câu hỏi tham khảo có thể được sử dụng để chỉ người mới bắt đầu; do đó phạm vi rộng hơn bình thường của nó. Xin lưu ý đưa ra các câu trả lời chung chung, được trình bày một cách chính thức được minh họa bằng ít nhất một ví dụ nhưng dù sao cũng bao gồm nhiều tình huống. Cảm ơn!



Chúng ta có thể chứng minh rằng một thuật toán tham lam là chính xác bằng cách sử dụng matroid hoặc tham lam không?
zdm

Câu trả lời:


24

Cuối cùng, bạn sẽ cần một bằng chứng toán học về tính chính xác. Tôi sẽ tìm hiểu một số kỹ thuật chứng minh cho điều đó bên dưới, nhưng trước tiên, trước khi đi sâu vào điều đó, hãy để tôi tiết kiệm thời gian cho bạn: trước khi bạn tìm kiếm bằng chứng, hãy thử kiểm tra ngẫu nhiên.

Kiểm tra ngẫu nhiên

Bước đầu tiên, tôi khuyên bạn nên sử dụng thử nghiệm ngẫu nhiên để kiểm tra thuật toán của mình. Thật đáng kinh ngạc về hiệu quả của nó: theo kinh nghiệm của tôi, đối với các thuật toán tham lam, thử nghiệm ngẫu nhiên dường như có hiệu quả vô lý. Dành 5 phút để mã hóa thuật toán của bạn và bạn có thể tiết kiệm cho mình một hoặc hai giờ để đưa ra bằng chứng.

Ý tưởng cơ bản rất đơn giản: thực hiện thuật toán của bạn. Ngoài ra, thực hiện một thuật toán tham chiếu mà bạn biết là chính xác (ví dụ: một thuật toán hoàn toàn cố gắng tất cả các khả năng và tận dụng tốt nhất). Sẽ ổn nếu thuật toán tham chiếu của bạn không hiệu quả, vì bạn sẽ chỉ chạy nó trong các trường hợp nhỏ. Sau đó, tạo ngẫu nhiên một triệu trường hợp vấn đề nhỏ, chạy cả hai thuật toán trên mỗi thuật toán và kiểm tra xem thuật toán ứng viên của bạn có đưa ra câu trả lời chính xác trong mọi trường hợp hay không.

Theo kinh nghiệm, nếu thuật toán tham lam của ứng viên của bạn không chính xác, thông thường bạn sẽ thường phát hiện ra điều này trong quá trình thử nghiệm ngẫu nhiên. Nếu nó có vẻ đúng trên tất cả các trường hợp thử nghiệm, thì bạn nên chuyển sang bước tiếp theo: đưa ra một bằng chứng toán học về tính chính xác.

Bằng chứng toán học của sự đúng đắn

OK, vì vậy chúng ta cần chứng minh thuật toán tham lam của mình là chính xác: rằng nó đưa ra giải pháp tối ưu (hoặc, nếu có nhiều giải pháp tối ưu tốt như nhau, thì nó đưa ra một trong số chúng).

Nguyên tắc cơ bản là một nguyên tắc trực quan:

Nguyên tắc: Nếu bạn không bao giờ đưa ra lựa chọn tồi, bạn sẽ làm được.

Các thuật toán tham lam thường liên quan đến một chuỗi các lựa chọn. Chiến lược chứng minh cơ bản là chúng ta sẽ cố gắng chứng minh rằng thuật toán không bao giờ là lựa chọn tồi. Các thuật toán tham lam không thể quay lại - một khi họ đưa ra lựa chọn, họ cam kết và sẽ không bao giờ hoàn tác lựa chọn đó - vì vậy điều quan trọng là họ không bao giờ đưa ra lựa chọn tồi.

Điều gì sẽ được coi là một lựa chọn tốt? Nếu có một giải pháp tối ưu duy nhất, thật dễ dàng để biết đâu là lựa chọn tốt: bất kỳ lựa chọn nào giống hệt với giải pháp tối ưu. Nói cách khác, chúng tôi sẽ cố gắng chứng minh rằng, ở bất kỳ giai đoạn nào trong quá trình thực thi các thuật toán tham lam, trình tự các lựa chọn được thực hiện bởi thuật toán cho đến nay đều khớp chính xác với một số tiền tố của giải pháp tối ưu. Nếu có nhiều giải pháp tối ưu tốt như nhau, một lựa chọn tốt là một giải pháp phù hợp với ít nhất một trong các tối ưu. Nói cách khác, nếu trình tự các lựa chọn của thuật toán phù hợp với tiền tố của một trong những giải pháp tối ưu, thì mọi thứ đều ổn cho đến nay (vẫn chưa có gì sai).

Để đơn giản hóa cuộc sống và loại bỏ phiền nhiễu, hãy tập trung vào trường hợp không có mối quan hệ nào: có một giải pháp tối ưu duy nhất, duy nhất. Tất cả các máy móc sẽ chuyển sang trường hợp có thể có nhiều tối ưu tốt như nhau mà không có bất kỳ thay đổi cơ bản nào, nhưng bạn phải cẩn thận hơn một chút về các chi tiết kỹ thuật. Bắt đầu bằng cách bỏ qua những chi tiết đó và tập trung vào trường hợp giải pháp tối ưu là duy nhất; Điều đó sẽ giúp bạn tập trung vào những gì cần thiết.

Có một mẫu bằng chứng rất phổ biến mà chúng tôi sử dụng. Chúng tôi sẽ làm việc chăm chỉ để chứng minh tính chất sau của thuật toán:

Yêu cầu: Gọi là đầu ra của giải pháp theo thuật toán và là giải pháp tối ưu. Nếu là khác nhau từ , sau đó chúng ta có thể tinh chỉnh để có được một giải pháp đó là khác biệt so với và chặt chẽ hơn .SOSOOOOO

Lưu ý tại sao điều này là hữu ích. Nếu tuyên bố là đúng, nó tuân theo thuật toán là chính xác. Đây về cơ bản là một bằng chứng bằng mâu thuẫn. Hoặc giống như hoặc nó khác. Nếu nó khác, thì chúng ta có thể tìm một giải pháp khác tốt hơn - nhưng đó là một mâu thuẫn, vì chúng tôi đã định nghĩa là giải pháp tối ưu và không có giải pháp nào tốt hơn điều đó. Vì vậy, chúng tôi buộc phải kết luận rằng không thể khác với ; phải luôn bằngSOOOOSOSO, tức là thuật toán tham lam luôn đưa ra giải pháp chính xác. Nếu chúng tôi có thể chứng minh yêu cầu ở trên, thì chúng tôi đã chứng minh thuật toán của mình chính xác.

Khỏe. Vậy làm thế nào để chúng tôi chứng minh yêu cầu? Chúng tôi nghĩ rằng một giải pháp là một vectơ tương ứng với chuỗi lựa chọn được thực hiện bởi thuật toán và tương tự, chúng tôi nghĩ rằng giải pháp tối ưu là một vectơ tương ứng với chuỗi các lựa chọn mà sẽ dẫn đến . Nếu khác với , phải tồn tại một số chỉ số trong đó ; chúng tôi sẽ tập trung vào nhỏ nhất như . Sau đó, chúng tôi sẽ điều chỉnh bằng cách thay đổi một chút trongS(S1,,Sn)nO(O1,,On)OSOiSiOiiOOiVị trí phù hợp với , tức là, chúng tôi sẽ điều chỉnh giải pháp tối ưu bằng cách thay đổi lựa chọn thứ thành thuật toán tham lam được chọn, và sau đó chúng tôi sẽ chỉ ra rằng điều này dẫn đến một giải pháp thậm chí tốt hơn. Cụ thể, chúng tôi sẽ định nghĩa là một cái gì đó nhưSiOiO

O=(O1,O2,,Oi1,Si,Oi+1,Oi+2,,On),

ngoại trừ việc thường xuyên chúng ta sẽ phải sửa đổi phần phần một chút để duy trì tính nhất quán toàn cầu. Một phần của chiến lược chứng minh liên quan đến một số thông minh trong việc xác định một cách thích hợp. Sau đó, phần cốt lõi của bằng chứng sẽ bằng cách nào đó sử dụng các sự kiện về thuật toán và vấn đề cho thấy hoàn toàn tốt hơn ; đó là nơi bạn sẽ cần một số hiểu biết cụ thể về vấn đề. Tại một số điểm, bạn sẽ cần đi sâu vào chi tiết về vấn đề cụ thể của bạn. Nhưng điều này mang lại cho bạn cảm giác về cấu trúc của một bằng chứng điển hình về tính đúng đắn cho một thuật toán tham lam.Oi+1,Oi+2,,OnOOO

Một ví dụ đơn giản: Tập hợp con có tổng tối đa

Điều này có thể dễ hiểu hơn bằng cách làm việc thông qua một ví dụ đơn giản chi tiết. Hãy xem xét vấn đề sau:

Đầu vào: Một tập hợp các số nguyên, một số nguyên Đầu ra: Một tập hợp có kích thước có tổng càng lớn càng tốtUk
SUk

Có một thuật toán tham lam tự nhiên cho vấn đề này:

  1. Đặt .S:=
  2. Với : i:=1,2,,k
    • Đặt là số lớn nhất trong chưa được chọn (nghĩa là số lớn thứ trong ). Thêm để .xiUiUxiS

Thử nghiệm ngẫu nhiên cho thấy điều này luôn mang lại giải pháp tối ưu, vì vậy hãy chính thức chứng minh rằng thuật toán này là chính xác. Lưu ý rằng giải pháp tối ưu là duy nhất, vì vậy chúng tôi sẽ không phải lo lắng về mối quan hệ. Hãy chứng minh yêu cầu được nêu ở trên:

Yêu cầu: Gọi là đầu ra giải pháp theo thuật toán này trên đầu vào và là giải pháp tối ưu. Nếu , sau đó chúng ta có thể xây dựng một giải pháp có tổng thậm chí còn lớn hơn so với .SU,kOSOOO

Bằng chứng. Giả sử , và để cho là chỉ số của phiên đầu tiên nơi . ( phải tồn tại một chỉ mục như vậy , vì chúng tôi đã giả sử và theo định nghĩa của thuật toán, chúng tôi có .) Vì (theo giả định) là tối thiểu, chúng tôi phải có và đặc biệt, có dạng , trong đó các số được liệt kê theo thứ tự giảm dần. Nhìn vào cách thuật toán chọnSOixiOiSOS={x1,,xk}ix1,,xi1OOO={x1,x2,,xi1,xi,xi+1,,xn}x1,,xi1,xi,,xnx1,,xi, chúng tôi thấy rằng chúng tôi phải có cho tất cả . Cụ thể, . Vì vậy, hãy xác định , nghĩa là chúng ta có được bằng cách xóa số thứ trongxi>xjjixi>xiO=O{xi}{xi}Oi và thêm x i . Bây giờ tổng của các yếu tố của O * là tổng hợp của các yếu tố của O cộng x i - x ' i x i - x ' i > 0 , do đó O *OxiOOxixixixi>0OTổng của nó lớn hơn tổng của Điều này chứng tỏ yêu sách. O

Trực giác ở đây là nếu thuật toán tham lam từng đưa ra lựa chọn không phù hợp với , thì chúng ta có thể chứng minh O có thể tốt hơn nữa nếu nó được sửa đổi để bao gồm phần tử được chọn bởi thuật toán tham lam ở giai đoạn đó. Vì O là tối ưu, không thể có cách nào làm cho nó tốt hơn nữa (đó sẽ là một mâu thuẫn), nên khả năng duy nhất còn lại là giả định của chúng tôi đã sai: nói cách khác, thuật toán tham lam sẽ không bao giờ đưa ra lựa chọn đó là không phù hợp với O .OOOO

Đối số này thường được gọi là đối số trao đổi hoặc bổ đề trao đổi . Chúng tôi đã tìm thấy nơi đầu tiên mà giải pháp tối ưu khác với giải pháp tham lam và chúng tôi tưởng tượng trao đổi yếu tố đó của cho sự lựa chọn tham lam tương ứng (trao đổi x i cho x i ). Một số phân tích cho thấy rằng trao đổi này chỉ có thể cải thiện giải pháp tối ưu - nhưng theo định nghĩa, giải pháp tối ưu không thể được cải thiện. Vì vậy, kết luận duy nhất là không được có bất kỳ nơi nào mà giải pháp tối ưu khác với giải pháp tham lam. Nếu bạn có một vấn đề khác, hãy tìm cơ hội để áp dụng nguyên tắc trao đổi này trong tình huống cụ thể của bạn.Oxixi


Đây là một câu hỏi cũ, nhưng nó là kết quả đầu tiên trong Google đối với tôi. Dòng này then we can tweak O to get another solution O∗ that is different from O and strictly better than Olàm tôi bối rối. Nếu có nhiều giải pháp tối ưu, có thể có S != Ovà cả hai vẫn là tối ưu; chúng ta có thể điều chỉnh O thành "giống" hơn (tạo O) và vẫn tốt như (không strictly better than) O.
citelao

@citelao, tôi rất tiếc khi biết rằng nó làm bạn bối rối. Than ôi, tôi không chắc làm thế nào để giải thích rõ ràng hơn. Có, có thể có nhiều giải pháp tối ưu, tất cả đều có cùng giá trị. Đúng rồi. Những gì bạn viết và những gì tôi viết đều hợp lệ; không có mâu thuẫn. Sự khác biệt là những gì bạn viết không giúp chứng minh thuật toán tham lam chính xác; những gì tôi đã viết Tôi chỉ có thể đề nghị xem lại những gì tôi đã viết một lần nữa và xem liệu bạn có thể hiểu được những gì tôi viết là hữu ích không. Nếu điều đó không có ích, có thể tìm một bài viết khác. Tôi nhận ra nó khó khăn và khó hiểu.
DW

1
Cảm ơn đã phản ứng nhanh chóng! Tôi đã bỏ lỡ điểm mà bạn tập trung vào việc chứng minh thuật toán nếu có a single, unique optimal solution. Vì câu hỏi này là về việc chứng minh bất kỳ thuật toán tham lam nào là chính xác, tôi muốn cung cấp câu trả lời cho các trường hợp có thể tồn tại nhiều giải pháp tối ưu. Đã được một thời gian kể từ khi tôi nghiên cứu tất cả những điều này, nhưng không đủ để chứng minh rằng bạn có thể trao đổi từng phần tử O_i trong bất kỳ giải pháp tối ưu O nào khác với alg. giải pháp S với S_i và vẫn có giải pháp O ' không tệ hơn O?
citelao

@citelao, kỹ thuật cũng áp dụng cho các trường hợp có nhiều giải pháp tối ưu. Tôi đề nghị tập trung vào trường hợp giải pháp tối ưu là duy nhất bởi vì, lần đầu tiên bạn nhìn thấy điều này, sẽ dễ hiểu hơn về cách các bằng chứng này hoạt động trong cài đặt đó. Nhưng cùng một chiến lược hoạt động ngay cả khi có nhiều giải pháp tối ưu. Tôi đề nghị nghiên cứu điều này, đảm bảo bạn hiểu cách thức hoạt động của nó khi có một giải pháp tối ưu duy nhất, sau đó áp dụng nó cho trường hợp chung. Ngoài ra tôi nghĩ rằng nó có thể giúp bạn nghiên cứu một vài bằng chứng ví dụ cho các thuật toán tham lam.
DW

Để trả lời câu hỏi sau của bạn, không, điều đó là không đủ. Điều đó không chứng minh rằng S là tối ưu. (Nếu bạn chỉ yêu cầu O 'không tệ hơn O, có những trường hợp S không tối ưu nhưng vẫn có thể thực hiện kiểu trao đổi đó. Vì vậy, chứng minh rằng có thể đạt được O' không tệ hơn O Tôi không chứng minh bất cứ điều gì về việc liệu S có tối ưu hay không và chứng minh thuật toán tham lam là chính xác. Tôi khuyên bạn nên nghiên cứu phương pháp được mô tả trong câu trả lời thêm một chút. Thật khó khăn. Chứng minh bằng mâu thuẫn thường khó hiểu.)
DW

14

Tôi sẽ sử dụng thuật toán sắp xếp đơn giản sau đây làm ví dụ:

repeat:
  if there are adjacent items in the wrong order:
     pick one such pair and swap
  else
     break

Để chứng minh tính đúng đắn tôi sử dụng hai bước.

  • Đầu tiên tôi chỉ ra rằng thuật toán luôn kết thúc.
  • Sau đó, tôi chỉ ra rằng giải pháp mà nó chấm dứt là giải pháp tôi muốn.

Đối với điểm đầu tiên, tôi chọn một hàm chi phí phù hợp mà tôi có thể chỉ ra rằng thuật toán cải thiện nó trong từng bước.

AA[i]A[j]A[i]>A[j]i<j

A[i]A[i+1]A[i],A[i+1]

Điều này chứng tỏ rằng thuật toán cuối cùng chấm dứt.

Số lượng nghịch đảo trong danh sách được sắp xếp là 0. Nếu mọi việc suôn sẻ, thuật toán sẽ giảm số lượng nghịch đảo xuống còn 0. Chúng ta chỉ cần chứng minh rằng nó không bị kẹt ở mức tối thiểu cục bộ.

Tôi thường chứng minh điều này bằng mâu thuẫn. Tôi giả sử rằng thuật toán đã dừng, nhưng giải pháp không chính xác. Trong ví dụ này, điều này có nghĩa là danh sách chưa được sắp xếp, nhưng không có mục nào liền kề theo thứ tự sai.

A[i]A[j]i<jA[i]>A[j]iji+1<jA[i]<A[i+1]A[i+1]<A[j]A[i]<A[j]

Điều này chứng tỏ rằng thuật toán chỉ dừng lại khi danh sách được sắp xếp. Và do đó, chúng tôi đã hoàn thành.


Các kỹ thuật được giải thích rất chung chung đến nỗi chúng hầu như không có gì đặc biệt về thuật toán tham lam, chủ đề của câu hỏi này.
Apass.Jack
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.