Bidirectional Dijkstra: หาเส้นทางสองด้านอย่างไรให้หยุดถูกจังหวะ

กราฟกำกับทิศทางมีเส้นทางผ่าน a ต้นทุน 10 และผ่าน b ต้นทุน 8 พร้อมเงื่อนไขหยุด alpha บวก beta ไม่น้อยกว่า mu
กราฟกำกับทิศทางมีเส้นทางผ่าน a ต้นทุน 10 และผ่าน b ต้นทุน 8 พร้อมเงื่อนไขหยุด alpha บวก beta ไม่น้อยกว่า mu
สองฝั่งพบกัน ยังหยุดไม่ได้ — การพบกันครั้งแรกให้เพียงผู้สมัครเส้นทาง; ต้องรอให้ขอบเขตล่างรับรองก่อนหยุด · แหล่งอ้างอิง 1 · แหล่งอ้างอิง 2 · แหล่งอ้างอิง 3

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

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

บทความนี้แยกให้เห็นความต่างระหว่าง “เจอเส้นทาง” กับ “ยืนยันว่าเป็นเส้นทางสั้นที่สุด” ผ่านตัวอย่างขนาดเล็ก อธิบายข้อมูลที่อัลกอริทึมต้องเก็บ วิธีตรวจเส้นทางคืน และจุดที่การค้นสองด้านอาจไม่ช่วยลดงาน ทั้งหมดนี้เป็นการค้นเส้นทางบนกราฟจำกัดที่กำหนดไว้แล้ว ไม่ใช่หลักฐานว่าระบบวางแผนหรือโมเดลภาษาเข้าใจการกระทำในโลกจริง

ทำไมการพบกันครั้งแรกยังไม่พอ

พิจารณากราฟถ่วงน้ำหนักมีทิศทางที่มีเส้นทางสองสายจาก s ไป t ดังนี้

s --1--> a --9--> t
 \
  4--> b --4--> t

เส้นทางผ่าน a มีต้นทุนรวม 10 ส่วนเส้นทางผ่าน b มีต้นทุนรวม 8 ดังนั้นคำตอบที่ถูกคือ s → b → t ถ้าค้นจาก s และ t แล้วอัลกอริทึมพบโหนด a ร่วมกันก่อน ก็มีหลักฐานเพียงว่าเส้นทาง s → a → t ใช้ได้และมีต้นทุน 10 ยังไม่มีหลักฐานว่าเส้นทางอื่นที่ยังไม่สำรวจจะไม่ถูกกว่า

ความผิดพลาดมักเกิดเมื่อโปรแกรมตรวจการพบกันทันทีระหว่างสร้างโหนดหรือระหว่างผ่อนคลายขอบ แล้วคืนคำตอบทันที ขั้นตอนนั้นอาจเกิดก่อนที่อัลกอริทึมจะตรวจขาออกทั้งหมดของโหนดปัจจุบันด้วยซ้ำ คำว่า “แตะ” หรือ “พบร่วม” จึงไม่ควรเป็นเงื่อนไขหยุดของ weighted search

SIMULATION: เริ่มต้นคิวหน้า s และคิวย้อน t ด้วยระยะ 0 ขยาย s แล้วค้นพบ a ที่ระยะ 1 และ b ที่ระยะ 4 ระหว่างขยาย t ย้อนกลับ เมื่อประมวลผลขอบที่มาจาก a ก่อน จะพบผู้สมัครเส้นทางต้นทุน 1 + 9 = 10 ชั่วคราว; เมื่อประมวลผลขอบจาก b ในการขยายเดียวกัน μ ลดเป็น 8 เมื่อขยาย t เสร็จ α = 1 และ β = 4 จึงรวม 5 < 8 ยังหยุดไม่ได้ ต่อมาเมื่อขยาย a ทางหน้า ผู้สมัคร 10 ไม่เปลี่ยน μ และค่าต่ำสุดกลายเป็น 4 กับ 4 ดังนั้น α + β = 8 = μ จึงหยุดได้

FACT: การชนกันครั้งแรกเป็นเพียง upper bound หรือขอบเขตบนของคำตอบ เพราะเป็นเส้นทางสมบูรณ์ที่มีอยู่จริง ส่วนผลรวมค่าต่ำสุดจากคิวเป็น lower bound หรือขอบเขตล่างของเส้นทางที่อาจยังไม่พบ เมื่อ lower bound ไม่น้อยกว่า upper bound ที่ดีที่สุด ทั้งสองขอบเขตยืนยันว่าคำตอบเท่ากัน

แบบจำลองกราฟและการค้นย้อนกลับ

ให้กราฟเป็น G = (V, E) โดย V คือชุดโหนด และ E คือชุดขอบที่มีทิศทางพร้อมต้นทุน c(u,v) โจทย์รับต้นทาง s และเป้าหมาย t แล้วหาเส้นทางที่ผลรวมต้นทุนต่ำที่สุด สมมติฐานหลักของ Dijkstra คือขอบทุกเส้นมีต้นทุนไม่ติดลบ การมีขอบศูนย์ทำได้ แต่ขอบติดลบทำให้การรับรองระยะทางเมื่อโหนดถูกนำออกจากคิวใช้ไม่ได้

การค้นไปข้างหน้าเริ่มที่ s และติดตามขอบ u → v ในกราฟเดิม ส่วนการค้นย้อนเริ่มที่ t และติดตามขอบที่เข้าสู่โหนดปัจจุบัน ตัวอย่างเช่น ถ้ามีขอบเดิม u → v ที่ต้นทุน 7 การค้นย้อนที่ v จะไปยัง u ด้วยต้นทุน 7 ไม่ได้สร้างขอบต้นทุน 7 จาก v ไป u ในโลกเดิม แต่กำลังสำรวจว่าจาก u มีทางไป v เพื่อประกอบเส้นทางสู่ t อย่างไร

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

ข้อมูลเข้า ผลลัพธ์ และขอบเขตหน่วยความจำ

สัญญาข้อมูลขั้นต่ำอาจกำหนดเป็น {vertices, edges: {from, to, cost, id}, s, t} โดย id ช่วยแยกขอบซ้ำ ผลลัพธ์คือ {path, cost, status} ซึ่ง status ระบุเส้นทางที่พบหรือไม่มีเส้นทาง อินพุตต้องเป็นกราฟคงที่ระหว่างการค้นและมีต้นทุนไม่ติดลบ ตัวดัชนีขาเข้าเพิ่มการเก็บข้อมูลตามจำนวนขอบ และอัลกอริทึมต้องเก็บระยะ ตัวชี้ คิว และสถานะสองชุดตามจำนวนโหนด การเลือกใช้งานจึงควรคำนึงถึงหน่วยความจำของกราฟกับดัชนี ไม่ใช่เฉพาะเวลาค้น

ภาพกราฟกำกับทิศทางเดียวกัน แสดงการเดินหน้าตามขอบออกและการค้นย้อนตามขอบเข้าด้วยต้นทุนเดิม พร้อมระยะ frontier และค่า mu
สอง frontier บนกราฟเดิม — การค้นย้อนใช้ incoming edges ของกราฟเดิมและต้นทุนขอบเดิม ไม่ได้กลับทิศทางการเดินทางจริง · แหล่งอ้างอิง 1 · แหล่งอ้างอิง 2 · แหล่งอ้างอิง 3

โครงสร้างข้อมูลที่ทำให้ตรวจสอบได้

อัลกอริทึมต้องเก็บสถานะสองชุดที่แยกจากกันอย่างชัดเจน ฝั่งหน้าเก็บ distF[v] ซึ่งเป็นระยะทางที่ดีที่สุดที่รู้จาก s ไป v พร้อม parentF[v] สำหรับย้อนสร้างเส้นทาง ฝั่งย้อนเก็บ distB[v] ซึ่งเป็นระยะทางที่ดีที่สุดที่รู้จาก v ไป t และ nextB[v] ซึ่งชี้โหนดถัดไปในเส้นทางเดิมไปยัง t ทั้งสองด้านมีคิวลำดับความสำคัญและชุดโหนดที่ปิดหรือยืนยันระยะแล้วของตนเอง

เมื่อผ่อนคลายขอบ u → v ด้านหน้า จะลองปรับ distF[v] ให้เป็น distF[u] + c(u,v) ถ้าค่านี้ต่ำกว่าเดิม และบันทึก parentF[v] = u ส่วนด้านย้อนเมื่อประมวลผล v จะเดินตามขอบขาเข้าที่มาจาก u แล้วลองปรับ distB[u] เป็น c(u,v) + distB[v] พร้อมบันทึก nextB[u] = v ทิศของสูตรต่างกันเพราะแผนที่ต้นทุนด้านย้อนหมายถึงต้นทุนจากโหนดนั้นไปยังเป้าหมายในกราฟเดิม

เก็บ μ เป็นต้นทุนต่ำที่สุดของเส้นทางสมบูรณ์ที่ประกอบได้จากข้อมูลสองฝั่ง เริ่มต้นด้วยอนันต์ หาก s = t ให้คืนเส้นทางว่างที่มีต้นทุน 0 ทันที เมื่อฝั่งหน้าและฝั่งย้อนรู้ระยะของโหนดเดียวกัน v จะได้ผู้สมัคร distF[v] + distB[v] หากมีขอบเชื่อม u → v และรู้ distF[u] กับ distB[v] จะได้ผู้สมัคร distF[u] + c(u,v) + distB[v] ทั้งสองแบบสร้างเส้นทางจริงได้เมื่อป้ายระยะและตัวชี้พ่อแม่สอดคล้องกัน

เงื่อนไขหยุดและเหตุผล

กำหนด α และ β เป็นระยะต่ำสุดที่ยังใช้ได้ในคิวหน้าและคิวย้อนตามลำดับ หลังทิ้งรายการ stale แล้ว เงื่อนไขหยุดคือ α + β ≥ μ โดย μ ต้องมาจากเส้นทางสมบูรณ์ที่ตรวจสอบได้ สูตรนี้แสดงในเอกสารสอน University of Connecticut ในรูป min_i(g_i + r_i) ≤ Qf.peek() + Qr.peek() ซึ่งกลับข้างได้เป็นเงื่อนไขเดียวกัน เอกสาร UConn Lecture 7 (PDF)

เหตุผลอาศัยคุณสมบัติของ Dijkstra: เมื่อขยายโหนดที่มีระยะต่ำสุด โหนดที่ยังไม่ปิดในฝั่งนั้นจะมีระยะไม่น้อยกว่าค่าต่ำสุดในคิว ภายใต้ invariant ของการค้น หากยังมีเส้นทางที่ดีกว่า μ รอให้ต่อครบ มันต้องมีส่วนที่ยังเดินจาก s อย่างน้อย α และส่วนจากอีกด้านอย่างน้อย β ดังนั้นต้นทุนของเส้นทางที่ยังอาจปรับปรุงคำตอบจึงไม่น้อยกว่า α + β เมื่อผลรวมนี้ไม่ต่ำกว่า μ ก็ไม่มีเส้นทางที่ยังไม่พบสามารถชนะคำตอบ μ ได้ ค่านี้เป็นขอบเขตสำหรับการปรับปรุงที่ยังเป็นไปได้ตามสถานะการค้น ไม่ใช่การอ้างว่าระยะของทุกเส้นทางในกราฟไม่น้อยกว่า α + β

ข้อสำคัญคืออัปเดต μ จากผู้สมัครที่เพิ่งพบก่อนตรวจเงื่อนไขหยุดในรอบนั้น และคำนวณ α กับ β หลังลบคิว stale แล้ว การสลับว่าจะขยายฝั่งใดก่อนทำได้หลายแบบ เช่น เลือกด้านที่มีค่าต่ำสุด หรือสลับกัน แต่รูปแบบการสลับไม่ได้แทนที่การรับรองขอบเขตหยุด หากคิวฝั่งใดหมด แต่ยังไม่มี μ จำกัด ก็ไม่มีเส้นทางจาก s ไป t ตามกราฟที่ให้มา ถ้ามี μ จำกัดและขอบเขตหยุดผ่านแล้ว ให้คืนเส้นทางที่สร้างจากข้อมูลสองฝั่ง

SIMULATION บนกราฟ s-a-t ต้นทุน 10 และ s-b-t ต้นทุน 8; หลังพบ a ได้ mu 10 ก่อนสแกนย้อนจาก t พบ b และปรับ mu เป็น 8; หยุดเมื่อ alpha บวก beta เท่ากับ 8
ตัวอย่างจำลอง: แตะครั้งแรกได้ 10 — ตัวอย่างจำลองแสดงว่า first touch ที่ a ยังไม่พอ เมื่อสแกนย้อนพบเส้นทาง b ต้นทุน 8 และขอบเขตล่างยืนยันคำตอบ · แหล่งอ้างอิง 1 · แหล่งอ้างอิง 2 · แหล่งอ้างอิง 3

ANALYSIS: μ เป็นคำตอบที่พบแล้ว จึงเป็นขอบเขตบน ไม่ควรตั้งให้เท่ากับ “ระยะของโหนดที่เพิ่งถูกแตะ” โดยไม่ประกอบเส้นทางครบ ส่วน α + β เป็นขอบเขตล่างของการปรับปรุงที่ยังเป็นไปได้ภายใต้สถานะการค้น ความถูกต้องมาจากการเปรียบเทียบขอบเขตสองชนิดนี้ ไม่ใช่จากตำแหน่งที่ search frontiers ดูเหมือนจะบรรจบกัน

การสร้างและตรวจเส้นทางผลลัพธ์

เมื่อหยุดแล้ว ให้สร้างครึ่งแรกจากจุดเชื่อมย้อนตาม parentF จนถึง s แล้วกลับลำดับ จากนั้นสร้างครึ่งหลังตาม nextB ไปจนถึง t ถ้าใช้ขอบข้าม u → v ให้ต่อเส้นทางหน้าไปถึง u แล้วตามด้วย v และส่วนย้อนจาก v กรณีจุดเชื่อมเป็นโหนดเดียวกัน ให้ใส่โหนดนั้นเพียงครั้งเดียว การต่อผิดทิศอาจทำให้โหนดซ้ำหรือสร้างเส้นทางที่ไม่มีขอบจริง

จากคำอธิบายสู่อินเทอร์แอกทีฟ

SIMULATION · BIDIRECTIONAL SEARCH EXPLORER

สำรวจการค้นสองฝั่งทีละรอบ

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

สี Cyan: F settled · Amber: B settled · เขียว: เส้นทางผู้สมัคร · ลูกศรคงทิศเดิม

รอบที่ 0

แบบจำลองกราฟคงที่ขนาดเล็ก ต้นทุนจำนวนเต็มไม่ติดลบ ไม่มี LLM การฝึกน้ำหนัก หรือผล benchmark

ตัวสำรวจกราฟควรให้ผู้ใช้เพิ่มโหนดและขอบพร้อมทิศทางและต้นทุน เลือก s กับ t แล้วแสดงดัชนีขาออกและขาเข้าคนละสี ระหว่างค้นให้แสดงคิวหน้าและคิวย้อน ระยะที่ใช้ได้หลังทิ้ง stale ค่า μ ปัจจุบัน เส้นทางผู้สมัคร และค่าของ α + β ในแต่ละจังหวะ เมื่อเงื่อนไขหยุดผ่าน ระบบควรอธิบายว่าผู้สมัครใดเป็นคำตอบที่ดีที่สุด และขอบเขตที่เหลือพิสูจน์อะไร

SIMULATION · SEARCH CERTIFICATE GAME

เกมยืนยันเส้นทางภายในงบ

เลือกขยายฝั่งเริ่มหรือฝั่งเป้าหมาย เป้าหมายคือยืนยันคำตอบที่ผ่านเงื่อนไขหยุดภายในงบ การพบกันครั้งแรกยังไม่พอ

สี Cyan: F settled · Amber: B settled · เขียว: เส้นทางผู้สมัคร · ลูกศรคงทิศเดิม

รอบที่ 0 ·

แบบจำลองกราฟคงที่ขนาดเล็ก ต้นทุนจำนวนเต็มไม่ติดลบ ไม่มี LLM การฝึกน้ำหนัก หรือผล benchmark

เปรียบเทียบกับ Dijkstra และ bidirectional BFS

SIMULATION เปรียบเทียบ first-touch คืน 10 ซึ่งผิด กับ Forward Dijkstra และ Safe Bidirectional Dijkstra ที่ให้ระยะ 8
เปรียบเทียบผลบนกราฟเดียวกัน — บนกราฟตัวอย่าง first-touch ให้ระยะผิด 10; Dijkstra ทางเดียวและแบบสองทางที่หยุดอย่างปลอดภัยให้ 8 · แหล่งอ้างอิง 1 · แหล่งอ้างอิง 2 · แหล่งอ้างอิง 3
วิธี เหมาะกับข้อมูลแบบใด โครงสร้างหลัก เงื่อนไขสำคัญ
Dijkstra ทิศเดียว น้ำหนักไม่ติดลบ ต้องการระยะจากต้นทาง หรือไม่มีดัชนีขาเข้า คิวลำดับความสำคัญหนึ่งชุด หยุดเมื่อเป้าหมายถูกนำออกจากคิวด้วยระยะต่ำสุด
Bidirectional Dijkstra คำถามจากต้นทางหนึ่งไปปลายทางหนึ่ง และเข้าถึงขอบย้อนกลับได้ คิวและระยะสองชุด พร้อม μ หยุดเมื่อ α + β ≥ μ หลังอัปเดตผู้สมัครและล้าง stale entries
Bidirectional BFS กราฟไม่ถ่วงน้ำหนักหรือทุกขอบมีต้นทุนเท่ากัน คิว FIFO และชั้นระยะสองด้าน ใช้จำนวนขอบเป็นต้นทุน; อย่าใช้แทนน้ำหนักทั่วไป

REPORTED CLAIM: งาน Goldberg และ Harrelson ปี 2005 เสนอ ALT ซึ่งผสาน A* กับ landmark bounds และรายงานผลทดลองของอัลกอริทึมที่ศึกษาในเครือข่ายถนนและกราฟสังเคราะห์ ผลดังกล่าวไม่ใช่ benchmark ที่บทความนี้ทำซ้ำ และไม่ควรนำมาอ้างเป็นตัวเลขความเร็วของโค้ด bidirectional Dijkstra ตัวอย่างนี้ เอกสาร NetworkX ระบุ API ของ bidirectional Dijkstra แต่ความเร็วในงานจริงยังขึ้นกับโครงสร้างกราฟ น้ำหนัก ตำแหน่งต้นทางปลายทาง และต้นทุนการสร้างหรือเก็บดัชนีขาเข้า

บางคำอธิบายใช้ภาพต้นไม้ที่มี branching factor คงที่ b และความลึก d เพื่อเปรียบเทียบการสำรวจประมาณ b^d กับสองฝั่งที่ลงลึกใกล้ d/2 ซึ่งเป็น intuition ในกรณีสมดุลเท่านั้น กราฟจริงอาจมีแขนงไม่เท่ากัน ทางแคบคดเคี้ยว น้ำหนักที่ต่างกัน หรือจุดเริ่มและจุดหมายใกล้กันมาก กรณีเช่นนี้การค้นสองด้านอาจลดงานเพียงเล็กน้อย หรือมี overhead เพิ่มจากคิวและการประกอบผลลัพธ์ จึงไม่ควรเขียนว่าลดความซับซ้อนหรือเวลาลงครึ่งหนึ่งในทุกกรณี

ตัวอย่างงานประยุกต์และขอบเขตของคำว่า planning

การค้นเส้นทางถนนเป็นตัวอย่างตรงไปตรงมา: โหนดแทนทางแยก ขอบแทนการเดินทางตามถนน และน้ำหนักอาจแทนระยะทางหรือเวลาที่คงที่สำหรับคำถามนั้น ระบบต้องกำหนดก่อนว่าขอบสะท้อนข้อจำกัดทิศทาง เช่น ทางวันเวย์หรือทางปิดอย่างไร หากน้ำหนักเปลี่ยนระหว่างการค้น ค่าระยะที่เก็บไว้อาจไม่สอดคล้องกับกราฟเดิมและต้องจัดการปัญหา dynamic shortest path แยกต่างหาก

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

ความล้มเหลวที่ควรตรวจใน implementation

กรณีแรกคือหยุดเมื่อเจอโหนดร่วมครั้งแรก แล้วคืน μ โดยไม่ตรวจขอบเขตคิว กรณีนี้ให้คำตอบที่ถูกได้ในบางอินพุต แต่ไม่มีใบรับรองทั่วไป กรณีที่สองคือค้นย้อนด้วยขอบขาออกแทนขาเข้าในกราฟมีทิศทาง ผลลัพธ์อาจผิดทิศแม้ทุกระยะดูสมเหตุสมผล กรณีที่สามคือใช้ค่าคิวเก่าคำนวณ α หรือ β ซึ่งทำให้ lower bound ที่นำไปเทียบกับ μ ไม่ใช่ค่าปัจจุบัน

กรณีที่สี่คือรับน้ำหนักติดลบหรือใช้ Dijkstra กับกราฟที่มีต้นทุนเปลี่ยนระหว่างการค้น กรณีที่ห้าคือประกอบเส้นทางจาก parent ฝั่งย้อนโดยกลับทิศผิดหรือคิดต้นทุนขอบเชื่อมซ้ำ กรณีที่หกคือไม่ทดสอบกราฟไม่มีเส้นทาง ทำให้โปรแกรมคืนค่าอนันต์เหมือนเป็นคำตอบ กรณีที่เจ็ดคือจัดการขอบศูนย์และ tie ไม่รัดกุมจนตัวชี้ parent วนซ้ำหรือการตรวจเส้นทางค้าง

ข้อจำกัดและแนวทางต่อยอด

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

ข้อควรจำห้าข้อ: ใช้ incoming edges, ต้นทุนไม่ติดลบ, mu เป็นเพียงผู้สมัคร, ใช้ minimum key ที่ valid, และไม่มีคำรับรองว่าเร็วกว่าเสมอ
จำขอบเขตของคำรับรอง — ความถูกต้องขึ้นกับต้นทุนไม่ติดลบ การจัดการ stale entries และค่าต่ำสุดที่ยัง valid ของ frontier · แหล่งอ้างอิง 1 · แหล่งอ้างอิง 2 · แหล่งอ้างอิง 3

สรุปจำง่าย

  1. ใช้ Bidirectional Dijkstra กับคำถามจากต้นทางถึงปลายทางบนกราฟที่มีน้ำหนักไม่ติดลบ
  2. ฝั่งย้อนเริ่มที่เป้าหมาย แต่เดินตามขอบขาเข้าของกราฟเดิมด้วยต้นทุนเดิม
  3. การพบโหนดร่วมหรือขอบเชื่อมสร้างผู้สมัคร μ เท่านั้น ยังไม่ใช่เหตุผลหยุด
  4. ล้างรายการคิวที่ stale แล้วคำนวณ α และ β; หยุดเมื่อ α + β ≥ μ
  5. สร้างเส้นทางกลับจากตัวชี้ทั้งสองฝั่งและตรวจว่าทุกขอบมีอยู่จริงและผลรวมตรงกับ μ
  6. ถ้ากราฟไม่มีน้ำหนักหรือทุกขอบต้นทุนเท่ากัน ให้พิจารณา Bidirectional BFS; ถ้าน้ำหนักติดลบ อย่าใช้ Dijkstra

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

คำถามที่พบบ่อย

หยุดทันทีเมื่อค้นจากสองด้านเจอกันได้ไหม

ไม่ได้สำหรับ weighted bidirectional Dijkstra แบบทั่วไป การพบกันยืนยันว่ามีเส้นทางและให้ต้นทุนผู้สมัคร แต่ยังมีเส้นทางอื่นที่ถูกกว่าและยังไม่ถูกค้นพบได้ ให้ค้นต่อจน α + β ≥ μ

ทำไมกราฟมีทิศทางต้องมีดัชนีขาเข้า

เพราะการค้นย้อนจาก t ต้องหาว่าโหนดใดมีขอบเข้าสู่โหนดปัจจุบันในกราฟเดิม การเดินตามขอบขาออกเดิมจาก t จะตอบคำถามคนละทิศทาง และอาจสร้างเส้นทางที่เดินไม่ได้จาก s ไป t

ใช้กับน้ำหนักศูนย์ได้หรือไม่

ได้ เพราะศูนย์ไม่ติดลบ แต่ต้องจัดการเส้นทางต้นทุนเท่ากันและวงจรศูนย์ไม่ให้ตัวชี้ย้อนวน การคืนเส้นทางสั้นที่สุดหนึ่งเส้นอาจใช้ tie-breaking ที่กำหนดแน่นอน

ถ้าไม่มีทางจากต้นทางไปเป้าหมายเกิดอะไรขึ้น

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

Bidirectional Dijkstra เร็วกว่า Dijkstra เสมอไหม

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

แหล่งอ้างอิง

ใส่ความเห็น

Discover more from HYBRID MIND

Subscribe now to keep reading and get access to the full archive.

Continue reading