ระบบสินค้าคงคลังอัตโนมัติ / จัดสมาร์ท?


11

สำหรับสัปดาห์ที่แล้วฉันได้ทำงานกับระบบสินค้าคงคลังด้วย Unity3D ตอนแรกฉันได้รับความช่วยเหลือจากพวกที่ Design3 แต่มันก็ไม่นานจนเราแยกทางกันเพราะฉันไม่ชอบวิธีที่พวกเขาใช้รหัสพวกเขาไม่มีกลิ่นของ OOP ใด ๆ

ฉันทำตามขั้นตอนต่อไป - รายการใช้มากกว่าหนึ่งช่องระบบการจัดวางขั้นสูง (รายการพยายามอย่างดีที่สุดเพื่อหาสิ่งที่เหมาะสมที่สุด) ระบบเมาส์ในตัวเครื่อง (เมาส์ถูกขังอยู่ในพื้นที่ใช้งานกระเป๋า) ฯลฯ

นี่คือตัวอย่างการทำงานของฉัน

สิ่งที่เราต้องการมีในเกมของเราคือคุณลักษณะการจัดระเบียบอัตโนมัติ - ไม่ใช่การจัดเรียงอัตโนมัติ เราต้องการคุณสมบัตินี้เนื่องจากคลังของเราจะเป็น 'เรียลไทม์' - ไม่เหมือนใน Resident Evil 1,2,3 ฯลฯ ที่คุณจะหยุดเกมชั่วคราวและทำสิ่งต่างๆในคลังของคุณ ทีนี้ลองนึกภาพตัวคุณเองในสถานการณ์ที่ถูกล้อมรอบไปด้วยซอมบี้และคุณไม่มีกระสุนคุณมองไปรอบ ๆ คุณเห็นว่ามีกระสุนอยู่ในพื้นดินดังนั้นคุณจึงไปหาพวกเขาและพยายามเลือกพวกเขา แต่พวกเขาไม่ พอดี! คุณดูสินค้าคงคลังของคุณและพบว่าหากคุณจัดระเบียบบางรายการใหม่มันจะพอดี! - ตอนนี้ผู้เล่น - ในสถานการณ์นั้นไม่มีเวลาที่จะจัดระเบียบใหม่เพราะเขาล้อมรอบด้วยซอมบี้และจะตายถ้าเขาหยุดและจัดระเบียบสินค้าคงคลังเพื่อให้มีพื้นที่ (จำสินค้าคงคลังในแบบเรียลไทม์ไม่หยุดชั่วคราว) - จะไม่ มันจะดีสำหรับการที่จะเกิดขึ้นโดยอัตโนมัติ? - ใช่!

(ฉันเชื่อว่าสิ่งนี้ได้ถูกนำไปใช้ในบางเกมเช่น Dungeon siege หรืออะไรบางอย่างเพื่อให้แน่ใจว่าทำได้)

ลองดูตัวอย่างนี้:

การเรียงลำดับอัตโนมัติทำอะไรได้บ้าง

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

ฉันไม่ได้ถามว่า "จะเขียนรหัสอย่างไร" สำหรับเรื่องนี้ฉันแค่ขอคำแนะนำบางอย่างที่จะมองอัลกอริทึมที่เกี่ยวข้อง? สิ่งนี้เกี่ยวข้องกับกราฟและเส้นทางที่สั้นที่สุดหรือไม่? ฉันหวังว่าจะไม่ cuz ฉันไม่สามารถจัดการศึกษาต่อในวิทยาลัยของฉันได้: / ถึงแม้ว่าจะเป็นเพียงบอกฉันและฉันจะได้เรียนรู้สิ่งที่เกี่ยวข้อง

สังเกตเห็นว่าอาจมีมากกว่าหนึ่งวิธี ดังนั้นฉันคิดว่าสิ่งแรกที่ฉันต้องทำคือหาว่าสถานการณ์นั้น 'แก้ไขได้' - ถ้าฉันรู้วิธีตัดสินว่าสถานการณ์นั้นแก้ไขได้หรือไม่จากนั้นฉันก็สามารถ 'แก้ปัญหา' ได้ ฉันแค่ต้องรู้เงื่อนไขที่ทำให้ 'แก้ไขได้' และฉันเชื่อว่าต้องมีอัลกอริทึม / โครงสร้างข้อมูลสำหรับสิ่งนี้

นี่คือรูปสำหรับมากกว่าหนึ่งวิธีในการลองใส่รายการ 1x3:

ป้อนคำอธิบายรูปภาพที่นี่

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

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

อัปเดตจากคำอธิบาย

@ สตีเฟ่นฉันไม่มีกูรูใน Alogs คุณพูดถึง 'knapsack' และ @BlueRaja - Danny Pflughoeft พูดถึง 2D algo packing algo พวกเขาเกี่ยวข้องกันหรือไม่? - ฉันยังสับสนว่าฉันควรเข้าใกล้เรื่องนี้อย่างไร

และใช่ฉันใช้ "ฮิวริสติก" อยู่แล้ว แต่ฉันไม่รู้จริง ๆ ว่าฉันเป็น: D พบช่องแรกที่พร้อมใช้งานและดูว่ารายการพอดีหรือไม่

ฉันไม่ทราบว่าการสั่งซื้อสินค้าตาม "ความใหญ่โต" (ซึ่งฉันเรียกว่า nSlotsRequired = nRowsReq * nColsRec) จะใช้งานได้หรือไม่เพราะคุณมีรายการ 2x2 และ 1x4 พวกเขามีขนาดเท่ากัน แต่รูปร่างที่แตกต่างกันและจะมี เอฟเฟกต์ที่แตกต่างกันเกี่ยวกับวิธีที่เหลือของรายการถัดไป ดังนั้น ... : /

ฉันดูวิดีโอนี้ฉันชอบความคิดแบบเต็มรูปแบบจริงๆ แต่ฉันสงสัยว่าจะทำยังไงต่อไปเนื่องจากสินค้าคงคลังเป็นแบบ 2D ฉันไม่แน่ใจด้วยซ้ำว่าช่องเก็บของเป็นกุญแจสำคัญที่นี่เพราะมันเป็นความจริงที่ฉันสามารถมีถุงได้มากกว่าหนึ่งใบ แต่ในเกมของเรามันจะเป็นแค่ถุงเดียว ดังนั้นมันเป็นเรื่องของการใส่ของในถุง 'หนึ่ง' และไม่มากไปกว่านั้น ตัวอย่างใน vid นั้น (ท่อและรถเมล์) ไม่ตรงกับปัญหาของฉัน นอกจากนี้ยังดูบางสิ่งเกี่ยวกับสิ่งที่เป้หลังนี้ฉันไม่เห็นว่า 'ค่า' เกี่ยวข้องกับรายการ / สินค้าคงคลังของฉันอย่างไร แต่ฉันคิดว่า 'น้ำหนัก' นั้นเหมือนกับความเป็นกลุ่มไม่แน่ใจ


7
นี่คือการบรรจุถังสองมิติซึ่งเป็น NP-Complete ดังนั้นอัลกอริทึมใด ๆ ที่จะบอกคุณว่าคุณสามารถใส่รายการทั้งหมดจะไม่มีประสิทธิภาพ (ในกรณีที่แย่ที่สุด) คุณสามารถหาอัลกอริทึมการประมาณที่ค่อนข้างดีได้
BlueRaja - Danny Pflughoeft

นี่คือเหตุผลที่ฉันตัดสินใจในรูปแบบพื้นที่โฆษณาหนึ่งประเภทต่อหนึ่งรายการแทนที่จะเป็นแบบนี้ ฉันหวังว่าฉันจะมีทางออกให้คุณฉันยอมแพ้กับปัญหานี้ ...
Ryno

@ BlueRaja-DannyPflughoeft ฉันสงสัยว่าอัลกอริทึมที่เรียบง่าย / มีประสิทธิภาพสามารถใช้ได้ถ้ารายการถูก จำกัด รูปร่างบางอย่าง?
congusbongus

การ จำกัด รูปร่างไม่ได้ลดความซับซ้อน แต่เพียงทำให้คิดได้ง่ายขึ้นดังนั้นคุณจึงคิดว่าความซับซ้อนนั้นได้รับการจัดการแล้ว
Patrick Hughes

@VeXe ขออภัยฉันพลาดการอัปเดตสำหรับคำถามของคุณ ถังบรรจุและเป้ไม่เหมือนกัน แต่ทั้งคู่เป็นปัญหาการบรรจุ 'มูลค่า' ในกรณีของคุณคือรูปร่างและขนาดของวัตถุสินค้าคงคลังของคุณ
Stephen

คำตอบ:


8

นี่คือรูปแบบของปัญหาเครื่องหลัง ในฐานะที่เป็น Danny Pflughoeft กล่าวถึงมันเป็น NP-Complete หมายความว่ามันไม่สามารถแก้ไขได้ในเวลาเชิงเส้นถ้าฉันจำได้อย่างถูกต้อง

แต่คุณสามารถลองแก้ปัญหานี้ได้ในหลายขั้นตอน มันเป็นปัญหาการเรียงลำดับ

ฉันจะเริ่มต้นด้วยการคำนวณ 'ความใหญ่โต' ของแต่ละรายการ: สามารถคำนวณได้หลายวิธี:

  • bulkiness = สูงสุด (ความยาวความกว้าง);

  • bulkiness = length * width

  • bulkiness = sqrt (กว้าง * ยาว)

จากนั้นเริ่มวางรายการที่มีคะแนนสูงสุดก่อนลงในสินค้าคงคลัง เนื่องจากพวกเขาส่วนใหญ่จะไม่พอดีกับพื้นที่ที่เหลือในภายหลัง รายการเล็ก ๆ จะพอดีเสมอ

คุณต้องมีฮิวริสติก (ชื่อแฟนซีสำหรับการศึกษาที่คาดเดา ;-)) สำหรับกลยุทธ์การวางของคุณ บางสิ่งบางอย่างเช่นพยายามใส่ไอเท็มในช่องฟรีแรกจากมุมบนซ้ายหรือบางอย่าง

กลยุทธ์การเรียงลำดับสินค้าคงคลัง Diablo II ทำงานค่อนข้างคล้ายกันฉันคิดว่า สิ่งต่าง ๆ เช่นดาบและหอกจะจบลงที่มุมบนซ้ายจากนั้นก็ใส่เสื้อผ้าและชุดเกราะจากนั้นก็ใส่เกราะและอื่น ๆ

ฉันคิดว่าคุณต้องลองทำสิ่งนี้และปรับแต่งอัลกอริทึม (การคำนวณจำนวนมากต่างกันฮิวริสติกที่แตกต่างกัน) จนกระทั่งมันใช้งานได้พอสมควร


1
NP-complete คือชุดของปัญหาที่มีความซับซ้อนสูงกว่าพหุนาม สำหรับสินค้าคงคลังที่ค่อนข้างเล็ก (น้อยกว่าพันรายการที่ฉันพูดถึง :)) แม้อัลกอริทึมแบบเอ็กซ์โปเนนเชียลจะทำงานได้ค่อนข้างเร็ว อย่างไรก็ตามการใช้ความคิดของคุณควรจะดีพอและง่ายกว่าการใช้อัลกอริธึมการเขียนโปรแกรมแบบไดนามิก -> +1
MartinTeeVarga

ขอบคุณสำหรับการโหวต ใช่คลังโฆษณาไม่ควรจะไม่มีที่สิ้นสุดดังนั้นอัลกอริธึมเชิงเอ็กซ์โปน่าจะใช้ได้ดี ^^
Stephen

@ sm4: โดยทั่วไปหนึ่งพันเป็นจำนวนมหาศาลสำหรับปัญหา NP-Complete โปรดจำไว้ว่าปัญหาเหล่านี้คือ O (2 ^ n) - แม้เพียง 2 ^ 64 ก็เป็นไปไม่ได้!
BlueRaja - Danny Pflughoeft

3

ฮ่าฮ่า @ ทุกคนที่ช่วยขอบคุณ ฉันจัดการเพื่อแก้ไขมันในที่สุด นี่คือสิ่งที่ฉันทำโดยทั่วไป:

IEnumerator AddItem_Sorted (Item item)
  1. สภาพเล็กน้อย: ตรวจสอบว่าเราได้รับ min nRequiredSlots เพื่อให้พอดีกับรายการหรือไม่ถ้าเรามีมันดำเนินการต่อ ...
  2. เราจะลบถุงทั้งหมดออก - วางสิ่งของไว้ในที่ยึด (รายการหรืออะไรก็ได้)
  3. เพิ่มรายการที่ต้องการลงในช่อง / สถานที่สุดท้ายที่สามารถใส่ได้พอดีทำให้แน่ใจว่าเป็นรูปแนวนอน
  4. การใช้อัลกอริธึมที่ลดลงแบบแรกเราจะเพิ่มรายการที่เหลือของเรา
  5. ในระหว่างการเพิ่มเราจะใช้การเขียนโปรแกรมแบบไดนามิก (memoisation) เพื่อจดจำดัชนีที่เราเพิ่มที่ (ดัชนีของช่องที่มีอยู่ถัดไป)
  6. หากการเพิ่มทั้งหมดเป็นความสำเร็จเราได้จัดการให้พอดีกับรายการที่เราต้องการและจัดเรียงกระเป๋า - จากรายการใหญ่ไปยังชิ้นเล็ก ๆ
  7. ถ้าเราไม่สามารถเพิ่มรายการทั้งหมดนั่นหมายความว่านี่ไม่ใช่สถานการณ์ที่แก้ไขได้ดังนั้นเราต้องเอากระเป๋าไปที่สถานะก่อนหน้า
  8. วิธีหนึ่งที่จะทำเช่นนั้น (ออกมาจากพื้นผิวจิตใจของฉัน) คือการคัดลอกสถานะของกระเป๋าก่อนการคัดค้านทั้งหมดนี้และถ้ามันล้มเหลวเราจะถ่ายไปยังสถานะก่อนหน้านั้นหรือดีกว่าในระหว่าง ' การล้างของกระเป๋าเราจำได้ว่าแต่ละรายการอยู่ที่ไหนดังนั้นถ้า op ล้มเหลวเราจะเอามันกลับมา - ใช้ AddItem (รายการ, ดัชนี) - ที่ดัชนีก่อนหน้านี้ :)
  9. กระบวนการทั้งหมดนี้อาจใช้เวลาดังนั้นเราจึงสามารถแบ่งโหลดในเฟรมแยกโดยใช้อัตราผลตอบแทนที่น่ารักของฉัน :)
  10. ทำเสร็จแล้ว ! \ m / (@ ~ 9: 00)

UPDATE:

  1. ฉันสร้างอาร์เรย์ที่เก็บดัชนีของรายการที่เพิ่มทั้งหมดด้วยวิธีที่ฉันไม่ต้องไปและค้นหาสล็อตที่ว่างเพื่อให้ฉันได้ฟรี - เพิ่มพลังมหาศาล

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

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


ยินดีต้อนรับคุณ! :) ฉันอยากจะขอบคุณ BlueRaja - Danny Pflughoeft สำหรับการพูดถึงการบรรจุ bin @Stephen สำหรับความคิดที่มีขนาดใหญ่และ Richard Buckland สำหรับการบรรยายการเขียนโปรแกรมแบบไดนามิกและการบรรยายทั้งหมด
vexe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.