Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

0/1 Knapsack ใช้ Branch และ Bound ใน C / C ++ หรือไม่


แนวคิดคือการนำข้อเท็จจริงที่ว่าแนวทาง Greedy มาใช้เป็นทางออกที่ดีที่สุดสำหรับปัญหา Fractional Knapsack

เพื่อตรวจสอบว่าโหนดใดสามารถให้โซลูชันที่ดีกว่าแก่เราได้หรือไม่ เราคำนวณวิธีแก้ปัญหาที่เหมาะสมที่สุด (ผ่านโหนด) โดยใช้แนวทาง Greedy หากโซลูชันที่คำนวณโดยแนวทาง Greedy เป็นมากกว่าวิธีที่ดีที่สุด เราไม่สามารถหาวิธีแก้ปัญหาที่ดีกว่าผ่านโหนดได้

อัลกอริธึมที่สมบูรณ์ได้รับด้านล่าง -

  • จัดเรียงรายการทั้งหมดตามลำดับอัตราส่วนของมูลค่าต่อหน่วยน้ำหนักที่ลดลงเพื่อให้สามารถคำนวณขอบเขตบนโดยใช้ Greedy Approach

  • เริ่มต้นผลกำไรสูงสุด เช่น maxProfit =0

  • คิวว่าง Q ถูกสร้างขึ้น

  • โหนดจำลองของแผนผังการตัดสินใจจะถูกสร้างขึ้นและแทรกหรือจัดคิวให้กับ Q กำไรและน้ำหนักของโหนดจำลองจะเป็น 0

  • ติดตามขณะที่ Q ไม่ว่างหรือไม่ว่าง

    • มีการสร้างรายการจาก Q ให้ไอเทมที่สกัดออกมาเป็นคุณ

    • คำนวณกำไรของโหนดระดับถัดไป หากกำไรสูงกว่า maxProfit ให้แก้ไข maxProfit

    • คำนวณขอบเขตของโหนดระดับถัดไป หากขอบเขตสูงกว่า maxProfit ให้เพิ่มโหนดระดับถัดไปใน Q

    • พิจารณากรณีที่โหนดระดับถัดไปไม่ถือว่าหรือถือว่าเป็นส่วนหนึ่งของการแก้ปัญหา และเพิ่มโหนดไปยังคิวที่มีระดับเป็นถัดไป แต่น้ำหนักและกำไรโดยไม่พิจารณาหรือพิจารณาโหนดระดับถัดไป

ภาพประกอบด้านล่าง -

อินพุต

// First thing in every pair is treated as weight of item
// and second thing is treated as value of item
Item arr1[] = {{2, 40}, {3.14, 50}, {1.98, 100}, {5, 95}, {3, 30}};
Knapsack Capacity W1 = 10

ผลลัพธ์

The maximum possible profit = 235