ขั้นตอนการสร้างคุกใต้ดิน: มีอัลกอริทึมง่าย ๆ เพื่อให้แน่ใจว่าห้องเหล่านี้เชื่อมต่อกันด้วยการใช้ทางเดินน้อยที่สุดหรือไม่?


9

เป็นไปได้ไหมที่จะมีโครงสร้างเหมือนรังผึ้งเชื่อมต่อห้องพักทุกห้องโดยไม่ต้องมีทางเดินมากเกินไป? (มีคนมากเกินไปที่มี 3-4 คน + เดินมาจากห้องเดียว)

ด้านล่างเป็นผลลัพธ์ของลักษณะห้องของฉันโดยทั่วไปพวกเขาวางแบบสุ่ม

เอาท์พุทของห้องกริดวางสุ่ม

สิ่งที่ฉันหวังว่าจะได้ทางเดินที่ชาญฉลาด

http://i.imgur.com/9GUi6Yy.png


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

อาจรวมแผนที่ "เสร็จสมบูรณ์" เพื่อแสดงสิ่งที่คุณสนใจ
MichaelHouse

อ่าใช่ฉันหมายถึงคนเดินสูงสุด 3 หรือ 4 คนที่มาจากแต่ละห้อง
Blenderer

ฉันได้เพิ่มภาพของสิ่งที่ฉันกำลังทำงานไปจนถึงทางเดิน
Blenderer

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

คำตอบ:


6

วิธีที่ง่ายที่สุดที่ฉันคิดได้เริ่มต้นด้วยการทำให้แน่ใจว่าทุกห้องเชื่อมต่อกันด้วยทางเดินอย่างน้อย 1 ทาง:

  1. เริ่มต้นด้วยห้องสุดท้ายหรือห้องแรก
  2. หยิบห้องสุ่มภายในระยะทาง 1 ซึ่งไม่ได้เชื่อมต่อกับบางห้อง (ทุกห้องเริ่มขาดการเชื่อมต่อดังนั้นคุณจะติดตามสิ่งนี้ได้ในขณะที่คุณไป)
  3. หากไม่มีห้องดังกล่าวให้ไปที่ +1 หากตกลงไปที่อุโมงค์เหนือ / ใต้ห้องอื่นจะทำได้ง่ายขึ้นโดยสมมติว่าคุณไม่ต้องการเชื่อมต่อทางเดิน
  4. ใช้วิธีการของคุณผ่านการสุ่มหลอกจนกว่าห้องพักทั้งหมดจะเชื่อมต่อ

ตอนนี้เรารู้ว่าคุณสามารถไปที่ห้องพักทุกห้อง แต่ตอนนี้ถ้าคุณต้องการเขาวงกตเชิงเส้นมากกว่านี้คุณก็สามารถก้าวผ่านห้องของคุณและสร้างเส้นทางใหม่เพื่อเชื่อมต่อห้องต่างๆได้ถึงขีด จำกัด ต่อห้อง 2-3 หรือ จนกว่าจะมีบางเปอร์เซ็นต์ของห้องพักเข้าถึงการเชื่อมต่อสูงสุด - ฯลฯ

ในขั้นตอนสุดท้ายคุณสามารถเพิ่มกฎที่จะเปลี่ยนผลลัพธ์ของคุณให้เข้ากับสถานการณ์ต่างๆ ตัวอย่างเช่นคุณอาจสังเกตเห็นว่าห้องใด ๆ ที่มีทางเดินเพียง 1 ห้องก็คือทางตัน คุณสามารถทำให้ตายได้มากขึ้นหรือคุณสามารถกำจัดพวกมันทั้งหมดโดยทำให้แน่ใจว่าทุกอย่างมีอย่างน้อย 2 การเชื่อมต่อ คุณสามารถทำให้สิ้นตายมีทางลับ คุณสามารถตรวจสอบให้แน่ใจว่าหัวหน้าห้องนั้นตายไปแล้ว คุณสามารถตรวจสอบให้แน่ใจว่าห้องเริ่มต้นของคุณเป็นจุดสิ้นสุด แต่จากนั้นตรวจสอบให้แน่ใจว่าห้องที่สองมีการเชื่อมต่อ X ขั้นต่ำ Ad infinitum

สมมติฐานและกฎแต่ละข้อสามารถเปลี่ยนระดับของคุณอย่างรุนแรง แต่นั่นเป็นส่วนหนึ่งของความสนุก! อย่างน้อยที่สุดคุณควรได้รับห้องที่เหมือนเป็นถ้ำ


นี่ค่อนข้างใกล้กับอัลกอริธึมขั้นต่ำของ Spanning Tree ของ Kruskal ซึ่งเป็นการแก้ไขเงื่อนไขใน 2 จาก "ไม่ได้เชื่อมต่อกับห้องบางห้อง" เป็น "ไม่ได้เชื่อมต่อกับคลัสเตอร์เดียวกัน " ซึ่งแก้ไขข้อผิดพลาดในกฎที่อธิบายไว้ข้างต้น สถานการณ์ที่แต่ละห้องเชื่อมต่อกับบางห้อง แต่ดันเจี้ยนโดยรวมยังคงเป็นเกาะที่ไม่ได้เชื่อมต่อกันหลายแห่ง Kruskal's รับประกันว่าจะพบกราฟการเชื่อมต่อที่มีความยาวทางเดินรวมขั้นต่ำ
DMGregory

3

เพียงแค่สร้างห้องของคุณเชื่อมต่ออยู่แล้ว เริ่มด้วยห้องหนึ่งจากนั้นสร้างทางเดิน 1-3 ห้องไปที่ห้องอื่น จากนั้นทำการเติมเงินจนกว่าคุณจะเพิ่มห้องเพียงพอ


2

เนื่องจากห้องเหล่านี้เป็นกราฟจุดยอดที่ฝังอยู่ในที่ราบ 2d ซึ่งในทางทฤษฎีสามารถทำได้โดยการแก้ปัญหาพนักงานขายที่เดินทาง เห็นได้ชัดว่าฮิวริสติกแบบง่ายจะใช้ได้และให้ความยืดหยุ่นที่สมเหตุสมผล

คุณคำนวณขอบ (ความยาวทางเดิน) ระหว่างห้องทั้งหมด คุณจัดเรียงตามความยาว คุณเพิ่มทางเดินที่สั้นที่สุดเว้นแต่จะสร้างวงจรหรือเพิ่มระดับของจุดยอด (ห้อง) เหนือค่าสูงสุดที่คุณต้องการ (3-4) (ทำซ้ำ) ในการตรวจสอบรอบคุณสามารถใช้ UnionFind หรือทำ BFS อย่างรวดเร็วกับข้อมูลขนาดเล็ก


คำตอบนี้ดีกว่าคำตอบที่ยอมรับ กลยุทธ์โลภในการเลือกทางเดินเชื่อมต่อที่สั้นที่สุดก่อนควรทำงาน เพื่อหลีกเลี่ยงการวนรอบอย่าทำการเชื่อมต่อกับห้องที่มีทางเดินเชื่อมต่อแล้ว
Jelle van Campen

@JellevanCampen ขอบคุณ ;) คุณอาจมีสองคอมโพเนนต์ที่เชื่อมต่อแยก ดังนั้นคุณอาจต้องการใช้ Union find หรือตรวจสอบกับ BFS หากมีการเชื่อมต่อสองโหนด
AturSams

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