Các hàm chi phí tìm đường dẫn A * có thể cho phép các đường dẫn theo hình dạng không?


7

Gần đây tôi bắt đầu phát triển một nguyên mẫu trò chơi có thể tạo ra các ngục tối được tạo theo thủ tục bằng cách sử dụng một bộ sưu tập các loại phòng. Để đảm bảo các lối đi ở hành lang giữa các phòng này sẽ luôn được kết nối, tôi đã triển khai thuật toán tìm đường dẫn A * theo bản đồ lát của các phòng được đặt ngẫu nhiên.

Tuy nhiên, vấn đề với việc này là tôi không nhất thiết phải cố gắng tìm con đường ngắn nhất giữa các phòng mà trong hầu hết các trường hợp sẽ là một đường chéo. Vì theo chủ đề là một 'ngục tối', tôi muốn chúng xoay và xoay ở góc 90 độ. Bằng cách sử dụng khoảng cách Manhattan cho heuristic, tôi đã xoay sở để có được hình dạng như mong muốn nhưng tôi đã kết thúc với một vấn đề cuối cùng mà tôi đến với những người tốt bụng để giúp tôi với :).

Mặc dù bây giờ sử dụng các góc 90 độ để di chuyển đường dẫn, nhưng nó tiết kiệm khi chạy đến cuối đường dẫn (Xem hình bên dưới). Điều này làm cho toàn bộ mọi thứ ở một khoảng cách cảm thấy chật chội ở những nơi thay vì sử dụng tất cả không gian một cách hiệu quả. Xem cách đơn giản thay đổi heuristic từ khoảng cách sang khoảng cách Manhattan đã tạo ra sự khác biệt cho câu hỏi của tôi, liệu có một hàm chi phí nào tôi có thể thực hiện để đưa ra kết quả mong muốn của con đường không thông thường này không? Bất kỳ câu trả lời sẽ được đánh giá cao, cảm ơn bạn.

Hình ảnh ví dụ

Ghi chú: Thuật toán cũng có quyền truy cập vào hướng thông thường của mục tiêu bắt đầu và kết thúc.


3
Bạn sẽ tăng cơ hội cho mọi người đọc câu hỏi của bạn bằng cách thêm các đoạn ngắt được đặt tốt.
Vaillancourt

Có bao giờ trở ngại con đường có thể cần phải đi xung quanh? Nếu không, bạn có thể bỏ qua A * hoàn toàn và xây dựng đường dẫn một cách hình học mà không cần tìm kiếm gia tăng. Điều đó sẽ cho phép kiểm soát rất miễn phí đối với các hình dạng kết quả.
DMGregory

Cách để thực hiện những gì DMGregory đang mô tả là sử dụng các hàm vẽ hình học và thay thế bất kỳ cuộc gọi nào đến some_putpixel (x, y) bằng map [x] [y] = SOME_TILE. Anh ta có một điểm công bằng, cùng một nhiệm vụ có thể được thực hiện ngay cả khi câu trả lời của tôi mô tả, bằng cách chia khoảng cách giữa hai vị trí cho hai và vẽ 3 dòng bằng thuật toán như thuật toán dòng Bresenhams.
Joshua Hedges

Câu trả lời:


3

Vấn đề của bạn là đơn giản, và như vậy giải pháp là quá. Về cơ bản, điều bạn muốn là bất cứ lúc nào A * của bạn kết nối hai phòng có cửa cách nhau 90 độ để duy trì tiêu chuẩn, khi các cửa kết nối hai phòng cách nhau 180 độ, hãy sử dụng thuật toán A * hai lần trong thế hệ pha, từ cánh cửa đến điểm giữa tách biệt (dĩ nhiên được làm tròn đến ô gần nhất) và từ ô đó sang cửa tiếp theo.


2

Thao tác với hàm chi phí gạch để sử dụng khoảng cách (khi con quạ bay) từ đầu đến đích, ngoài khoảng cách Manhattan. Thêm trọng số vào các nửa của hàm chi phí để bạn có thể ưu tiên khoảng cách Manhattan và tạo ra kết quả mong muốn với ít nỗ lực.

Trọng lượng nhỏ hơn bạn áp dụng cho khoảng cách quạ so với khoảng cách Manhattan, càng có nhiều khả năng khoảng cách Manhattan mong muốn sẽ chiếm. Nếu thuật toán hiện tại của bạn có lựa chọn 50/50, bạn muốn đưa ra quyết định chọn một viên gạch xa hơn từ phòng của bạn.


1

Tôi nghĩ rằng cách dễ nhất sẽ là thực hiện một hình phạt cho hành trình dài hơn một số tiền nhất định; giả sử, một nửa khoảng cách giữa hai điểm bạn đang cố gắng kết nối, làm tròn xuống đơn vị đo gần nhất mà bạn đang sử dụng (ô vuông?).

Một cách khó hơn sẽ là lấy giải pháp và chia nó thành từng mảnh; chẳng hạn, nếu giải pháp tăng 5, trên 5, bạn có thể chia nó thành 2, trên 5, lên 3. Vấn đề với giải pháp này là nó có thể không phải là đường dẫn hợp lệ - đề xuất đầu tiên của tôi là tốt hơn bởi vì bạn sửa đổi thuật toán để tìm một đường dẫn tốt hơn sẽ luôn hoạt động thay vì đi theo một đường dẫn và làm cho nó tốt hơn sao cho nó có thể không hoạt động.

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.