เป็นคำถามที่ดีมาก!
คุณถูกสองครั้ง:
- การกระจายจำนวนรายการในเป้ไม่ได้นำไปสู่การแก้ปัญหาที่ดีที่สุด
- โซลูชันหนึ่งประกอบด้วยการเพิ่มมิติที่สาม นี่ค่อนข้างง่าย แต่จำเป็นต้องคำนึงถึงข้อเท็จจริงบางประการเมื่อทำเช่นนั้น โปรดทราบว่ามันไม่ใช่ทางเลือกเดียว
ในต่อไปนี้ฉันสมมติว่าคุณคุ้นเคยกับโซลูชันที่ใช้การเขียนโปรแกรมแบบไดนามิก โดยเฉพาะอย่างยิ่งผมจะไม่หารือถึงวิธีการสำรวจข้างหลังโต๊ะเพื่อตรวจสอบการแก้ปัญหา
แรกให้เรามุ่งเน้นไปที่กรณีทั่วไป: จำนวนรายการที่ไม่ จำกัด ในกรณีนี้คุณเพียงสร้างตารางโดยที่มีค่าที่ดีที่สุดเมื่อความจุโดยรวมของเป้เท่ากับและพิจารณาเฉพาะรายการแรกเท่านั้น จากที่นี่:TTi,jij
Ti,j=max{Ti,j−1,Ti−wj,j−1+vj}
โดยที่และถึงน้ำหนักและค่าของรายการ -th ตามลำดับ ถ้าเป็นกำลังการผลิตโดยรวมของคุณเป้และมีทั้งหมดรายการทางออกที่ดีที่สุดจะได้รับโดยN} อัลกอริทึมนี้เป็นที่รู้จักกันในเวลาหลอก - พหุนามและหนึ่งในความงามของมันคือมันจะพิจารณาเฉพาะชุดที่พอดีกับความจุสูงสุดwjvjjCNTC,N
แต่นี้ไม่เพียงพอเมื่อมีการเพิ่มข้อ จำกัด ของคุณ: จำนวนสูงสุดของรายการพีเหตุผลก็คือสูตรการเกิดซ้ำก่อนหน้านี้ไม่ได้คำนึงถึงการรวมกันของรายการต่าง ๆ :p
- ขั้นแรกหากแล้วเพื่อให้รายการ -th ถูกเพิ่มเข้าไปในเป้ทั้งๆที่มีจำนวนสูงสุดของรายการพิจารณา --- เพื่อให้คุณอาจจะมีการละเมิดข้อ จำกัด ของคุณ คุณอาจถูกล่อลวงที่นี่เพื่อใช้สูตรก่อนหน้านี้ในการติดตามจำนวนรายการที่ใส่ในแต่ละขั้นตอนและไม่ต้องเพิ่มอื่น ๆ หากจำนวนรายการที่อยู่ในเป้เกินกว่าแต่Ti,j−1<(Ti−wj,j−1+vj)Ti,j=(Ti−wj,j−1+vj)jpp
- ประการที่สองถ้าดังนั้นเพื่อไม่ให้เพิ่มรายการนี้ แต่ นั่นอาจเป็นความผิดพลาดครั้งใหญ่ในกรณีที่ทางออกที่ดีที่สุดประกอบด้วยจำนวนสูงสุดของไอเท็มที่จะแทรกลงในเป้ เหตุผลก็คือเราไม่ได้ทำการเปรียบเทียบอย่างถูกต้อง: ในแง่หนึ่งเพื่อรักษาวิธีการแก้ปัญหาที่ดีที่สุดซึ่งประกอบด้วยรายการที่เลือกไว้ก่อนหน้า ; บนมืออื่น ๆ ที่ใส่รายการ -th และนอกจากนี้ยังพิจารณาส่วนย่อยที่ดีที่สุดกับรายการในหมู่ก่อนหน้า(J-1)Ti,j−1>(Ti−wj,j−1+vj)Ti,j=Ti,j−1Ti,j−1p(j−1)j(p−1)(j−1)
เพื่อให้โซลูชั่นแรกประกอบด้วยการเพิ่มมิติที่สาม สำหรับกรณีของคุณให้เป็นวิธีแก้ปัญหาที่ดีที่สุดเมื่อความจุของเป้นคือจะพิจารณาเฉพาะรายการแรกเท่านั้นและไม่อนุญาตให้ใส่มากกว่ารายการในเป้ ตอนนี้Ti,j,kijk
- หากคุณกำลังคำนวณสำหรับจำนวนรายการน้อยกว่าหรือเท่ากับจำนวนรายการที่สามารถแทรกได้ ( ) ให้ดำเนินการตามปกติ แต่ใช้ค่า :Ti,j,kj≤kkTi,j,k=max{Ti,j−1,k,Ti−wj,j−1,k+vj}
- ทีนี้ถ้าคุณต้องคำนวณสำหรับจำนวนไอเท็มที่ใหญ่กว่าจำนวนไอเท็มที่สามารถแทรกได้ ( ) ดังนั้น:Ti,j,kj>kTi,j,k=max{Ti,j−1,k,Ti−wj,j−1,k−1+vj}
การแสดงออกครั้งแรกควรมีความชัดเจน งานที่สองนับตั้งแต่เลเยอร์ -th ของตารางติดตามการรวมกันที่ดีที่สุดของรายการในบรรดารายการแรกตามที่ต้องการข้างต้น(k−1)T(k−1)(j−1)
การดำเนินงานที่มีประสิทธิภาพของขั้นตอนวิธีนี้ไม่จำเป็นต้องคำนวณสำหรับทุกkโปรดทราบว่าความสัมพันธ์ที่เกิดขึ้นก่อนหน้านี้เกี่ยวข้องกับเลเยอร์กับดังนั้นจึงเป็นไปได้ที่จะสลับกันระหว่างเลเยอร์ต่อเนื่องสองเลเยอร์ (เช่นถ้าคุณสนใจโซลูชันที่ดีที่สุดด้วยคุณเพียงแค่ใช้เลเยอร์ต่อเนื่องสองชั้น: 0 และ 1, 1 และ 2, 2 และ 3, 3 และ 4 และคุณทำเสร็จแล้ว) กล่าวอีกนัยหนึ่งอัลกอริธึมนี้ใช้หน่วยความจำสองเท่าที่จำเป็นสำหรับวิธีการดั้งเดิมโดยใช้การเขียนโปรแกรมแบบไดนามิกดังนั้นจึงยังสามารถทำงานได้ในเวลาหลอก - พหุนามTi,j,kkk(k−1)k=4
อย่างไรก็ตามโปรดทราบว่านี่ไม่ใช่ทางออกเดียว! และยังมีอีกอย่างที่คุณอาจพบว่าสง่างามกว่า ในสูตรก่อนหน้านี้ที่เราดึงวิธีการแก้ปัญหาที่ดีที่สุดซึ่งประกอบไปด้วยไม่เกินรายการในหมู่คนแรกเป็นK-1} อย่างไรก็ตามควรชัดเจนว่านี่เท่ากับเพียงแค่ใช้ตารางต้นฉบับ !! เช่น. การแก้ปัญหาที่ดีที่สุดที่มีไม่เกินรายการสามารถเรียกคืนได้ด้วยการพิจารณาวิธีการแก้ปัญหาที่ดีที่สุดด้วย 1 รายการ 2 รายการ 3 รายการ ...(k−1)(j−1)Ti,j−1,k−1maxp=0,j−1{Ti,p}k(j−1)รายการ ... เพื่อให้สูตรนี้ใช้งานได้คุณควรติดตามจำนวนไอเท็มที่พิจารณาในโซลูชันบางส่วนเพื่อให้คุณต้องมีจำนวนเต็มสองตัวต่อเซลล์ นี้ส่งผลให้หน่วยความจำในการประกอบอาชีพได้อย่างแม่นยำต้องการหน่วยความจำเดียวกันของอัลกอริทึมที่แสดงข้างต้น (โดยใช้แบบสามมิติในรูปแบบของชั้นk )
หวังว่าจะช่วยได้