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 .SOSOOO∗OO
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ằngSOO∗OOSOSO, 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)OSOiSi≠OiiOOiVị 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,…,Oi−1,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,…,OnO∗O∗O
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
S⊆Uk
Có một thuật toán tham lam tự nhiên cho vấn đề này:
- Đặt .S:=∅
- 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,kOS≠OO∗O
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ọnS≠Oixi∉OiS≠OS={x1,…,xk}ix1,…,xi−1∈OOO={x1,x2,…,xi−1,x′i,x′i+1,…,x′n}x1,…,xi−1,x′i,…,x′nx1,…,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>x′jj≥ixi>x′iO=O∪{xi}∖{x′i}O∗i 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 và x i - x ' i > 0 , do đó O *OxiO∗Oxi−x′ixi−x′i>0O∗Tổ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.Ox′ixi