Một phương pháp tốt để tạo ngẫu nhiên các cạnh giữa các nút đồ thị là gì?


10

Tôi đang làm một trình tạo bản đồ ngẫu nhiên cho một trò chơi không gian 4X.

Mỗi nút trong trò chơi được đặt tại tọa độ ngẫu nhiên (x, y) trên lưới 2d. Một nút có thể có một hoặc nhiều cạnh hai hướng đến một nút khác (đại diện cho các lỗ sâu đục). Tất cả các nút phải có ít nhất một lỗ sâu và tất cả các nút phải thuộc cùng một biểu đồ.

Lý tưởng nhất là một lỗ giun không được vượt quá chiều dài tối đa và nếu có thể, các lỗ giun không nên giao nhau.

Việc thực hiện ngây thơ của tôi là lặp qua tất cả các nút và có liên kết nút đến 3 nút gần nhất. Tuy nhiên, tôi kết thúc với nhiều đồ thị phụ. Phương pháp tốt để tạo các cạnh cho các nút là gì?


Làm thế nào là các nút rải rác trong thiên hà? Ý tôi là tôi có thể cho rằng với mọi điểm (X, Y) trong thiên hà đều có một nút không? hoặc ít nhất là cho hầu hết trong số họ hay không?
Ali1S232

Không phải tất cả các tọa độ sẽ có một nút. Khoảng 40% tôi sẽ nói.
Extrakun

Câu trả lời:


9

Đây là một câu trả lời tốt cho một câu hỏi tương tự.

Trước tiên, tạo một biểu đồ được kết nối, có thể sử dụng cây bao trùm tối thiểu như trong liên kết ở trên. Ông đề nghị sử dụng trọng số cạnh ngẫu nhiên để làm cho cây "tối thiểu" ngẫu nhiên. Sau đó, bạn có thể ngẫu nhiên thêm nhiều cạnh để nó không chỉ là cây tối thiểu. Làm thế nào chính xác bạn thêm các cạnh ngẫu nhiên phụ thuộc vào loại biểu đồ bạn muốn.


Trong thực tế, nếu vấn đề chỉ là đảm bảo tất cả các nút thuộc cùng một biểu đồ, bạn có thể sử dụng phương pháp tạo ngẫu nhiên hiện tại (hoặc bất kỳ phương thức nào khác) và áp dụng thuật toán của Prim lên trên nó. Nếu bạn muốn thực hiện các thay đổi tối thiểu cho biểu đồ chỉ để đảm bảo các sơ đồ con được kết nối, bạn có thể đặt chi phí cạnh thành 0 cho các cạnh đã có.


+1 vì đó là một câu trả lời rất hay nhưng tôi chỉ không thích loại thế hệ này nên tôi sẽ suy nghĩ về một thuật toán tốt hơn trong vài ngày tới!
Ali1S 232

Vâng, không có câu trả lời "đúng" cho vấn đề này, tôi quan tâm để xem những gì người khác nghĩ ra.
Philip

Offtopic, nhưng tôi cũng sẽ liên kết với câu trả lời của tôi! : p
r2d2rigo

Bằng cách này tôi nhận được điểm cho nó, ha!
Philip

7

Các hạn chế chính của vấn đề của bạn là gấp đôi: tạo biểu đồ 1 kết nối; và tạo ra nó với các kết nối gần. Câu trả lời của Philip, trong khi hơi có giá trị, không giải quyết được tất cả các ràng buộc của vấn đề của bạn

Lý tưởng nhất là một lỗ giun không được vượt quá chiều dài tối đa và nếu có thể, các lỗ giun không nên giao nhau.

Khi bạn kết nối một cách ngây thơ các điểm trong một đám mây, bạn sẽ gặp rủi ro (và ở mức cao, tại đó) các điều kiện này không được đáp ứng.

Vì vậy, bạn thấy, vấn đề không phải là một trong những kết nối như là một sự gần gũi trên các kết nối đó. Việc kết nối mọi nút trong biểu đồ với mọi nút khác là chuyện nhỏ, nhưng chỉ kết nối với các nút gần nhất trong khi duy trì kết nối 1 của biểu đồ tổng thể thì khó hơn một chút.

Đây là những gì một tam giác Delaunay tạo ra, trong n chiều. Lý do đầu tiên để sử dụng tam giác Delaunay là nó hoàn thành cả hai điều này. Lý do thứ hai là việc làm ngược lại từ biểu đồ như vậy dễ dàng hơn nhiều (trừ các cạnh và đỉnh bạn không muốn), hơn là cố gắng tạo nó theo những cách khác.

  1. Tạo ngẫu nhiên đám mây điểm đầy đủ của bạn.
  2. Delaunay-tam giác nó.
  3. Xây dựng biểu đồ (kết nối các điểm). Trong trường hợp này, trước tiên bạn có thể tạo toàn bộ biểu đồ (mọi ngôi sao) và sau đó lấy biểu đồ làm vị thành niên đại diện cho các vùng được kết nối với lỗ sâu của bạn, khi thực hiện bước 4. Ngoài ra, bạn có thể làm việc theo cách khác, chỉ tạo các vùng được kết nối với lỗ sâu đầu tiên là các nút siêu âm, và sau đó trong giai đoạn thứ hai, tạo ra các ngôi sao riêng lẻ trong các khối giới hạn của các vùng đó (đối với các nút này tôi sẽ lấy biểu đồ kép của tam giác Delaunay - biểu đồ Voronoi theo 3 chiều) dưới dạng sơ đồ. Bây giờ bạn có các cụm sao được kết nối gần đúng và tất cả các cụm được kết nối bằng các lỗ sâu hiếm hơn: cấu trúc liên kết và địa hình của bạn có ý nghĩa với người chơi.
  4. Áp dụng các phương pháp thông minh để định hình các siêu đồ thị và đồ thị con, tùy thuộc vào cách bạn đã chọn để xử lý nó trong bước 3.

Điều quan trọng là phải thấy rằng đây là một quá trình phân cấp. Cấp độ đầu tiên liên quan đến kết nối wormhole; giao dịch thứ hai với khoảng cách có lẽ có thể đi qua bằng cách sử dụng một ổ đĩa tiêu chuẩn. Bạn có thể áp dụng Delaunay ở một hoặc cả hai cấp để đáp ứng các ràng buộc của bạn.

Làm điều này hoàn toàn theo cấu trúc liên kết sẽ khiến bạn có các lỗ sâu không có ý nghĩa, vì chúng có thể kết nối một bên của thiên hà với một bên khác, mặc dù có mật độ cao của các ngôi sao (và thậm chí có thể rơi trên tuyến đường trực tiếp của lỗ giun). Cấu trúc không phải là địa hình; cái sau là một sự cân nhắc hơn và trước cái trước. Bạn quan tâm đến sự gần gũi và do đó địa hình.


Hình tam giác Delaunay là một ý tưởng tốt, nhưng nó không tạo ra các cạnh ngẫu nhiên. Bạn có thể xóa các cạnh ngẫu nhiên khỏi các cạnh được tạo bởi tam giác Delaunay, nhưng sau đó bạn sẽ có nguy cơ bị các biểu đồ riêng biệt một lần nữa ...
bummzack

@Bummzack "Nó không tạo ra các cạnh ngẫu nhiên". Bạn đã bao giờ nghe nói về trẻ vị thành niên? Khi bạn đã giải quyết được các ràng buộc khó khăn hơn bằng Delaunay, việc thực hiện các bổ sung hoặc xóa trên biểu đồ đó là điều không quan trọng.
Kỹ sư

@Bummzack, tôi vừa cập nhật lại - cảm ơn vì đã phản hồi.
Kỹ sư
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.