สุ่มสร้างกราฟกำกับบนตาราง


11

ฉันพยายามที่จะสร้างกราฟกำกับแบบสุ่มเพื่อจุดประสงค์ในการสร้างเกมไขปริศนาคล้ายกับปริศนาเลื่อนน้ำแข็งจากโปเกมอน
นี้เป็นหลักสิ่งที่ฉันต้องการที่จะสามารถสร้างแบบสุ่ม: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory

ฉันต้องสามารถ จำกัด ขนาดของกราฟในมิติ x และ y ได้ ในตัวอย่างที่ให้ไว้ในลิงค์มันจะถูก จำกัด ไว้ที่ตาราง 8x4
ปัญหาที่ฉันพบคือการสร้างกราฟแบบสุ่ม แต่สร้างกราฟแบบสุ่มซึ่งฉันสามารถแมปพื้นที่ในพื้นที่ 2 มิติได้อย่างเหมาะสมเนื่องจากฉันต้องการบางสิ่ง (เช่นก้อนหิน) ที่อยู่ฝั่งตรงข้ามของโหนดเพื่อทำให้เกิด มองเห็นได้ชัดเจนเมื่อคุณหยุดเลื่อน ปัญหาเกี่ยวกับเรื่องนี้คือบางครั้งก้อนหินจะสิ้นสุดลงในเส้นทางระหว่างสองโหนดอื่น ๆ หรืออาจเกิดขึ้นกับโหนดอื่นเองซึ่งทำให้กราฟทั้งหมดแตกหัก

หลังจากพูดคุยปัญหากับคนไม่กี่คนที่ฉันรู้จักเรามาถึงข้อสรุปที่อาจนำไปสู่การแก้ปัญหา

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

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

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

นี่คือตัวอย่างที่ไม่ดีของกราฟที่สร้างแบบสุ่ม:

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

นี่คือตัวอย่างที่ดีของกราฟที่สร้างขึ้นแบบสุ่ม (หรือ tweaked ด้วยมือ):

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

ฉันก็ดูเหมือนจะสังเกตเห็นสิ่งที่ท้าทายมากขึ้นเมื่อเล่นเกมนี้จริง ๆ เพราะตัวต่อเป็นปริศนาที่มีโหนดระดับสูงจำนวนมากตามเส้นทางขั้นต่ำ


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

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

คำตอบ:


2
  • มันคือน้ำแข็งคุณจะเคลื่อนไหวถ้าคุณชนหิน
  • วิธีเดียวที่จะเปลี่ยนทิศทางคือการตีหิน
  • หากคุณกดก้อนหินคุณต้องเปลี่ยนทิศทาง
  • รอบเป็นสิ่งที่ดีด้วยเหตุผลที่ชัดเจน
  • สามารถมีได้หลายครั้งและหลายจบ

คุณสมบัติขั้นสูงเพิ่มเติม:

  • เซลล์ที่ไม่มีหินที่อยู่ติดกันนั้นไม่สามารถเข้าถึงได้ (บางคนสามารถเคลื่อนที่ได้)
  • ผนังเป็นหินด้วยถ้าคุณเอาออกคุณสามารถตัดสินใจล้อมรอบ
  • คุณสามารถใช้ตารางย่อยเป็นรูปแบบ ("เรียงต่อกัน" 3x3, 3x4, 5x5, ... ฯลฯ )
  • คุณสามารถซ้อนทับตัวต่อ MxN ตัวต่อที่ด้านบนของพื้นที่ MxN ที่ไม่สามารถผ่านได้และเพิ่มก้อนหินเพื่อเปลี่ยนเส้นทางเข้า / ออก
  • การหมุนหรือความสมมาตรของกระเบื้องนั้นน่าสนใจ
  • คุณสามารถขยายไทล์โดยการแทรกแถว / คอลัมน์น้ำแข็ง

ตัวอย่าง:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

ตัวอย่างของการรวมกระเบื้อง:

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

คุณอาจชอบเกม Tsuroมันใช้ไทล์เพื่อสร้างบอร์ดแบบสุ่ม


0

วิศวกรรมย้อนกลับอาจช่วยคุณได้หากคุณพร้อมรับสิ่งนั้น

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

คุณสามารถไปได้โดย:

  1. การเตรียมกราฟ MxN ให้พร้อม
  2. การสร้างโซลูชันหนึ่งรายการ / หลายรายการ
  3. ทำคำถามรอบ ๆ หากเป็นปัญหาการแก้ปัญหาเอกพจน์
  4. หากมีหลายวิธีในการแก้ไขปัญหาจากนั้นคุณสามารถทำซ้ำขั้นตอนข้างต้นในลักษณะเพื่อให้การทำซ้ำปัจจุบันไม่ยับยั้งวิธีอื่น

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


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

0

วิธีการอื่นเกี่ยวกับ? เริ่มด้วยเขาวงกตที่ว่างเปล่าและเพิ่มบล็อกเช่นนี้:

  1. สุ่มเริ่มบล็อกและบล็อกสิ้นสุด
  2. ทำขั้นตอนที่ 1-3 "การเลื่อน" ในทิศทางสุ่ม (แต่ไม่กลับ) และมีความยาวแบบสุ่ม (*) วางบล็อกหลังแต่ละขั้นตอน (เพื่อหยุดสไลด์)
  3. ค้นหาเส้นทางที่สั้นที่สุดไปยังทางออก หากมีกลุ่มน้อยเกินไป (ระดับความยากระดับต่ำ) ให้แบ่งกลุ่มของเส้นทางแบบสุ่มและแบ่งเป็นบล็อก มิฉะนั้นให้วางบล็อกไว้ในขั้นตอนที่ 1 และออก
  4. ทำซ้ำ 1 ด้วยความระมัดระวัง (*): เมื่อคุณเลือกความยาวของขั้นตอนการเลื่อนทำเพื่อให้บล็อกที่คุณใส่จะไม่ปิดเส้นทางก่อนหน้า

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

มีข้อแม้ในขั้นตอนที่สองเมื่อคุณไม่สามารถวางบล็อกสุดท้ายเพื่อไม่ให้ข้ามเส้นทางที่ใช้ไปได้ แต่ฉันเห็นวิธีแก้ปัญหาสองประการนี้: เลื่อนบล็อกสิ้นสุดก่อนหน้านี้หรือเลิกทำสองสามขั้นตอนแล้วลองอีกครั้ง

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


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