การสร้างแผนที่แบบสุ่ม - กลยุทธ์สำหรับการกระจาย / การรวมโหนดแบบสุ่ม


10

ฉันกำลังเล่นเกมกลยุทธ์ 4X ง่ายๆในอวกาศที่แต่ละโหนดเป็นจุดสนใจ (ดาวเคราะห์ดาวเคราะห์น้อยและอื่น ๆ )

ในการสร้างแผนที่แบบสุ่มฉันจะทำตามขั้นตอนด้านล่าง

  1. ตัดสินใจว่าจะมีกี่โหนดในแต่ละแผนที่ (อาจจะบอกว่ามีดาวเคราะห์คล้ายโลก 5 ดวงหรือดาวเคราะห์ที่แห้งแล้ง 10 ดวงเป็นต้น)

  2. วางแต่ละโหนดบนแผนที่

สำหรับขั้นตอนที่ 2 ฉันต้องการที่จะมีการแพร่กระจายของแต่ละโหนดประเภท ตัวอย่างเช่นฉันจะเริ่มต้นด้วยการวางดาวเคราะห์คล้ายโลกทั้งหมด ถ้าฉันทำแรนด์ (map.width, map.height) เพื่อกำหนดตำแหน่งฉันอาจจะรวมดาวเคราะห์คล้ายโลกทั้งหมดเข้าด้วยกันซึ่งจะให้ประโยชน์กับผู้เล่นที่เริ่มต้นในพื้นที่นั้น

มีวิธีการใดบ้างเช่นการใช้ฟังก์ชั่นกราฟที่แตกต่างกันหรือฟังก์ชั่นเสียงรบกวนซึ่งสามารถสร้างลำดับของ (x, y) พิกัดซึ่งกระจายออกจากกัน มีวิธีใดบ้างในการสร้างพิกัดที่ใกล้เคียงกัน?


1
โปรดทำเครื่องหมายคำตอบว่ายอมรับไม่ว่าจะเป็นของฉันหรือของคนอื่น ขอบคุณ
วิศวกร

คำตอบ:


8

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

  1. แบ่งพื้นที่ของคุณออกเป็นส่วนต่างๆ (เช่นหากคุณมีพื้นที่ 100 ถึง 100 และคุณจำเป็นต้องสร้างระบบพลังงานแสงอาทิตย์เหล่านี้ 100 แห่งจากนั้นแบ่งพื้นที่ของคุณเป็นส่วน 10 ถึง 10 ตาราง)

  2. วนซ้ำแต่ละส่วนและทำซ้ำขั้นตอนที่ 3 (ซึ่งจะทำซ้ำขั้นตอนที่ 4 หลายครั้ง)

  3. กำหนดจำนวนดาวเคราะห์สำหรับระบบสุริยจักรวาลในปัจจุบัน (เช่นสำหรับช่วง 3 ถึง 7 ดาวเคราะห์เพียงแค่ได้รับจำนวนสุ่มตั้งแต่ 0 ถึง 4 และเพิ่ม 3) ในภาคปัจจุบัน (ถ้าคุณมีแสงอาทิตย์มากกว่าหนึ่ง ระบบในเซ็กเตอร์นี่คือที่ที่คุณจะตั้งค่าลูปอื่น)

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

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

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


ยินดีต้อนรับคุณ! และ +1 สำหรับโพสต์การติดตามเกี่ยวกับสิ่งที่แก้ไขปัญหาของคุณ =)
Randolf Richardson

8

วิธีที่ดีที่สุดเพื่อให้แน่ใจว่าการกระจายอย่างสม่ำเสมอคือการปฏิบัติต่อโหนดในลักษณะของอนุภาคทางกายภาพ ก่อนอื่นทำการกระจายแบบสุ่มข้ามระนาบ xy ที่ต่อเนื่อง ด้วยการใช้แรงผลักระหว่างอนุภาคแต่ละคู่ที่แตกต่างกันบนเครื่องบินคุณจะพบว่าพวกมันกระจายออกไปอย่างช้าๆ ในความรู้สึกมันเป็นเหมือนการแก้ปัญหาการชนเพียง แต่ไม่มีการติดต่อที่แท้จริงที่จะพูดถึง มันเป็นเรื่องง่ายที่จะแปลงระนาบนั้น ("แรสเตอร์" มัน) กลับไปเป็นกริดดัชนีจำนวนเต็ม คุณสามารถทำสิ่งนี้ได้จากกริดที่เป็นดัชนีจำนวนเต็มเพื่อเริ่มต้น แต่มันอาจจะยากหน่อยที่จะได้สิ่งต่าง ๆ ที่ "ดี" - ขึ้นอยู่กับว่าความละเอียดของกริดของคุณสูงขึ้นเท่าใด ... ยิ่งดี , ในกรณีนี้.

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

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


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

6

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

แนวคิดพื้นฐานของอัลกอริธึมเหล่านี้คือคุณเริ่มต้นด้วยจุด "เมล็ดพันธุ์" แรกจากนั้นทำงานด้วยตัวเองออกไปด้านนอกเพิ่มจุดสุ่มหรือหลอกเทียมในห่วงระหว่างระยะทางสูงสุดและต่ำสุดที่คุณต้องการจากจุดเป็นต้นไปและกำจัด ที่อยู่ใกล้กันมากเกินไป อัลกอริทึมของคุณจะทำงานออกไปข้างนอกในลักษณะดังกล่าวจนกว่าจะมีการเพิ่มจำนวนคะแนนที่ต้องการ (ซึ่งจะทำให้คุณมีจุดเมฆครึ้มแบบวงกลมโดยประมาณ) หรือเติมเต็มพื้นที่ว่าง

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


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