ลองใช้ Branch และ Bound กับKnapsackหวังว่านี่จะทำให้แนวคิดนี้ชัดเจนสำหรับคุณ
เรามี n รายการที่มีข้อความกำกับ 1 ผ่านไป n. โวลต์ผม คือค่าของ ผมรายการที่และ Wผมน้ำหนักของมัน เราพยายามที่จะใส่พวกเขาในเป้ที่สามารถมีได้ถึงT น้ำหนักรวมและเราพยายามที่จะเพิ่มผลรวมของค่าของรายการที่เราใส่ในเป้
แนวทางย้อนรอยทั่วไปเป็นพื้นฐานของเรา ก่อนอื่นเราใส่โวลต์1 ในแพ็คแล้วแก้ไขปัญหาสำหรับส่วนที่เหลือ n - 1รายการที่มีการสอบถามซ้ำ จากนั้นเราก็ลบโวลต์1 จากแพ็คและแก้ปัญหาสำหรับส่วนที่เหลือ n - 1 รายการอีกครั้งและเรากลับการกำหนดค่าที่ดีที่สุดที่เราพบ
Backtracking นี้เป็นส่วน 'Branch' ของ Branch and Bound คุณแยกสาขาใน (ในกรณีของเป้) สองกรณี: 'รายการผม เป็นส่วนหนึ่งของรายการ 'และ' โซลูชัน ผมไม่ใช่ส่วนหนึ่งของโซลูชัน ' คุณสามารถมองเห็นสิ่งนี้เป็นต้นไม้ไบนารีโดยที่เด็กด้านซ้ายเป็นหนึ่งกรณีและเด็กที่ถูกต้องคืออีกกรณีหนึ่ง ต้นไม้นี้เป็นต้นไม้ค้นหา (หรือพื้นที่ค้นหา ): ความลึกของมันคือnและดังนั้นจึงมี โอ(2n)โหนด อัลกอริทึมจึงมีการชี้แจงเวลาทำงานในจำนวนรายการ
ตอนนี้เราไปถึงส่วน 'Bound': เราพยายามค้นหาเกณฑ์ที่เราสามารถพูดได้ว่า 'การกำหนดค่านี้ไม่เคยประสบความสำเร็จดังนั้นเราจึงอาจไม่สนใจการคำนวณนี้' ตัวอย่างของเกณฑ์ดังกล่าวคือ 'น้ำหนักของรายการที่เราใส่ในเป้เกินกว่าT': ถ้าเราเพิ่มพูดก่อน n / 2 รายการไปยังเป้หลังและดังนั้นจึงเต็มแล้วไม่มีจุดพยายามวางรายการ n / 2 + 1 ผ่านไป n ในเป้เช่นกัน แต่ก็ยังไม่มีจุดในการพยายามที่จะพอดีกับส่วนย่อยของ n / 2 + 1 ผ่านไป n ในเป้มันเต็มแล้วดังนั้นเราจึงประหยัด 2n / 2กรณี อีกตัวอย่างคือ ' แม้ว่าฉันจะใส่รายการที่เหลือทั้งหมดมูลค่าของรายการที่ฉันใส่เข้าไปจะไม่เกินค่าที่ดีที่สุดที่ฉันเคยพบ '
เกณฑ์เหล่านี้จะตัดทอนบางส่วนของโครงสร้างการค้นหา: ในบางโหนดคุณพูดเช่น 'ทรีย่อยด้านซ้ายจะไม่ให้การกำหนดค่าที่ดีกว่าแก่ฉันเพราะ X' ดังนั้นคุณจึงลืมทรีย่อยนั้นและคุณไม่สำรวจ ทรีย่อยของความลึกd ที่คุณตัดออกด้วยวิธีนี้จะช่วยให้คุณประหยัด โอ(2d) ปมซึ่งสามารถเพิ่มความเร็วได้บ้างหากคุณโชคดี
โปรดทราบว่าสิ่งนี้เรียกว่า ' Bounding ' เพราะโดยทั่วไปจะเกี่ยวข้องกับขอบเขตล่างหรือบนบางอย่าง: สำหรับเกณฑ์ ' แม้ว่าฉันจะใส่รายการที่เหลือทั้งหมดมูลค่าของรายการที่ฉันใส่จะไม่เกินค่าที่ดีที่สุด ฉันพบแล้ว 'คุณค่าของการกำหนดค่าที่ดีที่สุดของคุณจนถึงตอนนี้คือขอบเขตที่ต่ำกว่าในการกำหนดค่าที่ดีที่สุดดังนั้นสิ่งใดก็ตามที่จะไม่ผ่านพ้นขอบเขตล่างนี้ไปถึงความล้มเหลว
คุณสามารถสร้างส่วน 'Bounding' ที่ซับซ้อนตามที่คุณต้องการ ตัวอย่างเช่นปัญหาการเขียนโปรแกรมจำนวนเต็มมักจะได้รับการแก้ไขโดยใช้การผ่อนคลาย: คุณผ่อนคลายโปรแกรมของคุณไปยังโปรแกรมเชิงเส้นซึ่งคุณสามารถแก้ปัญหาในเวลาพหุนามและจากนั้นคุณสามารถทิ้งกรณีจำนวนมากสำหรับตัวแปรไบนารีของคุณ จากนั้นคุณแยกสาขาตามตัวเลือกที่เหลือ
โปรดทราบว่าโดยทั่วไปแล้ว Branch และ Bound จะช่วยให้คุณฝึกฝนได้เร็วขึ้น แต่ไม่ใช่ในทางทฤษฎี: มันยากที่จะบอกว่าต้นไม้การค้นหานั้นถูกตัดโดยใช้ฮิวริสติกของคุณมากเพียงใด นี่คือการพิสูจน์โดยจำนวนของฮิวริสติกที่แตกต่างกันที่ใช้ในการปฏิบัติเกี่ยวกับปัญหาดังกล่าว หากคุณโชคไม่ดีแผนผังการค้นหาที่เหลือยังคงใหญ่แม้ว่าจะมีขอบเขต จำกัด ก็ตาม