วิธีแสดงกราฟที่มีหลาย ๆ ขอบที่อนุญาตระหว่างโหนดและขอบที่สามารถเลือกได้หายไป


11

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

ในสถานการณ์สมมติของฉันจำนวนผู้ใช้ที่เป็นศัตรูกันกำลังพยายามสร้างเครือข่ายคอมพิวเตอร์ที่รู้จักการเชื่อมต่อที่อาจเกิดขึ้นทั้งหมด คอมพิวเตอร์ที่ผู้ใช้รายหนึ่งต้องการเชื่อมต่ออาจไม่เหมือนกับคอมพิวเตอร์ที่ผู้ใช้รายอื่นต้องการเชื่อมต่อ ผู้ใช้ 1 อาจต้องเชื่อมต่อคอมพิวเตอร์ A, B และ D ในขณะที่ผู้ใช้ 2 อาจต้องเชื่อมต่อคอมพิวเตอร์ B, C และ E

ป้อนคำอธิบายรูปภาพที่นี่

ภาพที่สร้างขึ้นด้วยความช่วยเหลือของผู้สร้างกราฟ NCTM

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

  1. ขอบสามารถใช้งานได้อย่าง จำกัด กล่าวคือหากผู้ใช้รายหนึ่งได้รับการเชื่อมต่อเครือข่ายที่กำหนดไม่มีผู้ใช้รายอื่นที่สามารถใช้การเชื่อมต่อนั้นได้
    • ในตัวอย่างผู้ใช้สีเขียวอาจไม่สามารถเชื่อมต่อกับคอมพิวเตอร์ A แต่ผู้ใช้สีแดงเชื่อมต่อ B ถึง E แม้ว่าจะไม่มีการเชื่อมโยงโดยตรงระหว่างพวกเขา
  2. ในบางกรณีคู่ของโหนดที่ระบุจะถูกเชื่อมต่อโดยมากกว่าหนึ่งขอบ
    • ในตัวอย่างมีสายเคเบิลอิสระสองตัวที่รันจาก D ถึง E ดังนั้นผู้ใช้สีเขียวและสีน้ำเงินจึงสามารถเชื่อมต่อเครื่องเหล่านั้นได้โดยตรง อย่างไรก็ตามสีแดงไม่สามารถเชื่อมต่อได้อีกต่อไป
  3. หากคอมพิวเตอร์สองเครื่องเชื่อมต่อกันด้วยสายเคเบิลมากกว่าหนึ่งสายผู้ใช้แต่ละคนอาจเป็นเจ้าของได้ไม่เกินหนึ่งสาย

ฉันจะต้องดำเนินการหลายอย่างในกราฟนี้เช่น:

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

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


ดูเหมือนว่าจะเกี่ยวข้องกัน youtube.com/watch?v=xdiL-ADRTxQ
RubberDuck

ฉันไม่ได้เห็นว่ามันจะช่วยได้อย่างไร
ปรากฏ

ฉันเลยคิดถึงเรื่องนี้ซักพัก ในอัลกอริธึมส่วนใหญ่สำหรับกราฟคุณมีสองสิ่งที่คุณต้องทำเป็นหลัก: ระบุเพื่อนบ้านหรือหาน้ำหนักของขอบ คำถามที่คุณระบุไว้ทั้งหมดเกี่ยวข้องกับผู้ใช้เพียงคนเดียว สำหรับผู้ใช้คนเดียวการระบุเพื่อนบ้านหรือการหาน้ำหนักของขอบสามารถตอบได้ทั้งในเวลาคงที่ (ถ้าจำนวนผู้ใช้ถูก จำกัด ) หรือใน log N โดยเพียงแค่สะท้อนรายการ adjacency หรือเมทริกซ์ด้วย "ความเป็นเจ้าของ" ด้วยเหตุนี้ฉันคิดว่าสามารถขยายได้อย่างง่ายดายและควรเลือกตามจุดแข็งแบบดั้งเดิมแทนที่จะได้รับความสนใจจากผู้ใช้
J Trana

คำตอบ:


6

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

ดูเหมือนว่าคุณควรใช้สิ่งที่เราสามารถติดป้าย "กราฟชั้น" คือเพิ่ม combinator สำหรับกราฟพูด@เพื่อที่:

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

ด้วยกราฟที่มีเลเยอร์ดังกล่าวคุณสามารถกำหนด K ให้เป็นข้อมูล kommon ที่มีอยู่และ R, G, B แต่ละข้อมูลส่วนตัวเพื่อให้ผู้เล่นแต่ละคนเห็นจริง ๆ R @ K, G @ K, B @ K

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

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

คุณสามารถแทนที่ด้วย

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

ที่ซึ่งคุณจัดหาLayeredGraphsและยืมที่เหลือจากห้องสมุด


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

1

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

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


1
แน่นอนว่าเมทริกซ์คำคุณศัพท์ไม่สามารถแสดงขอบมากกว่า 1 จุดระหว่างโหนดแต่ละคู่
jk

1
@jk โดยปกติคุณถูกต้อง แต่ข้อมูลที่แนบมาในเมทริกซ์ adjacency อาจมีจำนวนของส่วนโค้งและแอตทริบิวต์ที่แยกกันสำหรับแต่ละส่วนโค้ง แต่ในกรณีส่วนใหญ่ฉันจะใช้รายการ adjacency เพราะมันจะง่ายกว่า
walrii

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