วิธีการสร้าง "ปริมาณการใช้ AI"?


21

โครงการที่ฉันกำลังทำอยู่ตอนนี้มี "การจราจร" จำนวนมากในแง่ของรถยนต์ที่กำลังแล่นไปตามถนน, เครื่องบินกำลังเคลื่อนย้ายผ้ากันเปื้อนเป็นต้น

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

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

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

ฉันขอขอบคุณสำหรับความช่วยเหลือของคุณ!


การแพร่กระจายความร่วมมืออาจช่วยคุณได้บางอย่าง มันเป็นวิธีที่ง่ายวิธีแก้เส้นทางการค้นหาตัวแทนหลายคนในเวลาเดียวกัน + ตัวแทนหลีกเลี่ยงตัวเอง ได้โปรดแบ่งปันประสบการณ์ของคุณกับมันที่ไหนสักแห่งขอบคุณ ;)
user712092

คำตอบ:


12

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

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

    การตรวจจับ - รับรู้ว่าคุณและรถยนต์ที่กำลังจะมาถึงจะมีปัญหาเว้นแต่คุณหลีกเลี่ยง

    ปฏิกิริยา - ชะลอตัวลงและเข้าสู่ขั้นตอนการเจรจาต่อรอง

    การเจรจาต่อรอง - คนขับรถคนใดคนหนึ่งต้องเป็นผู้นำ กฎสำหรับวิธีการตัดสินใจนี้เป็นสิ่งที่คลุมเครือ แต่โดยพื้นฐานแล้วคุณต้องการบางสิ่งบางอย่างที่ผู้ขับขี่คนหนึ่งโดยพลการ เช่น A มีความสำคัญในเวลาที่ 1, B เห็น A มีความสำคัญและให้ผลตอบแทน (โดยการย้ายออกจากทางและหยุด) หากทั้ง A และ B พยายามที่จะให้ความสำคัญพวกเขาทั้งคู่ควรหยุดรอเป็นระยะเวลาสุ่ม (หรือส่งสัญญาณซึ่งกันและกัน) แล้วลองอีกครั้ง ในที่สุดก็จะยอมจำนนต่ออีก

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

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

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

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

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

  • คุณภาพของข้อมูล พฤติกรรมของคุณควรเรียบง่าย แต่เพื่อให้บรรลุว่าคุณต้องการฟังก์ชันการสืบค้นที่ดี คุณต้องสามารถถามคำถามเกี่ยวกับสภาพแวดล้อมของคุณเช่น "รถคันนี้กำลังแล่นอยู่ในช่องทางของฉันหรือไม่", "มีรถยนต์กี่คันที่เข้ามา?" "มีรถคันใดที่อยู่ข้างหลังฉัน" "ฉันจะกลับรถได้ไหม" .


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

5

เมื่อเห็นความล้มเหลวที่น่ากลัวในเกมที่วางจำหน่ายฉันมีข้อเสนอแนะสองสามข้อ:

1) หากไม่มีเหตุผลที่ดีให้ทำสองเลนและสำหรับวัตถุประสงค์ของ AI ทำให้พวกเขามีความสำคัญสำหรับทิศทางปกติของการไหล - อนุญาตให้เดินทางแบบสองทิศทาง แต่ถ้ามีอะไรมาทางอื่นผู้ชายบนถนนผิดเสมอ ให้มัน

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

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

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

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


2
คำตอบที่ดี - ฉันชอบความคิดในการกระจายข้อความ 'ติด' เพื่อให้ทุกคนที่ออกไปทำได้
MrCranky

4

ฉันไม่ได้มีประสบการณ์เกี่ยวกับการจำลองการจราจรมากนัก แต่มีบางสิ่งที่ควรคำนึงถึง

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

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

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

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

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


ใช่ควรใช้สองเลน (เพราะมีเพียงสองเลน) แต่นั่นไม่ได้แก้ปัญหาใด ๆ ที่จัดการกับวิธีการให้ (ซึ่งปัญหาส่วนใหญ่ที่ผู้ถามอธิบายไว้)
Bart van Heukelom

4

คุณบอกว่าคุณค้นหาบทความหลายเรื่องเกี่ยวกับพฤติกรรมการขับขี่แม้ว่าในกรณีนี้คุณได้ค้นหาบทความต่อไปนี้หรือไม่?

http://www.red3d.com/cwr/steer/

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


0

ฉันคิดว่าสิ่งที่คุณต้องทำคือใช้อัลกอริธึมการค้นหาเส้นทาง

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

A * (ดาว) เป็นอัลกอริทึมการค้นหาเส้นทางที่ง่ายมากที่คุณสามารถแปลรหัส psuedo ใน wikipedia เป็นภาษาที่คุณเลือกได้อย่างง่ายดายและมันจะทำงาน: http://en.wikipedia.org/wiki/A*_search_algorithm


4
ดังที่ฉันกล่าวถึงในโพสต์เริ่มต้นของฉันฉันได้ใช้อัลกอริธึม A * และมีโครงสร้างข้อมูลที่ตรงกันอยู่แล้วเช่นกัน นอกจากนี้การลดความเร็วของตัวแทนทั้งสองก็ทำให้ฉัน "ง่าย" เกินไป
Lunikon

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

ง่ายเกินไป ฮ่าฮ่า นั่นคือสิ่งที่ฉันทำเมื่อฉันขับรถ! หากฉันสามารถทำนายการชนกันกับเส้นทางปัจจุบันของฉันฉันจะเปลี่ยนความเร็วของฉัน
justin.m.chase

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

ในสถานการณ์แบบเลนเดียวถ้าคุณใช้ความเร็วรถคันอื่นในการคำนวณจุดหมายปลายทางในอนาคตเมื่อรถคันแรกตรวจจับการชนและหยุดรถคันอื่นไม่จำเป็นต้องหยุดเนื่องจากความเร็วรถคันแรกตอนนี้คือ 0 นี่ถือว่าคุณ จะสามารถดูล่วงหน้าได้ทันเวลาเพื่อดูการชนกับรถยนต์ตามถนนเลนเดียวที่ยาว เพื่อนของฉันแนะนำให้คุณเพิ่มโหนด STOP ในอัลกอริทึม A * ของคุณด้วย จากมุมมองของรถคันใดคันหนึ่งคุณก็แค่คิดว่าเป็นอุปสรรคต่อรถคันอื่น การหยุดอาจปลดล็อคเส้นทางของคุณหากทำได้นานพอ
justin.m.chase

0

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

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