จะค้นหาเส้นทางผ่านสิ่งกีดขวางได้อย่างไร


10

วิธีแสดงสถานการณ์ต่อไปนี้ดีที่สุด - agent ( @) จำเป็นต้องไปถึงเป้าหมาย ( $) เส้นทางถูกบล็อกโดยคูเมือง ( ~~~) มีคราด (หรืออุปกรณ์อื่น ๆ เช่นรองเท้าบูทน้ำ) ที่จะทำให้สามารถข้ามสิ่งกีดขวางได้

.....~~~...   . ground
...=.~~~...   = rake
.....~~~.$.   ~ water
.@...~~~...   @ agent
.....~~~...   $ goal

วิธีการหาเส้นทางอย่างถูกต้องจาก@ไปยังที่$ระบุไม่มีเส้นทางที่พร้อมใช้งานทันทีหรือไม่ เส้นทางของฉันควรมีค่าใช้จ่ายไม่เพียง แต่ยังจำเป็นต้องมี?

UPD : ปัญหาคือเป้าหมายไม่สามารถเข้าถึงได้และเรคเป็นเพียงหนึ่งในวัตถุที่เป็นไปได้มากมายบนแผนที่ คำถามคือ "ทำอย่างไรให้ตัวแทนเข้าใจว่าต้องการคราด"


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

คำตอบ:


6

ฉันคิดเกี่ยวกับสแต็คของเป้าหมาย, pathfinding จะต้องมีคำอธิบายประกอบ :

  • เริ่มด้วยเป้าหมาย get $
  • ลองค้นหาเส้นทางสู่$- เส้นทางที่มีอยู่ด้วยความสามารถในการเดินน้ำ
  • get waterwalkingเป้าหมายการผลักดัน
  • สแต็คเป้าหมายอยู่ในขณะนี้ get waterwalking, get $
  • อย่างใดพบว่าคราดให้ทางเดินน้ำให้เปลี่ยนชื่อเป็นเรือ
  • เสาะหาเส้นทาง เป้าหมายสูงสุดถึง pop get $ได้จากกองเป้าหมายคือ
  • เส้นทางสู่$- ตอนนี้เรามีความสามารถและสามารถบรรลุเป้าหมาย

1
+1 ผมทำอะไรที่คล้ายกับเกมของฉันและเขียนโพสต์เล็ก ๆ น้อย ๆ เกี่ยวกับเรื่องนี้ในขณะที่กลับภายใต้งานหน่วยและpathfinding
MichaelHouse

@ byte66 ไม่จัดการกรณีพิเศษเมื่อมีเส้นทางโดยไม่ใช้ rake แต่การใช้ rake ให้ผลลัพธ์ในเส้นทางที่สั้นกว่า
Ali1S232

@Gajet คุณพูดถูก เดาว่าจะต้องมีวิธีการที่แตกต่างกัน
zzandy

1
เป็นเพียงเรื่องของการเพิ่มค่าใช้จ่ายเพิ่มเติม เมื่อคุณพบกับน้ำให้เพิ่มค่าใช้จ่ายในการรับไอน้ำเดินไปยังเส้นทาง A * จะข้ามทางเดินน้ำจนกว่าจะกลายเป็นเส้นทางที่ถูกที่สุด
MichaelHouse

3

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


+1 ทำให้เรคของคุณเชื่อมโยงทางเดียวไปยังน้ำโดยใช้การเชื่อมต่อทางเดียวไปยังพื้นดิน
Laurent Couvidou

ฉันไม่มีความเข้าใจที่ชัดเจนเกี่ยวกับวิธีรวมการค้นหาเชิงเรขาคณิตและการค้นหาคุณลักษณะ วิธีที่จะไปจากการno path from @ to $ goto rake, bring it to water, place it, goto $
zzandy

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

แต่ถ้าคุณพกอุปกรณ์ได้ล่ะ ฉันคิดว่านั่นคือสิ่งที่เขาหมายถึง (และด้วยเหตุนี้คำตอบของฉัน.)
kaoD

ใช่ฉันหมายความว่าอุปกรณ์สามารถ (และต้อง) ได้รับการดูแล @ kaoD คำตอบของคุณไม่ได้รวมขั้นตอนเมื่อตัวแทนได้รับความคิดที่ต้องการคราด
zzandy

2

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

ฉันสามารถจินตนาการถึงวิธีการแก้ปัญหาที่ไม่ยอมใครง่ายๆจริง เพิ่มอีกมิติหนึ่งให้กับคุณในการค้นหากริด ดังนั้นในกรณีของแผนที่ 2 มิติคุณจะสร้างเส้นตารางการค้นหาเส้นทาง 3 มิติ ในตัวอย่างง่ายๆนี้มิติใหม่นี้จะมีความลึกเพียงสอง แต่ในเกมจริงมันจะมีขนาดใหญ่ขึ้นอย่างรวดเร็ว

ที่ z = 0 คุณทำแผนที่ภูมิประเทศในสถานการณ์ปกติหมายความว่าแผ่นน้ำถือว่าไม่สามารถใช้ได้

ที่ z = 1 คุณทำการแมปภูมิประเทศเหมือนเดิมในขณะที่มีเสาะหาหมายความว่าแผ่นน้ำนั้นสามารถเดินได้ (แต่ถ้าคุณมีตัวอย่างเช่นแผ่นผนัง

การค้นหาเส้นทางเป็น A * สามัญในมิติ x และ y ซึ่งหมายความว่าเซลล์กริดทุกเซลล์ได้รับการพิจารณาว่าสามารถเข้าถึงเพื่อนบ้านได้ อย่างไรก็ตามในมิติ z ไม่อนุญาตให้ A * แพร่กระจาย

ยกเว้นตำแหน่งที่คราดอยู่ วัตถุ rake ทำหน้าที่เป็นการเปิดระหว่าง z = 0 และ z = 1 ในเส้นทางการค้นหากริด

ซึ่งหมายความว่า A * จะท่วมไปด้านนอกใน z = 0, กดน้ำและวิ่งออกไปจากตัวเลือก - จากนั้นมันจะกระจายไปที่ z = 1 ผ่านทางกระเบื้องคราดและที่ z = 1 (ที่น้ำสามารถเดินได้) หาทางไปสู่เป้าหมาย ผลที่ได้คือว่า NPC โดยไม่ลังเลย้ายไปที่เรคจากนั้นย้ายเส้นทางที่สั้นที่สุดไปยังเป้าหมาย


ในตัวอย่างของฉันฉันได้รับการรักษาคราดมากกว่าเช่น "รองเท้าเดินน้ำ" ซึ่งหมายความว่าถ้าคุณมีมันจะทำให้คุณสามารถเดินทางข้ามกระเบื้องน้ำได้ หากคราดจำเป็นต้อง "สร้าง" จริง ๆ เป็นภูมิประเทศและครอบคลุมจำนวน จำกัด ของกระเบื้องที่อาจหรืออาจจะไม่เพียงพอที่จะเข้าถึงข้ามน้ำปัญหาจะยากขึ้น โซลูชันของฉันอนุญาตสำหรับรายการที่ใช้ครั้งเดียว แต่หากคุณเคลื่อนไหวใน z = 1 เลื่อนลงโดยอัตโนมัติไปที่ z = 0 อีกครั้ง
Joar Jakobsson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.