Tạo ngẫu nhiên đồ thị có hướng trên lưới


11

Tôi đang cố gắng tạo ngẫu nhiên một đồ thị có hướng cho mục đích tạo ra một trò chơi giải đố tương tự như các câu đố trượt băng từ Pokemon.
Đây thực chất là những gì tôi muốn để có thể tạo ngẫu nhiên: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .

Tôi cần có thể giới hạn kích thước của biểu đồ theo kích thước x và y. Trong ví dụ được đưa ra trong liên kết, nó sẽ bị giới hạn ở lưới 8x4.
Vấn đề tôi gặp phải không phải là tạo ngẫu nhiên biểu đồ, mà là tạo ngẫu nhiên một biểu đồ, mà tôi có thể vạch ra một cách chính xác trong không gian 2d, vì tôi cần một cái gì đó (như một tảng đá) ở phía đối diện của một nút, để tạo ra nó trực quan có ý nghĩa khi bạn ngừng trượt. Vấn đề với điều này là đôi khi tảng đá kết thúc trong đường dẫn giữa hai nút khác hoặc có thể trên chính nút khác, khiến toàn bộ biểu đồ bị phá vỡ.

Sau khi thảo luận vấn đề với một vài người mà tôi biết, chúng tôi đã đưa ra một vài kết luận có thể dẫn đến một giải pháp.

  • Bao gồm các chướng ngại vật trong lưới như một phần của biểu đồ khi xây dựng nó.
  • Bắt đầu với một lưới đầy đủ và chỉ cần vẽ một đường dẫn ngẫu nhiên và xóa các khối sẽ làm cho đường dẫn đó hoạt động.

Sau đó, vấn đề sẽ chỉ ra những cái cần xóa để tránh đưa ra một con đường ngắn hơn, ngắn hơn. Chúng tôi cũng đã nghĩ rằng một thuật toán lập trình động có thể có ích, mặc dù không ai trong chúng tôi quá giỏi trong việc tạo ra các thuật toán lập trình động từ không có gì. Bất kỳ ý tưởng hoặc tài liệu tham khảo nào về vấn đề này được gọi chính thức (nếu đó là vấn đề đồ thị chính thức) sẽ hữu ích nhất.

Dưới đây là một số ví dụ về những gì tôi đã hoàn thành cho đến nay chỉ bằng cách đặt ngẫu nhiên các khối và tạo biểu đồ điều hướng từ điểm bắt đầu / kết thúc đã chọn. Ý tưởng (như được mô tả trong liên kết trước) là bạn bắt đầu tại S màu xanh lá cây và muốn đến màu xanh lá cây F. Bạn thực hiện điều này bằng cách di chuyển lên / xuống / trái / phải và bạn tiếp tục di chuyển theo hướng đã chọn cho đến khi bạn nhấn Tường. Trong những bức ảnh này, màu xám là một bức tường, màu trắng là sàn nhà và đường màu tím là chiều dài tối thiểu từ đầu đến cuối, và các đường màu đen và các chấm màu xám thể hiện các đường dẫn có thể.

Dưới đây là một số ví dụ xấu về biểu đồ được tạo ngẫu nhiên:

nhập mô tả hình ảnh ở đây

Dưới đây là một số ví dụ hay về biểu đồ được tạo ngẫu nhiên (hoặc điều chỉnh bằng tay):

nhập mô tả hình ảnh ở đây

Tôi dường như cũng nhận thấy những thử thách khó khăn hơn khi thực sự chơi trò này như một câu đố là những câu đố có rất nhiều nút độ cao dọc theo con đường tối thiểu.


1
Bạn có thể tạo ra một tập hợp đá hoàn toàn ngẫu nhiên, sau đó kiểm tra xem đồ thị tương ứng có giải pháp hay không, và nếu không, hãy ném nó đi và bắt đầu lại. Với lưới 8x4, điều này không thể mất nhiều thời gian. Tôi chắc chắn rằng có những giải pháp sạch hơn.
Công việc

Đây là cách tiếp cận đầu tiên của tôi nhưng tôi cần thực hiện nó ở quy mô lớn hơn một chút và buộc phải dường như mất một lúc và cố gắng tìm cách tiếp cận tốt hơn.
Talon876

Câu trả lời:


2
  • đó là băng, bạn sẽ di chuyển trừ khi bạn va vào đá.
  • cách duy nhất để đổi hướng là đánh một tảng đá.
  • nếu bạn va vào đá bạn phải đổi hướng.
  • chu kỳ là tốt, vì lý do rõ ràng.
  • có thể có nhiều bắt đầu, và nhiều kết thúc.

tài sản cao cấp hơn:

  • các tế bào không có đá liền kề không thể truy cập (một số có thể đi qua)
  • tường cũng là đá, nếu bạn loại bỏ chúng, bạn có thể quyết định bọc xung quanh.
  • bạn có thể sử dụng lưới con làm mẫu ("ốp lát" 3x3, 3x4, 5x5, ... vv)
  • bạn có thể chồng một ô MxN câu đố lên trên khu vực MxN không đi qua được và thêm một hòn đá để chuyển hướng vào / ra khỏi nó.
  • xoay hoặc đối xứng của gạch có thể thú vị
  • bạn có thể mở rộng ô bằng cách chèn các hàng / cột băng giá

thí dụ:

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

ví dụ về kết hợp gạch:

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

bạn có thể thích trò chơi Tsuro , nó sử dụng gạch để tạo một bảng ngẫu nhiên.


0

Có lẽ kỹ thuật đảo ngược có thể giúp bạn nếu bạn sẵn sàng cho điều đó.

Nếu có một và chỉ một giải pháp cho mỗi vấn đề, có lẽ bạn có thể tạo một biểu đồ dựa trên câu trả lời duy nhất. Điều này sẽ không yêu cầu bạn phải lập trình động hoặc thậm chí bỏ qua lực lượng vũ phu và lựa chọn cho một thế hệ có phương pháp.

Bạn có thể đi về nó bằng cách:

  1. Giữ đồ thị MxN sẵn sàng
  2. tạo một / nhiều giải pháp
  3. đặt câu hỏi xung quanh nó nếu nó là một vấn đề đơn lẻ
  4. nếu có nhiều giải pháp cho vấn đề, thì bạn có thể lặp lại quy trình trên theo cách để việc lặp hiện tại không ức chế giải pháp khác.

Mặc dù bạn sẽ cần thiết bị một cách theo mức độ phức tạp của vấn đề và quy mô vấn đề sẽ tạo ra câu hỏi này cho bạn. Đừng chỉ dùng vũ lực. Hãy thử một số thuật toán ngẫu nhiên thay thế. Điều này có thể giúp bạn.


Tôi biết rằng tôi sẽ hối hận khi bán lại cuốn sách đó vào năm ngoái, tôi nghĩ rằng một trong những người bạn của tôi đã có nó ở đâu đó. Bất kỳ thuật toán cụ thể trong đó mà tôi nên tìm kiếm? Hoặc chỉ cần nhìn qua tất cả các biểu đồ với một biểu đồ và xem liệu tôi có thể tìm thấy một biểu đồ có vẻ hữu ích không? Ồ và có một giải pháp tối ưu (tôi cho rằng có thể có một sự ràng buộc cho điều đó) và vô hạn các giải pháp khác vì bạn có thể chỉ cần qua lại giữa hai nút bất kỳ số lần nào và sau đó giải quyết nó.
Talon876

0

Làm thế nào về một cách tiếp cận khác? Bắt đầu với một mê cung trống rỗng và thêm các khối như thế này:

  1. Khối bắt đầu ngẫu nhiên và khối kết thúc.
  2. Thực hiện 1-3 bước "trượt" theo hướng ngẫu nhiên (nhưng không quay lại) và với độ dài ngẫu nhiên (*). Đặt một khối sau mỗi bước (để dừng slide).
  3. Tìm một con đường ngắn nhất để thoát. Nếu có quá ít phân đoạn (độ khó thấp), hãy lấy một đoạn ngẫu nhiên của đường dẫn và chia nó thành một khối. Nếu không, đặt một khối như trong bước 1 và thoát.
  4. Lặp lại 1 với sự thận trọng (*): khi bạn chọn độ dài của bước trượt, hãy làm cho nó để khối bạn đặt sẽ không đóng đường dẫn trước đó.

Liên lạc hoàn thiện: tìm tuyến đường ngắn nhất với thuật toán bạn cung cấp. Lưu ý tất cả các ô được sử dụng và bắt đầu lấp đầy phần còn lại một cách ngẫu nhiên, mỗi lần đảm bảo tuyến ngắn nhất không bị ngắn hơn.

Có một cảnh báo ở bước hai, khi bạn không thể đặt khối cuối cùng để nó không vượt qua các đường dẫn đã sử dụng, nhưng tôi thấy hai giải pháp cho việc này: di chuyển khối kết thúc sớm hơn hoặc hoàn tác một vài bước và thử lại một lần nữa.

Và một suy nghĩ khác về độ dài ngẫu nhiên của các bước trượt - bạn có thể muốn chọn nó để một khối được đặt trước đó được sử dụng lại, miễn là các đường dẫn không trùng nhau.


@ Talon876 Đây là một loại thuật toán ngẫu nhiên mà tôi đang nói đến.
c0da
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.