ความแตกต่างของปัญหาเป้สะพายหลัง


11

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

เราจำเป็นต้องมีมิติที่ 3 หรือเราสามารถหาวิธีอื่นได้โดยไม่ต้องใช้มัน ฉันพยายามที่จะเพิ่มจำนวนรายการในเป้ในเซลล์และรับค่าสูงสุดในตอนท้ายด้วยจำนวนรายการ <=แต่มันไม่ใช่ทางออกที่ดีที่สุดp


นี่คือแบบฝึกหัดการบ้านที่ดี คุณลองทำอะไร คุณสะดวกสบายกับการเขียนโปรแกรมแบบไดนามิกหรือไม่? (ถ้าไม่ลองใช้แบบฝึกหัดเพื่อฝึกฝนด้วย) คุณเคยศึกษาอัลกอริธึมการเขียนโปรแกรมแบบไดนามิกมาตรฐานสำหรับปัญหาเครื่องหลังหรือยัง? ค้นหาวิธีการปรับเปลี่ยนวิธีการมาตรฐานนั้น งานหลักของคุณคือออกแบบชุดของปัญหาย่อย ในวิธีการมาตรฐานมาตรฐานย่อยจะถูกกำหนดโดยพารามิเตอร์หนึ่งตัว (ผูกกับน้ำหนักของรายการ) คุณอาจพิจารณาใช้สองพารามิเตอร์ (ดังนั้นชุดย่อยปัญหาที่ใหญ่กว่า) ลองความเป็นไปได้ต่าง ๆ - คุณจะได้อะไร
DW

คำตอบ:


9

เป็นคำถามที่ดีมาก!

คุณถูกสองครั้ง:

  1. การกระจายจำนวนรายการในเป้ไม่ได้นำไปสู่การแก้ปัญหาที่ดีที่สุด
  2. โซลูชันหนึ่งประกอบด้วยการเพิ่มมิติที่สาม นี่ค่อนข้างง่าย แต่จำเป็นต้องคำนึงถึงข้อเท็จจริงบางประการเมื่อทำเช่นนั้น โปรดทราบว่ามันไม่ใช่ทางเลือกเดียว

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

แรกให้เรามุ่งเน้นไปที่กรณีทั่วไป: จำนวนรายการที่ไม่ จำกัด ในกรณีนี้คุณเพียงสร้างตารางโดยที่มีค่าที่ดีที่สุดเมื่อความจุโดยรวมของเป้เท่ากับและพิจารณาเฉพาะรายการแรกเท่านั้น จากที่นี่:TTi,jij

Ti,j=max{Ti,j1,Tiwj,j1+vj}

โดยที่และถึงน้ำหนักและค่าของรายการ -th ตามลำดับ ถ้าเป็นกำลังการผลิตโดยรวมของคุณเป้และมีทั้งหมดรายการทางออกที่ดีที่สุดจะได้รับโดยN} อัลกอริทึมนี้เป็นที่รู้จักกันในเวลาหลอก - พหุนามและหนึ่งในความงามของมันคือมันจะพิจารณาเฉพาะชุดที่พอดีกับความจุสูงสุดwjvjjCNTC,N

แต่นี้ไม่เพียงพอเมื่อมีการเพิ่มข้อ จำกัด ของคุณ: จำนวนสูงสุดของรายการพีเหตุผลก็คือสูตรการเกิดซ้ำก่อนหน้านี้ไม่ได้คำนึงถึงการรวมกันของรายการต่าง ๆ :p

  1. ขั้นแรกหากแล้วเพื่อให้รายการ -th ถูกเพิ่มเข้าไปในเป้ทั้งๆที่มีจำนวนสูงสุดของรายการพิจารณา --- เพื่อให้คุณอาจจะมีการละเมิดข้อ จำกัด ของคุณ คุณอาจถูกล่อลวงที่นี่เพื่อใช้สูตรก่อนหน้านี้ในการติดตามจำนวนรายการที่ใส่ในแต่ละขั้นตอนและไม่ต้องเพิ่มอื่น ๆ หากจำนวนรายการที่อยู่ในเป้เกินกว่าแต่Ti,j1<(Tiwj,j1+vj)Ti,j=(Tiwj,j1+vj)jpp
  2. ประการที่สองถ้าดังนั้นเพื่อไม่ให้เพิ่มรายการนี้ แต่ นั่นอาจเป็นความผิดพลาดครั้งใหญ่ในกรณีที่ทางออกที่ดีที่สุดประกอบด้วยจำนวนสูงสุดของไอเท็มที่จะแทรกลงในเป้ เหตุผลก็คือเราไม่ได้ทำการเปรียบเทียบอย่างถูกต้อง: ในแง่หนึ่งเพื่อรักษาวิธีการแก้ปัญหาที่ดีที่สุดซึ่งประกอบด้วยรายการที่เลือกไว้ก่อนหน้า ; บนมืออื่น ๆ ที่ใส่รายการ -th และนอกจากนี้ยังพิจารณาส่วนย่อยที่ดีที่สุดกับรายการในหมู่ก่อนหน้า(J-1)Ti,j1>(Tiwj,j1+vj)Ti,j=Ti,j1Ti,j1p(j1)j(p1)(j1)

เพื่อให้โซลูชั่นแรกประกอบด้วยการเพิ่มมิติที่สาม สำหรับกรณีของคุณให้เป็นวิธีแก้ปัญหาที่ดีที่สุดเมื่อความจุของเป้นคือจะพิจารณาเฉพาะรายการแรกเท่านั้นและไม่อนุญาตให้ใส่มากกว่ารายการในเป้ ตอนนี้Ti,j,kijk

  • หากคุณกำลังคำนวณสำหรับจำนวนรายการน้อยกว่าหรือเท่ากับจำนวนรายการที่สามารถแทรกได้ ( ) ให้ดำเนินการตามปกติ แต่ใช้ค่า :Ti,j,kjkkTi,j,k=max{Ti,j1,k,Tiwj,j1,k+vj}
  • ทีนี้ถ้าคุณต้องคำนวณสำหรับจำนวนไอเท็มที่ใหญ่กว่าจำนวนไอเท็มที่สามารถแทรกได้ ( ) ดังนั้น:Ti,j,kj>kTi,j,k=max{Ti,j1,k,Tiwj,j1,k1+vj}

การแสดงออกครั้งแรกควรมีความชัดเจน งานที่สองนับตั้งแต่เลเยอร์ -th ของตารางติดตามการรวมกันที่ดีที่สุดของรายการในบรรดารายการแรกตามที่ต้องการข้างต้น(k1)T(k1)(j1)

การดำเนินงานที่มีประสิทธิภาพของขั้นตอนวิธีนี้ไม่จำเป็นต้องคำนวณสำหรับทุกkโปรดทราบว่าความสัมพันธ์ที่เกิดขึ้นก่อนหน้านี้เกี่ยวข้องกับเลเยอร์กับดังนั้นจึงเป็นไปได้ที่จะสลับกันระหว่างเลเยอร์ต่อเนื่องสองเลเยอร์ (เช่นถ้าคุณสนใจโซลูชันที่ดีที่สุดด้วยคุณเพียงแค่ใช้เลเยอร์ต่อเนื่องสองชั้น: 0 และ 1, 1 และ 2, 2 และ 3, 3 และ 4 และคุณทำเสร็จแล้ว) กล่าวอีกนัยหนึ่งอัลกอริธึมนี้ใช้หน่วยความจำสองเท่าที่จำเป็นสำหรับวิธีการดั้งเดิมโดยใช้การเขียนโปรแกรมแบบไดนามิกดังนั้นจึงยังสามารถทำงานได้ในเวลาหลอก - พหุนามTi,j,kkk(k1)k=4

อย่างไรก็ตามโปรดทราบว่านี่ไม่ใช่ทางออกเดียว! และยังมีอีกอย่างที่คุณอาจพบว่าสง่างามกว่า ในสูตรก่อนหน้านี้ที่เราดึงวิธีการแก้ปัญหาที่ดีที่สุดซึ่งประกอบไปด้วยไม่เกินรายการในหมู่คนแรกเป็นK-1} อย่างไรก็ตามควรชัดเจนว่านี่เท่ากับเพียงแค่ใช้ตารางต้นฉบับ !! เช่น. การแก้ปัญหาที่ดีที่สุดที่มีไม่เกินรายการสามารถเรียกคืนได้ด้วยการพิจารณาวิธีการแก้ปัญหาที่ดีที่สุดด้วย 1 รายการ 2 รายการ 3 รายการ ...(k1)(j1)Ti,j1,k1maxp=0,j1{Ti,p}k(j1)รายการ ... เพื่อให้สูตรนี้ใช้งานได้คุณควรติดตามจำนวนไอเท็มที่พิจารณาในโซลูชันบางส่วนเพื่อให้คุณต้องมีจำนวนเต็มสองตัวต่อเซลล์ นี้ส่งผลให้หน่วยความจำในการประกอบอาชีพได้อย่างแม่นยำต้องการหน่วยความจำเดียวกันของอัลกอริทึมที่แสดงข้างต้น (โดยใช้แบบสามมิติในรูปแบบของชั้นk )

หวังว่าจะช่วยได้


การตอบสนองที่ดีมากขอบคุณ ฉันสามารถผ่านมันก่อนโพสต์ของคุณด้วยการใช้มิติที่สาม
user11536

ขอบคุณมากสำหรับการปิดคำถามและดีใจที่ได้ยินว่าคุณชอบคำตอบ เพื่ออธิบายความคิดของฉันฉันได้ลองใช้งานอัลกอริทึมนี้ใน Python หากคุณสนใจที่จะดูให้ฉันรู้และฉันจะโพสต์มันอย่างมีความสุข (หรือส่งให้คุณ) ไชโย
Carlos Linares López

คำอธิบายที่น่าอัศจรรย์ของปัญหาเป้สะพายหลังหลายมิติอย่างไรก็ตามฉันสงสัยว่าถ้าเรามีกรณีที่คล้ายกัน แต่มีองค์ประกอบ k แน่นอนเราจะดูเฉพาะค่าที่ส่งคืนโดยคอลัมน์ kth ของมิติที่ 3 หากไม่มีค่าจะส่งคืน 0.I ไม่แน่ใจว่าฉันพูดถูกหรือเปล่าเพราะฉันยังใหม่กับการเขียนโปรแกรมแบบไดนามิก
SteveIrwin

@ CarlosLinaresLópezคำตอบที่ดี คุณกรุณาแบ่งปันสคริปต์หลามด้วยหรือไม่ อาจจะโพสต์ไว้ใน gist.github.com?
ซาดมาลิก

1
สวัสดี @Carlos! ผมโพสต์คำถามติดตามเพื่อใช้สูตรสำรองของคุณที่นี่: หา n ที่ดีที่สุดรายการใน 0/1 เป้ อย่างไรก็ตามฉันหวังว่าคุณจะเพลิดเพลินกับวันหยุดของคุณ!
ซาดมาลิก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.