พูดตามตรงฉันไม่อยากจะเชื่อเลยว่าสิ่งนี้ยังไม่ได้ถูกถาม แต่ที่นี่คือ
พื้นหลัง
เมื่อพิจารณาจากระนาบที่ไม่ได้บอกทิศทางอย่างง่าย(สามารถวาดกราฟในระนาบที่ไม่มีทางแยก) กราฟมันเป็นทฤษฎีบทที่พิสูจน์แล้วว่ากราฟมีสี 4 สีซึ่งเป็นคำที่เราจะสำรวจในบิต อย่างไรก็ตามมันง่ายกว่าที่จะใช้กราฟ 5 สีซึ่งเป็นสิ่งที่เราจะมุ่งเน้นไปที่ความท้าทายของเราในวันนี้
k-colouring ที่ถูกต้องของกราฟคือการกำหนด "colors" ให้กับโหนดของกราฟที่มีคุณสมบัติดังต่อไปนี้
- หากสองโหนดเชื่อมต่อกันด้วยขอบโหนดจะมีสีที่มีสีต่างกัน
- ในกราฟมีสีได้สูงสุด 5 สี
เมื่อได้สิ่งนี้ฉันจะนำเสนออัลกอริธึมพื้นฐานสวย ๆ ให้กับ 5 สีกราฟระนาบแบบไม่มีทิศทางใด ๆ อัลกอริทึมนี้ต้องใช้คำจำกัดความต่อไปนี้
ความสามารถเข้าถึงได้: หากโหนด 1 สามารถเข้าถึงได้จากโหนด 2 นั่นหมายความว่ามีลำดับของโหนดแต่ละโหนดเชื่อมต่อกับขอบถัดไปดังนั้นโหนดแรกคือโหนด 2 และสุดท้ายคือโหนด 1 โปรดทราบว่าเนื่องจากกราฟที่ไม่ได้ถูกบอกทิศทาง เป็นแบบสมมาตรหากโหนด 1 สามารถเข้าถึงได้จากโหนด 2 โหนด 2 สามารถเข้าถึงได้จากโหนด 1
Subgraph : กราฟย่อยของกราฟของชุดโหนดที่ระบุ N คือกราฟที่โหนดของกราฟย่อยทั้งหมดใน N และขอบจากกราฟต้นฉบับอยู่ในกราฟย่อยถ้าหากโหนดทั้งสองเชื่อมต่อกันด้วยขอบ อยู่ใน N.
ให้ Color (N) เป็นฟังก์ชั่นกราฟสีระนาบที่มี N nodes 5 สี เรากำหนดฟังก์ชั่นด้านล่าง
- ค้นหาโหนดที่มีจำนวนโหนดน้อยที่สุดที่เชื่อมต่ออยู่ โหนดนี้จะมีการเชื่อมต่อได้สูงสุด 5 โหนด
- ลบโหนดนี้ออกจากกราฟ
- เรียก Color (N-1) บนกราฟใหม่นี้เพื่อระบายสี
- เพิ่มโหนดที่ถูกลบกลับไปที่กราฟ
- ถ้าเป็นไปได้ให้เพิ่มสีของโหนดที่เพิ่มซึ่งเป็นสีที่ไม่มีโหนดเชื่อมต่ออยู่
- หากเป็นไปไม่ได้โหนดทั้งหมด 5 โหนดที่อยู่ใกล้เคียงกับโหนดที่เพิ่มจะมีสีต่างกัน 5 สีดังนั้นเราต้องลองกระบวนการต่อไปนี้
- หมายเลขโหนดที่ล้อมรอบโหนดที่เพิ่ม n1 ... n5
- พิจารณากราฟย่อยของโหนดทั้งหมดในกราฟต้นฉบับที่มีสีเดียวกันกับ n1 หรือ n3
- หากในกราฟย่อยนี้ n3 ไม่สามารถเข้าถึงได้จาก n1 ในชุดของโหนดที่สามารถเข้าถึงได้จาก n1 (รวมถึง n1) ให้แทนที่สี n1 ทั้งหมดด้วย n3's และในทางกลับกัน ตอนนี้สีเพิ่มสีเดิมของโหนด n1
- หาก n3 สามารถเข้าถึงได้จาก n1 ในกราฟใหม่นี้ให้ทำกระบวนการจากขั้นตอนที่ 9 บนโหนด n2 และ n4 แทนที่จะเป็น n1 และ n3
ท้าทาย
รับอินพุตของ edgelist (แสดงกราฟ), ระบายสีกราฟโดยกำหนดค่าแต่ละโหนด
อินพุต : รายการขอบในกราฟ (เช่น, [('a','b'),('b','c')...]
)
โปรดทราบว่าอินพุต edgelist จะเป็นเช่นนั้นหาก (a, b) อยู่ในรายการ (b, a) ไม่อยู่ในรายการ
เอาท์พุท : วัตถุที่มีคู่ของค่าที่องค์ประกอบแรกของแต่ละคู่เป็นโหนดและสีที่สองคือ[('a',1),('b',2)...]
หรือ{'a':1,'b':2,...}
คุณสามารถใช้สิ่งใดก็ได้เพื่อแสดงสีตั้งแต่ตัวเลขตัวละครไปจนถึงอย่างอื่น
อินพุตและเอาต์พุตค่อนข้างยืดหยุ่นตราบใดที่ค่อนข้างชัดเจนว่าอินพุตและเอาต์พุตเป็นอย่างไร
กฎระเบียบ
- นี่คือความท้าทายรหัส - กอล์ฟ
- คุณไม่จำเป็นต้องใช้อัลกอริทึมที่ฉันได้อธิบายไว้ข้างต้น มันมีไว้เพื่ออ้างอิงเท่านั้น
- สำหรับกราฟใด ๆ มักมีวิธีการระบายสีที่ถูกต้องอยู่บ่อยครั้ง ตราบใดที่การระบายสีอัลกอริทึมของคุณถูกต้องก็เป็นที่ยอมรับได้
- โปรดจำไว้ว่ากราฟจะต้องมี 5 สี
กรณีทดสอบ
ใช้รหัสต่อไปนี้เพื่อทดสอบความถูกต้องของผลลัพธ์การระบายสีของคุณ เนื่องจากมีกราฟสีที่ถูกต้องจำนวนมากต่อกราฟอัลกอริทึมนี้จะตรวจสอบความถูกต้องของสี ดู docstring เพื่อดูวิธีใช้รหัส
กรณีทดสอบแบบสุ่ม (และค่อนข้างโง่) :
กรณีทดสอบ 2: Krackhardt Kite Graph
[(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]
ผลลัพธ์ที่ถูกต้อง:
{0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}
หมายเหตุ : กรณีทดสอบเหล่านี้มีขนาดเล็กเกินไปที่จะทดสอบพฤติกรรมที่เหมาะสมยิ่งขึ้นของอัลกอริธึมการระบายสีดังนั้นการสร้างกราฟของคุณเองน่าจะเป็นการทดสอบความถูกต้องของงานของคุณได้ดี
หมายเหตุ 2 : ฉันจะเพิ่มรหัสอีกส่วนหนึ่งที่จะวาดกราฟโซลูชันสีของคุณในไม่ช้า
หมายเหตุ 3 : ฉันไม่ได้มองข้ามอัลกอริธึมการระบายสีแบบสุ่มที่ได้รับการนำเสนอซึ่งเป็นสิ่งที่ยอดเยี่ยมเกี่ยวกับ PPCG! อย่างไรก็ตามถ้าใครสามารถเล่นกอล์ฟอัลกอริธึมที่กำหนดได้มากกว่านี้
5
ไป4
, และส่งพวกเขา