สถาปัตยกรรมการสั่งการของป้อมปราการคนแคระ


21

วิธีที่ดีที่สุดในการใช้ระบบการสั่งซื้อคำสั่งสำหรับ AI คืออะไร? ตัวอย่างเช่นในป้อมปราการคนแคระเมื่อคุณทำเครื่องหมายพื้นที่ป่าสำหรับการตัดไม้จากนั้นคนแคระจะทำตามลำดับต่อไปนี้:

  1. ไปที่ต้นไม้
  2. สับต้นไม้
  3. ส่งไม้ไปยังคลังสินค้า
  4. ไปที่ต้นไม้ต้นอื่น
  5. และอื่น ๆ ..

ฉันมีคำสั่งสแต็คที่ไม่ทำงาน 1 ซึ่งเปลี่ยนจากสถานะไม่ได้ใช้งานไปถึงไทล์ปลายทางของต้นไม้

สิ่งที่ฉันกลัวคือสิ่งนี้จะยุ่งเมื่อฉันสร้างคำสั่งซื้อเพิ่มเติมเช่นนี้:

สร้างบ้าน

  1. ไปที่คลังสินค้า
  2. นำไม้ไปยังพื้นที่ก่อสร้าง
  3. กลับไปที่คลังสินค้า
  4. นำหินไปที่บริเวณก่อสร้าง
  5. อาคารสไปรต์เคลื่อนไหว

การเพาะปลูก

  1. ไปที่คลังสินค้า
  2. นำเมล็ดพันธุ์ไปสู่แปลงฟาร์ม

การต้มเบียร์

  1. ไปที่คลังสินค้า
  2. นำพืชให้นิ่ง
  3. เบียร์สไปรต์เคลื่อนไหว

ดังนั้นคำถามของฉันคือฉันจะใช้ระบบการสั่งคำสั่งเช่นป้อมปราการคนแคระและหลีกเลี่ยงรหัสสปาเก็ตตี้ในเวลาเดียวกันได้อย่างไร มีโครงสร้างข้อมูลใดบ้างที่ฉันต้องการศึกษา ฉันต้องใส่ลำดับคำสั่งลงในไฟล์ xml แยกกันหรือไม่


1
ป้อมปราการคนแคระจริงๆแล้วไม่มีระบบดังกล่าว คนแคระได้รับมอบหมายงานครั้งละหนึ่งงานและคนแคระที่ไม่ทำงานจะมองหาบางสิ่งที่ต้องทำ ("เฮ้มีต้นไม้ไว้สำหรับสับ - ฉันควรจะสับมัน!" / "เฮ้, มีไม้สักอันไม่ได้อยู่ในคลังสินค้า - ฉันควรจะเอามันไปไว้ที่หนึ่ง!")
user253751

1
คนแคระไม่ได้รับมอบหมายอะไรจากผู้เล่น แต่เป็นงานที่ "มอบหมาย" โดยระบบซึ่งเป็นสถาปัตยกรรมที่ Jed T. อธิบายไว้ข้างต้นทั้งหมด สร้างคำสั่งซื้อและระบบจะมอบหมายงานของแต่ละองค์ประกอบเพื่อให้คำสั่งนั้นสมบูรณ์
Attackfarm

2
โปรดทราบว่าสิ่งนี้เรียกว่าการจัดสรรงานและการจัดตารางเวลาและมีการศึกษาอย่างกว้างขวางในสาขาวิศวกรรมต่างๆ คุณจะพบเอกสารจำนวนมากพูดคุยเกี่ยวกับปัญหานี้ซึ่งอาจเป็นที่สนใจ
TonioElGringo

@Atackfarm ระบบจะไม่ตัดสินใจล่วงหน้าทั้งหมด และไม่มอบหมายงานหลายอย่างให้แก่คนแคระคนเดียวกัน ภารกิจแรกได้รับมอบหมายในตอนแรกและเมื่องานเสร็จภารกิจจะมีผลทำให้งานอื่นพร้อมใช้งาน
user253751

2
ดูเหมือนว่าเป็นกรณีการใช้งานที่ยอดเยี่ยมสำหรับการวางแผนปฏิบัติการที่มุ่งเน้นเป้าหมาย
ปัญหา

คำตอบ:


27

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

ตัดไม้

  • ฉันกำลังแบกไม้และคลังสินค้าหรือไม่? ใช่ : ย่อหย่อน
  • ฉันกำลังแบกไม้หรือไม่ ใช่ : ไปที่คลังสินค้า
  • ฉันอยู่ที่ต้นไม้หรือไม่ ใช่ : สับมัน
  • ไม่ใช่ทั้งหมดข้างต้น : ไปที่ต้นไม้

ข้อดีของการนี้คือ:

  • ง่ายมากที่จะใช้
  • มีความยืดหยุ่น - คุณสามารถแยกย่อยรายการนี้เพิ่มรายการลบรายการรวมรายการได้อย่างอิสระ
  • ไม่มีรัฐ - คุณสามารถเรียกใช้รายการนี้จากด้านบนสำหรับคนแคระในรัฐใดก็ได้และคนแคระจะทำสิ่งที่ถูกต้องTM

ข้อเสีย:

  • มันง่ายที่จะติดอยู่ในลูปเนื่องจากไม่มีสถานะและไม่รับรู้ถึงการติดขัด

ตามหลักเหตุผลคุณสามารถแสดงคำสั่งเหล่านี้เป็นแผนภูมิการไหลที่เรียกใช้จากด้านบนในแต่ละครั้งและสิ่งที่คุณทำขึ้นอยู่กับว่าคุณตอบว่าใช่ / ไม่ใช่ในแต่ละขั้นตอน ไม่ว่าคุณจะใช้สิ่งนี้ในรหัสหรือในไฟล์ภายนอกเช่น XML ขึ้นอยู่กับคุณ


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

7
@ ratchetfreak "ฉันรู้ว่าความปลอดภัยของป้อมปราการนั้นขึ้นอยู่กับการต่อสู้กับสัตว์ประหลาดตัวนี้เพื่อที่มันจะไม่โจมตีพลเรือน แต่เอ้ยเอ้ยท้องของฉันแค่คำราม!" พยายามอย่าทำให้มันเหมือน DF มากเกินไป: P
Colonel Thirty Two

ผมคิดว่าสิ่งที่คล้ายนี้ใช้ (หรืออย่างน้อยใช้) ซึ่งได้รับอนุญาตสิ่งประดิษฐ์ Bugged ของplanepacked (นี่คือเนื่องจากเป็นรายการที่ต้องห้ามซึ่งก่อให้เกิดกล่าวว่าการวนลูป)
Destrictor

3
@ColonelThirtyTwo ที่funอยู่ในนั้น? ;)
Lasse

ฉันไม่แนะนำให้ใช้การวางแผนการดำเนินการเชิงสัญลักษณ์สำหรับสิ่งนี้ เป็นไปไม่ได้ที่จะทำการดีบักและพฤติกรรมที่ไม่พึงประสงค์สามารถเกิดขึ้นได้ง่าย hardcode ลำดับการกระทำสำหรับแต่ละงานง่ายขึ้นมากในวิธีการขั้นตอน
mklingen

10

หากคุณสามารถทำให้ซีเควนซ์เป็นเรื่องทั่วไปได้ไม่มากนัก

ในกรณีที่มีการส่งมอบเช่น: WorkTask ทำงานกับ WorkPlan Workplan กล่าวว่าหน่วยทรัพยากรประเภทใดจะต้องเลือกจากบ้านประเภทใดโดยใช้ภาพเคลื่อนไหววอล์คกิ้งซึ่งใช้ภาพเคลื่อนไหวทำงานเวลาในการทำงานและรายละเอียดทั้งหมดดังกล่าว ดังนั้นในที่สุด WorkTask อาจมีลักษณะดังนี้:

  1. ค้นหา% resource1% บนแผนที่
  2. ไปที่ตำแหน่งนั้นโดยใช้% animation_1%
  3. ทำงานในสถานที่โดยใช้% animation_2% สำหรับ% time%
  4. รับ% req_resource1% ในการนับ% req_count1%
  5. ไปที่% home% โดยใช้% animation%
  6. เริ่ม% animation_6% ภายในสำหรับ% time_2%
  7. ฯลฯ ..

เราใช้วิธีการที่อธิบายไว้เรียบร้อยแล้ว เรามี 15 งานในเกมของเรา ไฮไลท์บางส่วน:

  • งานให้หน่วยกระทำ (ไปที่นั่น, เข้า, ออก, ไปที่นี่, อยู่, ทำงาน, ไป)
  • การกระทำจบลงด้วยสถานะ Done หรือ Aborted และส่งต่อไปยัง Task
  • ทุกอย่างเป็นฮาร์ดโค้ด (ไม่จำเป็นต้องเขียนโปรแกรมแยกวิเคราะห์วิธีส่วนต่อประสานความสามารถในการย้อนหลัง)
  • แต่ละงานใช้บทคัดย่อคลาสงานที่มีวิธีการทั่วไปเพียงไม่กี่วิธี (สร้างดำเนินการบันทึกโหลด)
  • โดยทั่วไปงานหนึ่งงานต่อโมดูล แต่งานที่คล้ายกันอยู่ในงานเดียว
  • งานที่คล้ายกันมากอยู่ในชั้นเดียวและปกครองโดย IFs ไม่กี่ (ส่งไปที่บ้านหรือส่งไปยังหน่วย)
  • แต่ละงานต้องมีการล็อคและปลดล็อคทรัพยากรอย่างเหมาะสม (ถ้าหน่วยตายในขั้นตอนใด ๆ ทรัพยากรที่เขาล็อคจะต้องได้รับการปล่อยตัว)

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

5

ดังนั้นนี่คือปัญหาการเรียงลำดับภูมิประเทศแบบเป็นฐาน

คุณมีกราฟแต่ละโหนดเป็นงานที่ต้องทำและบางโหนดขึ้นอยู่กับโหนดอื่น ๆ (นี่คือขอบในกราฟจากโหนดขึ้นอยู่กับโหนดนั้นขึ้นอยู่กับ) คุณต้องการทำงานทั้งหมดดังนั้นคุณต้องสร้างการเรียงลำดับบางอย่างของโหนดที่มีภูมิประเทศเป็นปกติ (โหนดที่ขึ้นอยู่กับหลังจากโหนดนั้นขึ้นอยู่กับ)

ตอนนี้มี orderings ดังกล่าวจำนวนมากโดยปกติ (เพราะบางโหนดไม่มีการพึ่งพาและสามารถวางที่ใดก็ได้และบางโหนดมีการพึ่งพาเหมือนกันและไม่ได้ขึ้นอยู่กับแต่ละอื่น ๆ ดังนั้นพวกเขาจึงสามารถอยู่ในลำดับใด ๆ ระหว่างตัวเองและโหนดใด ๆ ถูกวางในตำแหน่งใด ๆ หลังจากเสร็จสิ้นการอ้างอิงและก่อนที่โหนดขึ้นอยู่กับว่ามันทำเสร็จแล้ว)

อาจเป็นไปได้ว่าไม่มีวิธีการจัดเรียงกราฟภูมิประเทศ - สิ่งนี้เกิดขึ้นเมื่อมีรอบในกราฟ (คุณไม่มีไม้เพื่อให้ได้ไม้ที่คุณต้องใช้ในการสับต้นไม้เพื่อตัดต้นไม้ที่คุณต้องการให้ขวานเป็นขวาน ต้องการไม้) ในกรณีเช่นนี้อัลกอริทึมควรระบุผู้เล่นว่างานเหล่านี้ไม่สามารถทำได้

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

นอกจากนี้คุณยังสามารถเพิ่มงานการกู้คืน - วิธีที่ง่ายที่สุดอาจเป็นเพียงการเพิ่มงานด้วยการหมดเวลาอีกครั้งในกราฟในแต่ละครั้งที่ทำ

ตอนนี้วิธีแก้ปัญหา - http://en.wikipedia.org/wiki/Topological_sorting

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.