วิธีที่ดีในการสร้างขอบระหว่างโหนดกราฟคืออะไร?


10

ฉันกำลังสร้างตัวสร้างแผนที่แบบสุ่มสำหรับเกมอวกาศ 4X

แต่ละโหนดในเกมจะวางที่พิกัดสุ่ม (x, y) บนกริด 2d โหนดสามารถมีขอบสองทิศทางหนึ่งหรือมากกว่านั้นไปยังโหนดอื่น (แทนหนอน) โหนดทั้งหมดต้องมีหนอนอย่างน้อยหนึ่งตัวและโหนดทั้งหมดจะต้องอยู่ในกราฟเดียวกัน

ตามหลักการแล้วตัวหนอนไม่ควรยาวเกินความยาวสูงสุดและหากเป็นไปได้ตัวหนอนไม่ควรข้ามกัน

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


โหนดกระจัดกระจายไปทั่วกาแลคซีเป็นอย่างไร? ฉันหมายความว่าฉันคิดว่าทุกจุด (X, Y) ในกาแลคซีมีโหนดหรือไม่ หรืออย่างน้อยก็สำหรับพวกเขาส่วนใหญ่หรือไม่?
Ali1S232

ไม่ใช่ทุกพิกัดที่จะมีโหนด ประมาณ 40% ฉันอยากจะบอก
Extrakun

คำตอบ:


9

นี่เป็นคำตอบที่ดีสำหรับคำถามที่คล้ายกัน

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


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


+1 เนื่องจากเป็นคำตอบที่ดีมาก แต่ฉันไม่ชอบคนรุ่นนี้ฉันจะคิดถึงอัลกอริธึมที่ดีกว่าในอีกไม่กี่วันข้างหน้า!
Ali1S232

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

Offtopic แต่ฉันจะเชื่อมโยงกับคำตอบของฉันด้วย! : p
r2d2rigo

ด้วยวิธีนี้ฉันจะได้รับคะแนนสำหรับมันฮ่า!
ฟิลิป

7

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

ตามหลักการแล้วตัวหนอนไม่ควรยาวเกินความยาวสูงสุดและหากเป็นไปได้ตัวหนอนไม่ควรข้ามกัน

เมื่อคุณเชื่อมต่อจุดต่าง ๆ ในระบบคลาวด์อย่างไร้เดียงสาคุณจะต้องเสี่ยงกับสิ่งเหล่านี้ซึ่งเป็นไปไม่ได้

ดังนั้นคุณจะเห็นว่าปัญหาไม่ได้เกิดจากการเชื่อมต่อหนึ่งเดียวกับการเชื่อมต่อเหล่านั้น มันเป็นเรื่องเล็กน้อยที่จะเชื่อมต่อทุกโหนดในกราฟกับโหนดอื่น ๆ แต่การเชื่อมต่อกับโหนดที่ใกล้เคียงที่สุดที่สุดในขณะที่การรักษา 1-connectedness ของกราฟโดยรวมนั้นค่อนข้างยุ่งยากกว่า

นี่คือสิ่งที่สมการDelaunayสร้างขึ้นในnมิติ เหตุผลแรกที่ใช้ Delaunay triangulation ก็คือมันเติมเต็มทั้งสองอย่างโดยปริยาย เหตุผลที่สองคือมันง่ายกว่ามากที่จะย้อนกลับจากกราฟ (ลบขอบและจุดยอดที่คุณไม่ต้องการ) ได้ง่ายกว่าสร้างด้วยวิธีอื่น

  1. สร้าง cloud point แบบเต็มของคุณ
  2. Delaunay-triangulate มัน
  3. สร้างกราฟ (จุดเชื่อมต่อ) ในสิ่งนี้คุณสามารถสร้างกราฟทั้งหมด (ทุกดาว) ก่อนจากนั้นกราฟที่ได้รับมาจากผู้เยาว์ที่เป็นตัวแทนของภูมิภาคที่เชื่อมต่อหนอนของคุณเมื่อดำเนินการขั้นตอนที่ 4 หรือคุณสามารถทำงานด้วยวิธีอื่น ๆ เพื่อสร้างภูมิภาคที่เชื่อมต่อหนอนเท่านั้น ครั้งแรกเป็นโหนด supergraph จากนั้นในระยะที่สองให้สร้างดาวแต่ละดวงภายในปริมาตรขอบเขตของภูมิภาคเหล่านั้น (สำหรับสิ่งเหล่านี้ฉันจะได้รับกราฟคู่ของ Delaunay triangulation triangulation - แผนภาพ Voronoi ใน 3 มิติ) เป็น subgraphs ตอนนี้คุณมีกระจุกดาวที่เชื่อมต่ออย่างใกล้ชิดและกระจุกดาวทั้งหมดเชื่อมต่อกันด้วยหนอนเจาะยาก: โครงสร้างและภูมิประเทศของคุณเหมาะสมกับผู้เล่น
  4. ใช้วิธีการที่ชาญฉลาดเพื่อกำหนดรูปร่าง super- และ subgraphs ขึ้นอยู่กับวิธีที่คุณเลือกที่จะปฏิบัติต่อในขั้นตอนที่ 3

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

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


Delaunay triangulation เป็นแนวคิดที่ดี แต่มันไม่ได้สร้างขอบแบบสุ่ม คุณสามารถลบขอบแบบสุ่มออกจากขอบที่สร้างโดยสามเหลี่ยม Delaunay แต่จากนั้นคุณจะเสี่ยงต่อการแยกกราฟอีกครั้ง ...
bummzack

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

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