ในที่สุดคุณจะต้องมีหลักฐานทางคณิตศาสตร์ของความถูกต้อง ฉันจะไปหาเทคนิคการพิสูจน์สำหรับข้างล่างนี้ แต่ก่อนอื่นก่อนที่จะลงไปให้ฉันช่วยคุณประหยัดเวลา: ก่อนที่คุณจะหาหลักฐานลองทดสอบแบบสุ่ม
การทดสอบแบบสุ่ม
เป็นขั้นตอนแรกฉันขอแนะนำให้คุณใช้การทดสอบแบบสุ่มเพื่อทดสอบอัลกอริทึมของคุณ เป็นเรื่องที่น่าทึ่งว่ามันมีประสิทธิภาพแค่ไหน: จากประสบการณ์ของฉันสำหรับอัลกอริธึมโลภการทดสอบแบบสุ่มดูเหมือนว่าจะมีประสิทธิภาพเกินสมควร ใช้เวลา 5 นาทีเขียนอัลกอริทึมของคุณและคุณอาจช่วยตัวเองหนึ่งหรือสองชั่วโมงพยายามพิสูจน์
แนวคิดพื้นฐานง่าย ๆ : ใช้อัลกอริทึมของคุณ นอกจากนี้ให้ใช้อัลกอริธึมอ้างอิงที่คุณรู้ว่าถูกต้อง (เช่นพยายามใช้ความเป็นไปได้ทั้งหมดอย่างละเอียดรอบคอบและดีที่สุด) ไม่เป็นไรถ้าอัลกอริทึมการอ้างอิงของคุณไม่มีประสิทธิภาพแบบ asymptotically เนื่องจากคุณจะเรียกใช้สิ่งนี้ในกรณีที่เกิดปัญหาเล็กน้อย จากนั้นสร้างอินสแตนซ์ปัญหาเล็ก ๆ หนึ่งล้านสุ่มเรียกใช้อัลกอริทึมทั้งสองในแต่ละครั้งและตรวจสอบว่าอัลกอริทึมผู้สมัครของคุณให้คำตอบที่ถูกต้องในทุกกรณีหรือไม่
สังเกตุถ้าอัลกอริทึมผู้สมัครของคุณโลภไม่ถูกต้องโดยทั่วไปแล้วคุณมักจะค้นพบสิ่งนี้ในระหว่างการทดสอบแบบสุ่ม หากดูเหมือนว่าจะถูกต้องในทุกกรณีการทดสอบคุณควรไปยังขั้นตอนถัดไป: ค้นหาข้อพิสูจน์ทางคณิตศาสตร์ของความถูกต้อง
หลักฐานทางคณิตศาสตร์ของความถูกต้อง
ตกลงดังนั้นเราต้องพิสูจน์อัลกอริทึมโลภของเราว่าถูกต้อง: มันส่งออกทางออกที่ดีที่สุด (หรือถ้ามีทางออกที่ดีที่สุดหลายอย่างที่ดีเท่า ๆ กันมันส่งหนึ่งในนั้น)
หลักการพื้นฐานคือหลักการง่าย ๆ :
หลักการ:ถ้าคุณไม่มีทางเลือกที่ไม่ดี
อัลกอริทึมโลภมักจะเกี่ยวข้องกับลำดับของตัวเลือก กลยุทธ์การพิสูจน์พื้นฐานคือเราจะพยายามพิสูจน์ว่าอัลกอริทึมไม่เคยทำให้เลือกไม่ถูกต้อง อัลกอริทึมโลภไม่สามารถย้อนกลับได้ - เมื่อพวกเขาเลือกแล้วพวกเขาจะทำและจะไม่ยกเลิกตัวเลือกนั้น - ดังนั้นจึงเป็นเรื่องสำคัญที่พวกเขาจะไม่ตัดสินใจเลือกที่ไม่ดี
อะไรจะนับเป็นทางเลือกที่ดี หากมีวิธีการแก้ปัญหาที่ดีที่สุดเพียงอย่างเดียวมันเป็นเรื่องง่ายที่จะเห็นสิ่งที่เป็นตัวเลือกที่ดี: ตัวเลือกใด ๆ ที่เหมือนกันกับโซลูชันที่ดีที่สุด กล่าวอีกนัยหนึ่งเราจะพยายามพิสูจน์ว่าในขั้นตอนใดของการดำเนินการของขั้นตอนวิธีโลภลำดับของตัวเลือกที่ทำโดยอัลกอริทึมจนถึงตรงกับคำนำหน้าของโซลูชันที่ดีที่สุด หากมีวิธีแก้ปัญหาที่ดีที่สุดที่ดีเท่า ๆ กันหลายตัวเลือกที่ดีคือสิ่งที่สอดคล้องกับ optima อย่างน้อยหนึ่งรายการ กล่าวอีกนัยหนึ่งถ้าลำดับการเลือกของอัลกอริทึมตรงกับคำนำหน้าของหนึ่งในโซลูชั่นที่ดีที่สุดทุกอย่างก็ดี (ไม่มีอะไรผิดพลาดไป)
เพื่อลดความยุ่งยากในชีวิตและกำจัดสิ่งรบกวนให้เรามุ่งเน้นไปที่กรณีที่ไม่มีความสัมพันธ์กัน: มีวิธีแก้ปัญหาที่ดีที่สุดที่ไม่เหมือนใคร เครื่องจักรทั้งหมดจะถูกส่งต่อไปยังกรณีที่มี optima ที่ดีเท่า ๆ กันหลายตัวโดยไม่มีการเปลี่ยนแปลงพื้นฐาน แต่คุณต้องระวังให้มากขึ้นเกี่ยวกับรายละเอียดทางเทคนิค เริ่มต้นโดยไม่สนใจรายละเอียดเหล่านั้นและมุ่งเน้นไปที่กรณีที่ทางออกที่ดีที่สุดไม่เหมือนใคร ที่จะช่วยให้คุณจดจ่อกับสิ่งที่จำเป็น
มีรูปแบบการพิสูจน์ทั่วไปที่เราใช้ เราจะทำงานอย่างหนักเพื่อพิสูจน์คุณสมบัติของอัลกอริทึมดังต่อไปนี้:
การอ้างสิทธิ์:ให้เป็นเอาต์พุตโซลูชันด้วยอัลกอริธึมและOเป็นโซลูชันที่เหมาะสมที่สุด ถ้าSจะแตกต่างจากOแล้วเราสามารถปรับแต่งOที่จะได้รับการแก้ปัญหาอีกO *ที่แตกต่างจากOอย่างเคร่งครัดและดีกว่าOSOSOOO* * * *OO
สังเกตว่าทำไมสิ่งนี้ถึงมีประโยชน์ หากการอ้างสิทธิ์เป็นจริงจะเป็นไปตามขั้นตอนวิธีที่ถูกต้อง นี่เป็นข้อพิสูจน์โดยความขัดแย้ง ทั้งเป็นเช่นเดียวกับOหรือมันแตกต่างกัน ถ้ามันเป็นความแตกต่างกันแล้วเราสามารถหาวิธีอื่นO *ที่เคร่งครัดดีกว่าO - แต่ที่ขัดแย้งในขณะที่เรากำหนดOจะเป็นทางออกที่ดีที่สุดและมีไม่สามารถจะแก้ปัญหาใด ๆ ที่ดีกว่านั้น ดังนั้นเราจึงถูกบังคับให้สรุปว่าSไม่สามารถแตกต่างจากO ; Sต้องเท่ากับOเสมอSOO* * * *OOSOSOกล่าวคืออัลกอริทึมโลภมักจะแสดงผลลัพธ์ที่ถูกต้องเสมอ หากเราสามารถพิสูจน์การอ้างสิทธิ์ข้างต้นได้เราก็พิสูจน์แล้วว่าอัลกอริทึมของเราถูกต้อง
ละเอียด. ดังนั้นเราจะพิสูจน์ข้อเรียกร้องได้อย่างไร เราคิดว่าวิธีการแก้ปัญหาเป็นเวกเตอร์( S 1 , ... , S n )ซึ่งสอดคล้องกับลำดับของnทางเลือกที่ทำโดยอัลกอริทึมและในทำนองเดียวกันเราคิดว่าทางออกที่ดีที่สุดOเป็นเวกเตอร์( O 1 , ... , O n )ที่สอดคล้องกับลำดับของตัวเลือกที่จะนำไปสู่O ถ้าSจะแตกต่างจากOต้องมีดัชนีบางฉันที่S ฉัน ≠S(S1,…,Sn)nO( ต1, … , On)OSOผม ; เราจะมุ่งเน้นไปที่ดังกล่าวมีขนาดเล็กที่สุดฉัน จากนั้นเราจะปรับแต่ง Oโดยการเปลี่ยน Oเล็กน้อยในตำแหน่งที่ iเพื่อจับคู่ S iนั่นคือเราจะปรับแต่งโซลูชันที่ดีที่สุด Oโดยเปลี่ยนตัวเลือก i th เป็นตัวเลือกที่เลือกโดยอัลกอริทึมโลภแล้ว เราจะแสดงให้เห็นว่าสิ่งนี้นำไปสู่ทางออกที่ดียิ่งขึ้น โดยเฉพาะอย่างยิ่งเราจะนิยาม O ∗ว่าเป็นสิ่งที่ต้องการSผม≠ OผมผมOOผมSผมOผมO* * * *
O* * * *= ( O1, O2, … , Oฉัน- 1, Sผม, Oฉัน+ 1, Oฉัน+ 2, … , On) ,
ยกเว้นว่าบ่อยครั้งที่เราจะต้องแก้ไขส่วนเล็กน้อยเพื่อรักษาความสอดคล้องระดับโลก ส่วนหนึ่งของกลยุทธ์การพิสูจน์เกี่ยวข้องกับความฉลาดในการกำหนดO ∗อย่างเหมาะสม จากนั้นเนื้อของการพิสูจน์จะใช้ข้อเท็จจริงเกี่ยวกับอัลกอริธึมและปัญหาเพื่อแสดงว่าO ∗ดีกว่าOอย่างเคร่งครัดOฉัน+ 1, Oฉัน+ 2, … , OnO* * * *O* * * *O; นั่นคือสิ่งที่คุณจะต้องมีข้อมูลเชิงลึกเฉพาะปัญหา ในบางจุดคุณจะต้องดำน้ำในรายละเอียดของปัญหาเฉพาะของคุณ แต่นี่ให้ความรู้สึกถึงโครงสร้างของการพิสูจน์ความถูกต้องทั่วไปสำหรับอัลกอริทึมโลภ
ตัวอย่างง่ายๆ: ชุดย่อยที่มีผลรวมสูงสุด
สิ่งนี้อาจจะง่ายต่อการเข้าใจโดยการทำงานผ่านตัวอย่างที่ละเอียด ลองพิจารณาปัญหาต่อไปนี้:
อินพุต:ชุดของจำนวนเต็ม, จำนวนเต็มkเอาต์พุต:ชุดS ⊆ Uของขนาดkซึ่งผลรวมมีขนาดใหญ่ที่สุดเท่าที่จะเป็นไปได้ยูk
S⊆ คุณk
มีอัลกอริทึมโลภธรรมชาติสำหรับปัญหานี้:
- ชุด ∅S: = ∅
- สำหรับ :
i : = 1 , 2 , … , k
- ให้เป็นจำนวนมากที่สุดในยูที่ไม่ได้รับเลือกเลย (เช่นฉัน TH จำนวนที่ใหญ่ที่สุดในU ) เพิ่มx ฉันจะSxผมยูผมยูxผมS
การทดสอบแบบสุ่มแสดงให้เห็นว่านี่เป็นวิธีแก้ปัญหาที่ดีที่สุดเสมอดังนั้นเรามาพิสูจน์อย่างเป็นทางการว่า โปรดทราบว่าทางออกที่ดีที่สุดนั้นไม่เหมือนใครดังนั้นเราจึงไม่ต้องกังวลเกี่ยวกับความสัมพันธ์ เรามาพิสูจน์การอ้างสิทธิ์ที่กล่าวถึงข้างต้น:
การอ้างสิทธิ์:ให้เป็นเอาต์พุตโซลูชันด้วยอัลกอริธึมนี้ในอินพุตU , kและO ซึ่งเป็นโซลูชันที่เหมาะสมที่สุด ถ้าS ≠ Oแล้วเราสามารถสร้างวิธีอื่นO *ที่มีผลรวมแม้จะมีขนาดใหญ่กว่าOSยู, kOS≠ OO* * * *O
พิสูจน์ สมมติและปล่อยให้ฉันเป็นดัชนีของซ้ำแรกที่x ฉัน ∉ O (เช่นดัชนีฉันต้องมีอยู่เนื่องจากเราสันนิษฐานว่าS ≠ Oและตามคำจำกัดความของอัลกอริทึมที่เรามีS = { x 1 , … , x k } ) เนื่องจาก (โดยสมมติฐาน) iมีน้อยเราต้องมีx 1 , … , x i - 1 ∈ O , และโดยเฉพาะS≠ Oผมxผม∉ OผมS≠ OS= { x1, … , xk}ผมx1, … , xฉัน- 1∈ Oมีรูปแบบ O = { x 1 , x 2 , … , x i - 1แสดงอยู่ในลำดับถัดลงมา ดูวิธีที่อัลกอริทึมเลือก x 1 , … , x iO , โดยที่ตัวเลข x 1 , … , x i - 1 , x ′ i , … , x ′ nO = { x1, x2, … , xฉัน- 1, x'ผม, x'ฉัน+ 1, … , x'n}x1, … , xฉัน- 1, x'ผม, … , x'nx1, … , xผมเราจะเห็นว่าเราจะต้องมีสำหรับทุกJ ≥ฉัน โดยเฉพาะอย่างยิ่งx ฉัน > x 'ฉัน ดังนั้นกำหนดO = O ∪ { x i } ∖ { x ′ i }คือเราได้รับO ∗โดยการลบหมายเลขi th ในOxผม> x'Jj ≥ ฉันxผม> x'ผมO=O ∪ { xผม} ∖ { x'ผม}O* * * *ผมOและการเพิ่มฉัน ตอนนี้ผลรวมขององค์ประกอบของO *คือผลรวมขององค์ประกอบของOบวกx ฉัน - x ' ฉันและx ฉัน - x ' ฉัน > 0ดังนั้นO * 's ผลรวมเป็นอย่างเคร่งครัดขนาดใหญ่กว่าO ' s รวม สิ่งนี้พิสูจน์ข้อเรียกร้อง ◼xผมO* * * *Oxผม- x'ผมxผม- x'ผม> 0O* * * *O■
สัญชาตญาณที่นี่คือว่าหากอัลกอริทึมโลภทำให้ตัวเลือกที่ไม่สอดคล้องกับดังนั้นเราสามารถพิสูจน์Oได้ดียิ่งขึ้นหากมีการแก้ไขเพื่อรวมองค์ประกอบที่เลือกโดยอัลกอริทึมโลภในขั้นตอนนั้น เนื่องจากOดีที่สุดจึงไม่มีทางที่จะทำให้ดีขึ้นได้ (นั่นจะเป็นความขัดแย้ง) ดังนั้นความเป็นไปได้ที่เหลืออยู่เพียงอย่างเดียวคือข้อสันนิษฐานของเราผิด: กล่าวอีกนัยหนึ่งอัลกอริทึมโลภจะไม่เลือก ที่ไม่สอดคล้องกับOOOOO
เรื่องนี้มักจะถูกเรียกว่าอาร์กิวเมนต์แลกเปลี่ยนหรือแลกเปลี่ยนแทรก เราพบสถานที่แรกที่ทางออกที่ดีที่สุดแตกต่างจากโซลูชันโลภและเราจินตนาการว่าการแลกเปลี่ยนองค์ประกอบของสำหรับตัวเลือกโลภที่สอดคล้องกัน (แลกเปลี่ยนx ′ iสำหรับx i ) การวิเคราะห์บางอย่างแสดงให้เห็นว่าการแลกเปลี่ยนนี้สามารถปรับปรุงวิธีการแก้ปัญหาที่ดีที่สุดเท่านั้น แต่ตามนิยามแล้วคำตอบที่ดีที่สุดไม่สามารถปรับปรุง ดังนั้นข้อสรุปเดียวคือจะต้องไม่มีสถานที่ใดที่ทางออกที่ดีที่สุดแตกต่างจากโซลูชันโลภ หากคุณมีปัญหาอื่นให้มองหาโอกาสที่จะใช้หลักการแลกเปลี่ยนนี้ในสถานการณ์เฉพาะของคุณOx'ผมxผม