Pathfinding สำหรับการหลบหนี


61

ดังที่คุณทราบว่ามีวิธีแก้ปัญหามากมายเมื่อคุณต้องการค้นหาเส้นทางที่ดีที่สุดในสภาพแวดล้อม 2 มิติซึ่งนำไปสู่จุด A ถึงจุด B

แต่ฉันจะคำนวณเส้นทางได้อย่างไรเมื่อวัตถุอยู่ที่จุด A และต้องการหนีจากจุด B อย่างรวดเร็วและไกลที่สุด

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

วิธีแก้ปัญหาเล็ก ๆ น้อย ๆ ก็คือการย้ายนักแสดงในเวกเตอร์ในทิศทางที่ตรงข้ามกับการคุกคามจนกว่าจะถึงระยะ "ปลอดภัย" หรือนักแสดงถึงกำแพงที่มันครอบคลุมด้วยความกลัว

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

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

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

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

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

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

มีวิธีแก้ไขปัญหามาตรฐานสำหรับปัญหานี้หรือไม่?


8
+1 คำถามที่ยอดเยี่ยมด้วยภาพที่ยอดเยี่ยม มันทำให้คำถามชัดเจน
MichaelHouse

คำตอบ:


24

นี่อาจไม่ใช่ทางออกที่ดีที่สุด แต่มันทำงานได้ดีสำหรับฉันในการสร้าง AI ที่หลบหนีสำหรับเกมนี้

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

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


1
โปรดทราบว่าเพียงแค่ใช้บางสิ่งบางอย่างเช่นระยะทางแนวตรงจากอันตรายเนื่องจากฮิวริสติกในขั้นตอนที่ 2 โดยทั่วไปจะไม่ให้ฮิวริสติกที่ยอมรับได้ แน่นอนว่านั่นไม่ได้หมายความว่าคุณจะไม่สามารถลองใช้มันได้ แต่อาจไม่สามารถสร้างทางหนีที่ดีที่สุดได้ เพื่อให้ได้ฮิวริสติกที่ยอมรับได้จริงสำหรับ "reverse A *" นี้ฉันคิดว่าคุณต้องใช้ A * / Dijkstra ปกติเพื่อคำนวณระยะทางที่แท้จริงของแต่ละช่องสี่เหลี่ยมจากอันตราย
Ilmari Karonen

+1 ฉันคิดว่านี่จะให้ผลที่ดีที่สุดสำหรับเจ้าชู้ของคุณตราบเท่าที่ความพยายามในการให้ผลลัพธ์
MichaelHouse

33

หากคุณต้องการให้นักแสดงฉลาดในเรื่องการหลบหนีเพียงแค่การหาเส้นทาง Dijkstra / A * แบบธรรมดาจะไม่ลดลง เหตุผลในเรื่องนี้คือเพื่อหาเส้นทางหลบหนีที่ดีที่สุดจากศัตรูนักแสดงยังต้องพิจารณาว่าศัตรูจะเคลื่อนไหวในการติดตามอย่างไร

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

แผนผังของนักแสดงหนีศัตรูในเขาวงกตรูปตัว P

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

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

แน่นอนว่าหากมีนักแสดงหลายประเภททั้งสองประเภทสิ่งเหล่านี้จะต้องวางแผนกลยุทธ์ของตัวเองไม่ว่าจะแยกจากกันหรือหากนักแสดงร่วมมือกัน กลยุทธ์การไล่ล่า / การหลบหนีของนักแสดงหลายคนนั้นอาจซับซ้อนอย่างน่าประหลาดใจ ตัวอย่างหนึ่งในกลยุทธ์ที่เป็นไปได้สำหรับนักแสดงที่หนีไปคือพยายามเบี่ยงเบนความสนใจของศัตรูโดยนำมันไปสู่เป้าหมายที่ดึงดูดมากกว่า แน่นอนว่าสิ่งนี้จะส่งผลต่อกลยุทธ์ที่เหมาะสมที่สุดของเป้าหมายอื่น ๆ ...

ในทางปฏิบัติคุณอาจไม่สามารถทำการค้นหาแบบลึกมากแบบเรียลไทม์ด้วยเอเจนต์จำนวนมากดังนั้นคุณจะต้องพึ่งพาฮิวริสติกมาก การเลือกใช้ฮิวริสติกเหล่านี้จะกำหนด "จิตวิทยา" ของนักแสดงของคุณ - พวกเขาฉลาดแค่ไหนพวกเขาให้ความสนใจกับกลยุทธ์ที่แตกต่างกันมากแค่ไหนพวกเขาร่วมมือกันหรือเป็นอิสระอย่างไร


7

คุณมีปัญหาในการค้นหาเส้นทางดังนั้นคุณสามารถลดปัญหาในการเลือกปลายทางที่ดีได้

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

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

หากนักแสดงที่หนีไปของคุณเร็วกว่านักแสดงคนอื่น ๆ ที่ภัยคุกคามอาจสนใจให้เลือกจุดหนึ่งในทิศทางของนักแสดงคนอื่น แต่นอกเหนือไปจากนั้นและไปที่จุดนั้น: "ฉันไม่ต้องวิ่งไปหาหมี ฉันต้องเอาชนะคุณเท่านั้น "

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


7

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

ในกรณีฐานสองมิติแผนที่กริด 2D เป็นหนึ่งสำหรับเซลล์กริดครอบครองและเป็นศูนย์ที่อื่น ๆ โปรดทราบว่ามูลค่าการเข้าพักนี้สามารถต่อเนื่องในช่วง [0,1] ฉันจะกลับไปที่ด้านล่าง ค่าของตารางเซลล์ที่กำหนดกรัมฉันเป็นV (g ฉัน )

รุ่นพื้นฐาน

  1. สมมติว่ากริดเซลล์g 0มีตำแหน่งเริ่มต้น ตั้งค่าV (g 0 ) = 0และใส่g 0ในคิว FIFO
  2. นำกริดเซลล์g iถัดไปจากคิว
  3. สำหรับเพื่อนบ้านทั้งหมดg j of g i :
    • หากg jไม่ได้ถูกครอบครองและยังไม่เคยเข้าชม:
      • V (g j ) = V (g i ) +1
      • ทำเครื่องหมายg jว่าเยี่ยม
      • เพิ่มg jไปยัง FIFO-queue
  4. หากยังไม่ถึงขีด จำกัด ระยะทางที่ระบุให้ดำเนินการต่อด้วย (2. ) หรือดำเนินการต่อด้วย (5. )
  5. เส้นทางที่จะได้รับโดยต่อไปนี้ลาดชันลาด-ขึ้นเริ่มต้นจากกรัม 0

หมายเหตุเกี่ยวกับขั้นตอนที่ 4

  • ตามที่ระบุไว้ข้างต้นขั้นตอน (4. ) จำเป็นต้องติดตามระยะทางสูงสุดที่ครอบคลุมซึ่งถูกตัดออกในคำอธิบายข้างต้นด้วยเหตุผลของความชัดเจน / ความกะทัดรัด
  • หากได้รับตำแหน่งเป้าหมายการทำซ้ำจะหยุดทันทีที่ถึงตำแหน่งเป้าหมายเช่นประมวลผล / เยี่ยมชมเป็นส่วนหนึ่งของขั้นตอนที่ (3)
  • แน่นอนว่ามันเป็นไปได้ที่จะประมวลผลกริดแผนที่ทั้งหมดเช่นเพื่อดำเนินการต่อจนกว่าเซลล์กริดเซลล์ (ฟรี) ทั้งหมดจะถูกประมวลผล / เข้าชม ปัจจัย จำกัด คือขนาดของแผนที่กริดร่วมกับความคมชัด

ส่วนขยายและความคิดเห็นเพิ่มเติม

การอัปเดตสมการV (g j ) = V (g i ) +1ทำให้มีพื้นที่เหลือเฟือที่จะใช้การวิเคราะห์พฤติกรรมเพิ่มเติมทุกประเภทโดยการลดขนาดV (g j )หรือส่วนประกอบเพิ่มเติมเพื่อลดค่าสำหรับตัวเลือกเส้นทางบางอย่าง ส่วนใหญ่หากไม่ใช่ทั้งหมดการปรับเปลี่ยนดังกล่าวสามารถนำมารวมกันได้เป็นอย่างดีและโดยทั่วไปโดยใช้ grid-map พร้อมค่าต่อเนื่องจาก [0,1] ซึ่งมีประสิทธิภาพถือเป็นขั้นตอนการประมวลผลล่วงหน้าของไบนารีกริดแผนที่เริ่มต้น ตัวอย่างเช่นการเพิ่มช่วงการเปลี่ยนภาพจาก 1 เป็น 0 ตามขอบเขตของสิ่งกีดขวางทำให้ "นักแสดง" ควรอยู่ในความสะอาดของสิ่งกีดขวาง ยกตัวอย่างเช่นตารางแผนที่สามารถสร้างขึ้นได้จากรุ่นไบนารีโดยการทำให้เบลอการยืดออกที่มีน้ำหนักหรือคล้ายกัน การเพิ่มภัยคุกคามและศัตรูเป็นอุปสรรคด้วยรัศมีการพร่ามัวขนาดใหญ่จะลงโทษเส้นทางที่เข้ามาใกล้สิ่งเหล่านี้ ท่านสามารถใช้กระบวนการแพร่กระจายบนแผนที่กริดโดยรวมดังนี้:

V (g j ) = (1 / (N + 1)) × [V (g j ) + ผลรวม (V (g i ))]

โดยที่ " ผลรวม " หมายถึงผลรวมของกริดเซลล์ที่อยู่ใกล้เคียงทั้งหมด ตัวอย่างเช่นแทนที่จะสร้างแผนที่ไบนารีค่าเริ่มต้น (จำนวนเต็ม) อาจเป็นสัดส่วนกับขนาดของภัยคุกคามและอุปสรรคนำเสนอภัยคุกคาม "เล็ก" หลังจากใช้การแพร่กระจายกระบวนการกริดค่าควร / ต้องถูกปรับเป็น [0,1] และเซลล์ที่ถูกครอบครองโดยอุปสรรคการคุกคามและศัตรูควรถูกตั้งค่า / บังคับให้เป็น 1 มิฉะนั้นการปรับสเกลในสมการการอัพเดทอาจ ไม่ทำงานตามที่ต้องการ

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

ต่อไปนี้เป็นคำอธิบายสั้น ๆ พร้อมภาพประกอบใน Java-Script (?) ถึงแม้ว่าภาพประกอบดังกล่าวจะไม่สามารถใช้ได้กับเบราว์เซอร์ของฉัน :(

http://www.cs.ubc.ca/~poole/demos/mdp/vi.html

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

http://planning.cs.uiuc.edu/

หวังว่าจะช่วยด้วยความเคารพ Derik


3

วิธีการเกี่ยวกับนักล่า? ลองเรย์คาสต์ 360 องศากับตำแหน่งของ Predator ด้วยความหนาแน่นที่เหมาะสม และเราสามารถมีตัวอย่างที่ลี้ภัย และเลือกที่หลบภัยที่ดีที่สุด

กรณีที่ 1

กรณีที่ 2


0

วิธีการหนึ่งที่พวกเขามีใน Star Trek Online สำหรับฝูงสัตว์คือเพียงแค่เลือกทิศทางที่เปิดกว้างแล้วมุ่งหน้าเข้าไปในนั้นอย่างรวดเร็วกำจัดสัตว์วางไข่หลังจากระยะหนึ่ง แต่นั่นเป็นอนิเมชั่นเดอ - วางไข่ที่มีชื่อเสียงสำหรับฝูงคุณควรจะกลัวที่จะโจมตีคุณและไม่เหมาะกับฝูงต่อสู้ที่แท้จริง

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