การสร้างแคชพาธด่วนสำหรับกราฟโหนดที่เชื่อมต่อ

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


ในภาพนี้ วงกลมสีน้ำเงินแสดงถึงเราเตอร์และเครือข่ายสี่เหลี่ยมสีเทา

แต่ละเครือข่ายจะเก็บรายการเราเตอร์ที่เชื่อมต่ออยู่ และในทางกลับกัน เราเตอร์ไม่สามารถเชื่อมต่อกับเราเตอร์อื่นได้โดยตรง และเครือข่ายไม่สามารถเชื่อมต่อกับเครือข่ายอื่นได้โดยตรง


รายการเครือข่ายที่เราเตอร์เชื่อมต่ออยู่



เราเตอร์ก็ทำเช่นเดียวกัน

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

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

โปรดทราบว่าในขณะที่กราฟตัวอย่างเหล่านี้มีเครือข่ายสี่เครือข่าย แต่กราฟในทางปฏิบัติมีเครือข่าย 55 เครือข่ายและมีเราเตอร์ประมาณ 20 ตัวที่ใช้งานอยู่ เส้นทางที่เป็นไปไม่ได้ก็สามารถเกิดขึ้นได้เช่นกัน และเมื่อใดก็ตามภูมิประเทศกราฟเครือข่าย/เราเตอร์สามารถเปลี่ยนแปลงได้ โดยกำหนดให้แคชเส้นทางต้องถูกสร้างขึ้นใหม่

วิธีการ/อัลกอริทึมใดน่าจะให้ผลลัพธ์ที่ดีที่สุดสำหรับกราฟประเภทนี้


person Sukasa    schedule 01.06.2010    source แหล่งที่มา
comment
หากจำเป็น ฉันสามารถระบุรหัสที่ใช้สร้างแคชในเวลาที่ถามคำถามได้   -  person Sukasa    schedule 01.06.2010


คำตอบ (2)


อัลกอริธึมเส้นทางที่สั้นที่สุดของ Dijkstra เป็นแบบคลาสสิก แต่ได้รับการออกแบบมาสำหรับกราฟคงที่เท่านั้น

คุณสามารถลองค้นหาเว็บเพื่อหาอัลกอริธึมอดีตที่สั้นที่สุดแบบไดนามิกได้

นี่คือรายงานฉบับหนึ่งที่ดูเหมือนว่ามีความเกี่ยวข้อง: http://www.utdallas.edu/~edsha/papers/bin/Globecom04_SPT.pdf (และอาจให้โอกาสในการขายอื่นๆ แก่คุณ)

เอกสารนี้จะอธิบายเครือข่ายของเราเตอร์ โดยที่เราเตอร์แต่ละตัวจะรักษาตารางเส้นทางที่สั้นที่สุดของตัวเองไว้ บางทีคุณอาจทำสิ่งที่คล้ายกันได้

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

หวังว่ามันจะช่วยได้

person Community    schedule 02.06.2010
comment
ในบริบทของเครือข่าย ระดับการรับส่งข้อมูล/อื่นๆ ไม่มีความเกี่ยวข้อง เนื่องจากเป็นเพียงการจำลองระดับสูงอย่างง่าย เกมดังกล่าวได้รับการเข้ารหัสในภาษาที่คอมไพล์เป็นไบต์โค้ดแล้วจึงตีความ ดังนั้นฟังก์ชันต่างๆ จึงต้องค่อนข้างเบา (และโค้ดที่ย้ายเส้นทางจากเครือข่ายหนึ่งไปยังอีกเครือข่ายหนึ่งนั้นมีประสิทธิภาพพอๆ กับที่จะได้รับโดยไม่ต้องถอดฟังก์ชันการทำงานออก) ตราบใดที่ฉันสามารถสร้างเส้นทางที่ถูกต้อง ใดๆ ได้อย่างรวดเร็ว หรือระบุอย่างรวดเร็วว่าไม่มีเส้นทางดังกล่าวอยู่ (หรือการประนีประนอมของทั้งสองเส้นทาง) ฉันก็มีความสุข - person Sukasa; 03.06.2010
comment
@Sukasa: คุณอาจพบว่าการแบ่งกราฟของคุณออกเป็นส่วนประกอบที่เชื่อมต่อแบบสองส่วนนั้นมีประโยชน์ - person ; 03.06.2010
comment
@Moron คุณช่วยให้ข้อมูลเพิ่มเติมอีกหน่อยได้ไหม? บทความวิกิพีเดียเกี่ยวกับพวกเขาทำให้ฉันไม่แน่ใจเล็กน้อย - person Sukasa; 03.06.2010
comment
@Sukasa: ส่วนประกอบที่เชื่อมต่อแบบ bi-connected (หรือ 2-connected) คือกราฟที่มีเส้นทางที่ไม่เชื่อมต่อกันอย่างน้อยสองเส้นทางระหว่างจุดยอดแต่ละคู่ ดังนั้น หากคุณแบ่งกราฟออกเป็น 2 องค์ประกอบที่เชื่อมต่อกัน แล้วพบเครือข่าย/เราเตอร์ 'edge' อาจเพิ่มความเร็วได้เล็กน้อย ตัวอย่างเช่น หากต้องการเดินทางจากส่วนประกอบ A ไปยัง C คุณอาจต้องผ่านส่วนประกอบ B หากคุณรู้จักตัวเชื่อมต่อ Edge คุณก็อาจจะค้นหาเส้นทางได้อย่างรวดเร็ว จะใช้เวลาลบขอบอย่างน้อย 2 ครั้งก่อนที่คุณจะ (อาจ) จำเป็นต้องทำการแมปใหม่ มันเป็นเพียงความคิดที่ฉันคิดว่าคุณอาจพบว่ามีประโยชน์ - person ; 03.06.2010
comment
@Sukasa: นอกจากนี้คุณอาจพบว่าส่วน Other Algorithms ของen.wikipedia.org/wiki/Biconnected_componentมีประโยชน์ ซึ่งพูดถึงอัลกอริทึมส่วนประกอบที่เชื่อมต่อสองแบบไดนามิก (โดย Westbrook และ Tarjan) - person ; 03.06.2010

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

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

person jcsf    schedule 01.06.2010