ขั้นตอนวิธีใดที่คำนวณทิศทางจากจุด A ไปยังจุด B บนแผนที่


543

ผู้ให้บริการแผนที่ (เช่น Google หรือ Yahoo! Maps) จะแนะนำเส้นทางอย่างไร

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

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

จริง ๆ แล้วอัลกอริทึมที่ใช้ในทางปฏิบัติคืออะไร?

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

PPS นี่คือการละเมิดความไม่เท่าเทียมกันรูปสามเหลี่ยมที่แสดงให้เห็น (ให้ฉัน) ที่พวกเขาใช้ประเภทของวิธีการบางฉัตรอื่น: XZเมื่อเทียบกับXYZ อดีตดูเหมือนว่าจะใช้ Boulevard de Sebastopol ที่โดดเด่นแม้ว่ามันจะออกไปเล็กน้อย

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


3
BTW, อัลกอริธึม A * "เป็นลักษณะทั่วไปของอัลกอริทึมของ Dijkstra ที่ลดขนาดของกราฟย่อยที่ต้องสำรวจหากข้อมูลเพิ่มเติมมีอยู่ที่ให้ระยะห่างที่ จำกัด " ระยะทาง "ถึงเป้าหมาย"
Mitch Wheat

Re A *: ใช่แน่นอน โชคดีที่ในกรณีของเรา "ข้อมูลเพิ่มเติม" นี้มีให้โดยใช้ระยะทางตรง เมื่อฉันพูดว่า "Dijkstra" ด้านบนฉันหมายถึงวานิลลา Dijkstra
A. Rex

เส้นทางเดินเท้า? Dunno เกี่ยวกับที่อื่น แต่ที่นี่ (นิวแฮมป์เชียร์สหราชอาณาจักร) ใหญ่ G ไม่มีข้อมูลคนเดินเท้า - มันพาฉันไปตามถนนรอบ ๆ เขตทางเท้า ฯลฯ สิ่งเดียวที่ดีสำหรับมันคือการเปลี่ยนการประมาณเวลาที่ใช้สำหรับเส้นทาง :)
jTresidder

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

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

คำตอบ:


526

การพูดในฐานะคนที่ใช้เวลา 18 เดือนทำงานที่ บริษัท ทำแผนที่ซึ่งรวมถึงการทำงานเกี่ยวกับอัลกอริทึมการกำหนดเส้นทาง ... ใช่แล้วDijkstraทำงานได้ด้วยการปรับเปลี่ยนสองสามประการ:

  • แทนการทำของ Dijkstraครั้งเดียวจากต้นทางไปยังปลายทางที่คุณจะเริ่มที่ปลายแต่ละด้านและขยายทั้งสองฝ่ายจนกว่าพวกเขาจะตอบสนองความต้องการที่อยู่ตรงกลาง สิ่งนี้จะช่วยลดงานประมาณครึ่งหนึ่ง (2 * pi * (r / 2) ^ 2 vs pi * r ^ 2)
  • เพื่อหลีกเลี่ยงการสำรวจตรอกซอกซอยของทุก ๆ เมืองระหว่างต้นทางและปลายทางของคุณคุณสามารถมีข้อมูลแผนที่หลายเลเยอร์: เลเยอร์ 'ทางหลวง' ที่มีเพียงทางหลวงเท่านั้นเลเยอร์ 'รอง' ที่มีถนนรองเท่านั้นและอื่น ๆ จากนั้นคุณสำรวจเฉพาะส่วนเล็ก ๆ ของเลเยอร์ที่มีรายละเอียดมากขึ้นและขยายตามความจำเป็น เห็นได้ชัดว่าคำอธิบายนี้ทำให้รายละเอียดออกมามากมาย แต่คุณก็เข้าใจ

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


29
ใครบางคนที่ทำสิ่งนี้ในโลกแห่งความจริงยอดเยี่ยม! คุณมีความคิดหรือไม่ว่าจะสามารถคำนวณล่วงหน้าได้มากเท่าที่เป็นไปได้ในบทความเกี่ยวกับ Google ที่กล่าวถึงในความคิดเห็นอื่น
A. Rex

10
เราไม่ได้ทำการประมวลผลล่วงหน้าของลักษณะนั้น แต่ดูเหมือนว่าจะเป็นการเพิ่มประสิทธิภาพที่น่าสนใจ
Nick Johnson

29
"รับประกันได้เพียงว่าจะผลิตโซลูชันไม่จำเป็นต้องมีประสิทธิภาพมากที่สุด" นี่ไม่จริง ตราบเท่าที่การใช้ฮิวริสติกนั้นยอมรับได้อัลกอริทึม A * จะสร้างเส้นทางที่มีค่าใช้จ่ายน้อยที่สุด Admissible หมายความว่าค่าใช้จ่ายจะไม่ถูกประเมินมากเกินไป แต่อาจประเมินได้ต่ำกว่า (แต่การประเมินที่ไม่ดีจะทำให้อัลกอริทึมช้า การใช้ข้อมูลจากการประมวลผลล่วงหน้ามีแนวโน้มที่จะช่วยในการทำให้ฮิวริสติกที่ยอมรับได้ดีขึ้นและทำให้ A * ทำงานได้เร็วขึ้น
a1kmm

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

11
A * ในกรณีที่เลวร้ายที่สุด (ฮิวริสติกที่บอกว่าทุกเส้นทางเท่ากัน) เท่ากับของ Djikstra
Tordek

111

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

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

บทความขั้นตอนวิธีการวางแผนเส้นทางวิศวกรรมอย่างรวดเร็วให้ภาพรวมของความคืบหน้าของการวิจัยในสาขานั้น ดูการอ้างอิงของกระดาษนั้นสำหรับข้อมูลเพิ่มเติม

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

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

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


1
ตรัสรู้แน่นอน คุณกำลังพูดถึงแนวทางใหม่อะไร
Tomas Pajonk

1
โดยเฉพาะลำดับขั้นการหดตัว คุณสามารถค้นหาเพิ่มเติมได้ที่นี่: algo2.iti.kit.edu/routeplanning.php นอกจากนี้ยังมีการพูดคุยเกี่ยวกับเทคโนโลยีของ Google: youtube.com/watch?v=-0ErpE8tQbw
SebastianK

19

เพียงแค่จัดการกับการละเมิดความไม่เท่าเทียมกันของสามเหลี่ยมหวังว่าปัจจัยพิเศษที่พวกเขาปรับให้เหมาะสมนั้นเป็นสามัญสำนึก คุณไม่จำเป็นต้องการเส้นทางที่สั้นที่สุดหรือเร็วที่สุดเท่าที่จะสามารถนำไปสู่ความวุ่นวาย และ ทำลาย หากคุณต้องการให้เส้นทางของคุณชอบเส้นทางหลักที่เป็นมิตรกับรถบรรทุกและสามารถรับมือกับการที่คนขับรถที่ใช้ระบบ nav-sat ทุกคนขับลงมาคุณจะต้องละทิ้งความไม่เสมอภาคของสามเหลี่ยม [1]

หาก Y เป็นถนนที่อยู่อาศัยแคบ ๆ ระหว่าง X และ Z คุณอาจต้องการใช้ทางลัดผ่าน Y เฉพาะเมื่อผู้ใช้ถาม XYZ อย่างชัดเจน หากพวกเขาขอ XZ พวกเขาควรยึดติดกับถนนสายหลักแม้ว่ามันจะไกลออกไปเล็กน้อยและใช้เวลานานขึ้นก็ตาม มันคล้ายกับความขัดแย้งของ Braess - หากทุกคนพยายามใช้เส้นทางที่สั้นและเร็วที่สุดความแออัดที่เกิดขึ้นหมายความว่าไม่ใช่เส้นทางที่เร็วที่สุดสำหรับใครอีกต่อไป จากที่นี่เราหลงทางจากทฤษฎีกราฟไปจนถึงทฤษฎีเกม

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


14

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

http://algo2.iti.uka.de/schultes/hwy/schultes_diss.pdf

นี่คือการพูดคุยเกี่ยวกับเทคโนโลยีของ google ในเรื่อง:

http://www.youtube.com/watch?v=-0ErpE8tQbw

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

http://tom.mapsforge.org/


9

ฉันไม่เคยทำงานบน Google หรือ Microsoft หรือ Yahoo Maps มาก่อนดังนั้นฉันจึงไม่สามารถบอกคุณได้ว่าทำงานอย่างไร

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

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

คุณสามารถ google ACO หรือ TSP เพื่อค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคนี้ ฉันไม่ได้ใช้เครื่องมือ AI โอเพ่นซอร์สใด ๆ สำหรับเรื่องนี้ดังนั้นจึงไม่สามารถแนะนำได้ (แม้ว่าฉันจะได้ยินว่า SWARM ค่อนข้างครอบคลุม)


4
เส้นทาง! = tsp ในช้อนชาคุณรู้ระยะทางทั้งหมดและคุณปรับออเดอร์สต็อปให้ดีที่สุด - นี่ไม่ใช่จุดต่อจุด
Karussell

8

อัลกอริทึมกราฟเช่นอัลกอริธึมของ Dijkstra จะไม่ทำงานเพราะกราฟมีขนาดใหญ่มาก

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

Dijkstra อาจทำงานได้ค่อนข้างดีสำหรับกราฟที่มีพฤติกรรมดี ในทางกลับกันการตั้งพาราเมทริก A * อย่างระมัดระวังจะทำงานได้ดีหรือดีกว่าเสมอ คุณได้ลองแล้วว่ามันจะทำงานกับข้อมูลของคุณ?

ที่กล่าวว่าฉันยังสนใจที่จะได้ยินเกี่ยวกับประสบการณ์ของผู้อื่น แน่นอนตัวอย่างที่เด่นชัดเช่นการค้นหาของ Google Map นั้นน่าสนใจเป็นพิเศษ ฉันนึกภาพออกว่าเป็นฮิวริสติกเพื่อนบ้านที่อยู่ใกล้ที่สุด


2
สมมติว่าคุณพยายามค้นหาเส้นทางจากจุด A ถึง B ระยะทางที่เหมาะสมที่สุดคือ d อย่างน้อยที่สุดอัลกอริทึมของ Dijkstra จะตรวจสอบทุกจุดที่ระยะไกลมากที่สุดจาก A. ถ้า A คือซานฟรานซิสโกและ B คือบอสตันนั่นหมายถึงการตรวจสอบส่วนใหญ่ของสหรัฐอเมริกา N'est-ce pas?
A. Rex

2
ใช่แล้ว. สิ่งที่ฉันต้องการที่จะได้รับคือสามารถใช้ A * แทนได้และมันจะหาทางออกที่ดีที่สุดเสมอ (แม้ว่ามันจะใช้ฮิวริสติก)!
Konrad Rudolph

ใช่แน่นอน หลังจากที่ฉันเขียนโพสต์ต้นฉบับของฉันฉันคิดเกี่ยวกับคำว่า "ฮิวริสติก" ที่ฉันใช้ มันไม่ถูกต้องที่นี่เล็กน้อยเพราะมันหาทางออกที่ดีที่สุด
A. Rex

2
ดีประเด็นก็คือว่า A * ใช้จดจำ (เมื่อเทียบกับการเป็นหนึ่ง) เพื่อตรวจสอบขั้นตอนต่อไป การตัดสินใจครั้งนี้เป็นการตัดสินใจที่ไม่ดี แต่มันมีผลกับรันไทม์เท่านั้นไม่ใช่ผลเพราะมันเป็นตัวตัดสินว่าดีกว่า Dijstra มากเพียงใด
Konrad Rudolph

8

สถานะปัจจุบันของศิลปะในแง่ของเวลาค้นหาสำหรับเครือข่ายถนนแบบคงที่คืออัลกอริทึมการติดฉลาก Hub ที่เสนอโดย Abraham et al http://link.springer.com/chapter/10.1007/978-3-642-20662-7_20 ผ่านการสำรวจและเขียนที่ยอดเยี่ยมของสนามรับการตีพิมพ์เมื่อเร็ว ๆ นี้เป็นรายงานทางเทคนิคของ Microsoft http://research.microsoft.com/pubs/207102/MSR-TR-2014-4.pdf

รุ่นสั้นคือ ...

อัลกอริทึมการติดฉลากของ Hub ให้การสืบค้นที่เร็วที่สุดสำหรับเครือข่ายถนนแบบคงที่ แต่ต้องใช้ RAM จำนวนมากในการทำงาน (18 GiB)

การกำหนดเส้นทางการส่งผ่านของโหนดจะช้าลงเล็กน้อยแม้ว่าจะต้องใช้หน่วยความจำประมาณ 2 GiB เท่านั้นและมีเวลาในการประมวลผลที่เร็วขึ้น

ลำดับขั้นของการหดให้การแลกเปลี่ยนที่ดีระหว่างเวลาการประมวลผลล่วงหน้าที่รวดเร็วความต้องการพื้นที่ต่ำ (0.4 GiB) และเวลาการสืบค้นที่รวดเร็ว

ไม่มีใครควบคุมอัลกอริทึมได้อย่างสมบูรณ์ ...

การพูดคุยเรื่องเทคโนโลยีของ Google โดย Peter Sanders อาจเป็นที่สนใจ

https://www.youtube.com/watch?v=-0ErpE8tQbw

นอกจากนี้คำบรรยายนี้โดย Andrew Goldberg

https://www.youtube.com/watch?v=WPrkc78XLhw

การใช้งานโอเพ่นซอร์สของลำดับชั้นการหดตัวสามารถดูได้จากเว็บไซต์กลุ่มวิจัยของ Peter Sanders ที่ KIT http://algo2.iti.kit.edu/english/routeplanning.php

นอกจากนี้โพสต์บล็อกที่เข้าถึงได้ง่ายเขียนโดย Microsoft ในการใช้อัลกอริทึม CRP ... http://blogs.bing.com/maps/2012/01/05/bing-maps-new-routing-engine/


7

ฉันประหลาดใจเล็กน้อยที่ไม่เห็นอัลกอริทึมของ Floyd Warshall ที่กล่าวถึงที่นี่ อัลกอริทึมนี้ทำงานได้ดีเหมือนของ Dijkstra นอกจากนี้ยังมีฟีเจอร์ที่ดีมากซึ่งช่วยให้คุณสามารถคำนวณได้นานเท่าที่คุณต้องการ ดังนั้นมันจะหาเส้นทางที่ใช้อินเตอร์สเตทหรือทางหลวงตามธรรมชาติอย่างรวดเร็ว


6

ฉันทำมาหลายครั้งแล้วจริง ๆ แล้วลองวิธีการต่าง ๆ ขึ้นอยู่กับขนาด (ภูมิศาสตร์) ของแผนที่คุณอาจต้องการพิจารณาใช้ฟังก์ชัน haversine เป็นฮิวริสติก

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

f(n) = k*h(n) + g(n)

โดยที่ k มีค่าคงที่มากกว่า 0


4

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


3

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

ระบุว่านี่เป็นแอปของ Google จึงมีเหตุผลที่จะสมมติว่ามีเวทมนตร์มากมายทำผ่านการแคชอย่างกว้างขวาง :) ฉันจะไม่แปลกใจถ้าการแคชคำขอเส้นทางของ Google แผนที่ที่พบมากที่สุด 5% ที่อนุญาตให้มีขนาดใหญ่ (20%? 50%?) ของคำขอที่จะได้รับคำตอบจากการค้นหาง่ายๆ


คุณมีข้อมูลอ้างอิงที่ดีสำหรับ "โครงสร้างข้อมูลแผนที่ที่มีอิทธิพล" หรือไม่? ขอบคุณ!
A. Rex

3

ฉันมีความคิดเพิ่มเติมเกี่ยวกับเรื่องนี้:

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

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

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


3

ฉันอยากรู้มากเกี่ยวกับการวิเคราะห์พฤติกรรมที่ใช้เมื่อสักครู่เรากลับมีเส้นทางจากจุดเริ่มต้นเดียวกันใกล้กับ Santa Rosa ไปยังค่ายพักสองแห่งในอุทยานแห่งชาติโยเซมิตี จุดหมายปลายทางที่แตกต่างกันเหล่านี้สร้างเส้นทางที่แตกต่างกันค่อนข้างมาก (ผ่าน I-580 หรือ CA-12) แม้ว่าเส้นทางทั้งสองจะมาบรรจบกันในช่วง 100 ไมล์สุดท้าย (ตาม CA-120) ก่อนที่จะแยกอีกครั้งในอีกไม่กี่ไมล์ สิ่งนี้สามารถทำซ้ำได้ เส้นทางทั้งสองนั้นอยู่ห่างกันมากถึง 50 ไมล์เป็นระยะทางประมาณ 100 ไมล์ แต่ระยะทาง / เวลานั้นใกล้กันมากตามที่คุณคาดหวัง

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


3

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

ผมได้สร้างภาพเคลื่อนไหว GIF ของเส้นทางจริงค้นหาด้วยสองทิศทาง Dijkstra ที่นี่ นอกจากนี้ยังมีแนวคิดเพิ่มเติมที่จะทำให้ Dijkstra เร็วขึ้นเช่นการทำ A * ซึ่งเป็น "Dijkstra ที่มุ่งเน้นเป้าหมาย" นอกจากนี้ฉันได้สร้างอนิเมชั่น gifสำหรับมัน

แต่จะทำยังไงให้เร็วกว่ากัน?

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

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

สำหรับ GraphHopper ฉันตัดสินใจที่จะใช้ลำดับขั้นของการหดตัวเพราะมันค่อนข้างง่ายที่จะติดตั้งและไม่ใช้เวลานานในการเตรียมกราฟ มันก็ยังคงส่งผลให้ในเวลาการตอบสนองที่รวดเร็วมากเช่นคุณสามารถทดสอบในกรณีออนไลน์ของเราGraphHopper แผนที่ เช่นจากแอฟริกาใต้ไปจนถึงจีนตะวันออกซึ่งส่งผลให้ระยะทาง 23,000 กม. และใช้เวลาขับรถเกือบ 14 วันและใช้เวลาเพียง 0.1 วินาทีเท่านั้นบนเซิร์ฟเวอร์


แบบสองทิศทาง Dijkstra โดยใช้จุดสังเกตเพื่อทำการค้นหาตามเป้าหมายที่มีประสิทธิภาพมากกว่าแบบสองทิศทาง Dijkstra เพียงอย่างเดียว ดูwww14.informatik.tu-muenchen.de/lehre/2010SS/sarntal/ ...... อย่างไรก็ตามบทความนี้มีรายละเอียดไม่เพียงพอที่จะคำนวณฟังก์ชั่นที่อาจเกิดขึ้นซึ่งค่อนข้างยุ่งยากหรือเลือกสถานที่สำคัญ
Paul Chernoch

2

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

แต่ความเร็วขึ้นอยู่กับการมีเครือข่ายเส้นทางทั้งหมดซึ่งฉันหมายถึงกราฟกำกับของส่วนโค้งและโหนดที่แสดงส่วนเส้นทางและจุดแยกตามลำดับในหน่วยความจำ ค่าใช้จ่ายเวลาหลักคือเวลาที่ใช้ในการสร้างเครือข่ายนี้ ตัวเลขคร่าวๆจากแล็ปท็อปทั่วไปที่ใช้ Windows และการกำหนดเส้นทางทั่วทั้งสเปน: เวลาที่ใช้ในการสร้างเครือข่าย: 10-15 วินาที; ใช้เวลาในการคำนวณเส้นทางสั้นเกินไปที่จะวัด

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


1

ฉันเห็นว่าเกิดอะไรขึ้นกับแผนที่ใน OP:

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

หากอัลกอริทึมของพวกเขาจะไม่ย้อนกลับก็จะไม่เห็นเส้นทางที่สั้นกว่า


ความคิดที่น่าสนใจ ฉันได้เพิ่มการละเมิดอีกครั้งใน PPS ของฉันไปที่ OP โปรดดูและดูว่าคุณจะเห็นคำอธิบายที่นั่นหรือไม่
A. Rex

ซูมWAYลงที่จุด A - คลิกเดียวจากสูงสุด สังเกตว่าเส้นทางสามจุดไปทางทิศตะวันตกทิศใต้ทิศตะวันออกอย่างไร ฉันคิดว่าเรากำลังมองหาอัลกอริทึมที่ไม่ชอบที่จะย้อนกลับเว้นแต่ว่ามันจำเป็นที่จะต้องผ่านจุดเชื่อมต่อ
Loren Pechtel

ในตัวอย่าง PPS ของฉันเปลี่ยนที่อยู่เริ่มต้นเป็น "10 Avenue de Flandre, 75019 Paris" สิ่งนี้จะลบสิ่งที่หลงทางเล็กน้อยที่คุณกำลังพูดถึง แต่ปัญหายังคงอยู่ ผมคิดว่าปัญหาหลักก็คือว่ามันจริงๆต้องการที่จะอยู่ในที่หลัก Blvd ...
เอเร็กซ์

1
ฉันคิดว่าฉันพบมันในกรณีนี้: ทำสิ่งเหล่านั้นด้วยรถยนต์และกำหนดเวลาสมเหตุสมผล มันอาจเห็นถนนใหญ่เร็วกว่าและเส้นทางเดินไม่เค้นมัน
Loren Pechtel

1
PS: ปัญหาเริ่มแรกก็สมเหตุสมผลตามมาตรฐานนี้มันอาจไม่ใช่ backtrack ที่ทำให้เกิดปัญหา
Loren Pechtel

0

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


-4

แผนที่ไม่ได้คำนึงถึงทั้งแผนที่ ฉันเดาว่า: - 1. ตามตำแหน่งของคุณพวกเขาโหลดสถานที่และสถานที่สำคัญในสถานที่นั้น 2. เมื่อคุณค้นหาปลายทางนั่นคือเมื่อพวกเขาโหลดส่วนอื่น ๆ ของแผนที่และสร้างกราฟจากสองแห่งแล้วใช้อัลกอริธึมพา ธ ที่สั้นที่สุด

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

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