Làm cách nào để tôi có thể tìm thấy một bức tường ngăn cách hai hoặc nhiều điểm trên bản đồ dựa trên lưới?


8

Tôi đang cố gắng tạo ra những bức tường cắt đi một điểm nhất định từ những điểm đã cho khác. Hình ảnh đính kèm cho thấy loại điều tôi đang theo dõi:

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

  1. Màu xanh tách ra từ màu đỏ.
  2. Màu xanh tách ra từ Đỏ và Vàng.
  3. Màu xanh ngăn cách với màu đỏ với vật cản gạch.
  4. Nhiều màu xanh tách ra từ nhiều màu đỏ.

Bất kỳ ý tưởng làm thế nào để làm điều này?


1
Đây là một chút quá rộng ... bạn có muốn giảm thiểu màu xanh lam, hoặc có lẽ bạn muốn diện tích bằng nhau, hoặc có thể diện tích không quan trọng nhưng bạn muốn giảm thiểu chiều dài của bức tường, hoặc có lẽ tất cả những gì không liên quan và điều thực sự quan trọng là tìm ra giải pháp nhanh chóng ... vv
Theraot

1
Để cung cấp cho bạn hoặc những người khác, một hướng có thể âm thanh này có liên quan đến một biến thể của "manhattan distance voronoi" tùy thuộc vào giao diện bạn đang tìm kiếm hoặc chỉ là voronoi thông thường.
Sirisian

Đồng ý với cả hai ý kiến ​​khác, suy nghĩ đầu tiên của tôi là "có vô số giải pháp". Trong đó "vô hạn" có thể không vô hạn bằng cách lớn tùy ý. Không có hạn chế về những gì cho phép điều nàykhông phải điều này .
Draco18 không còn tin tưởng vào SE

Xin lỗi vì không nhận được cụ thể hơn. Thực sự, yêu cầu khắt khe duy nhất là bức tường ngăn cách các điểm đã cho, mà tôi nhận ra có các giải pháp gần như vô hạn. Những hình ảnh tôi cung cấp không thực sự có ý nghĩa như bất cứ điều gì sau đó là ý tưởng chung về những gì tôi đang cố gắng thực hiện, vì vậy chỉnh sửa của bạn, Draco, sẽ là một kết quả hoàn toàn hợp lệ cho mục đích của tôi. Tôi chỉ tìm kiếm các loại phương pháp sẽ tạo ra các loại kết quả đó, ngay cả khi có một số lượng lớn kết quả.
IanLarson

Câu trả lời:


8

Tôi sẽ trình bày một khái niệm chung và ba giải pháp sử dụng khái niệm đó.

Khái niệm là bản đồ Ảnh hưởng : Đối với mỗi vị trí trong bản đồ, bạn sẽ lưu trữ một số biểu thị khoảng cách đến từng điểm màu. Bằng cách đó, đối với mỗi vị trí bạn có thể truy vấn khoảng cách từ màu xanh, đỏ, xanh lục, v.v. Chúng tôi gọi kết quả là bản đồ ảnh hưởng.

Để biết thêm chi tiết về động lực, việc tạo và sử dụng bản đồ ảnh hưởng trong các trò chơi, hãy xem: Cơ chế của Bản đồ ảnh hưởng: Biểu diễn, Thuật toán & Thông số .

Tôi không biết bức tường này dùng để làm gì, kinh điển của tôi là chúng ta đang nói về một trò chơi chiến lược và AI đang quyết định nơi đặt các bức tường. Để làm điều đó, có rất nhiều cách tiếp cận bên cạnh việc trình bày ở đây. Một cách tiếp cận đơn giản sẽ là đặt các bức tường ở một khoảng cách cố định từ các điểm màu và kết hợp các khu vực khi chúng chồng lên nhau - và, tất nhiên, không xây dựng chúng qua các chướng ngại vật - ưu điểm của phương pháp này là nó đảm bảo rằng các bức tường không quá ở xa để gửi quân để bảo vệ họ và nó rất rẻ tính toán. Tôi giả sử bạn muốn một cái gì đó phức tạp hơn.

Giải pháp 1 :

Để tìm cách bọc màu xanh, hãy tìm sự khác biệt giữa khoảng cách đến màu xanh và với bất kỳ thứ gì khác, cho mỗi điểm. Phụ lục : Khu vực có độ chênh lệch dương là miền ảnh hưởng của màu xanh. Nếu bạn lấy các miền ảnh hưởng cho mọi điểm màu, bạn có thể xây dựng Biểu đồ Voronoi . Cảm ơn Sirisian đã đề cập đến họ .

Chúng ta có thể lập luận rằng đối với một điểm gần với màu xanh, sự khác biệt sẽ là dương và đối với một điểm gần với điểm màu khác, sự khác biệt sẽ là âm. Cho rằng khoảng cách là một hàm liên tục, theo định lý giá trị trung gian, chúng ta có thể lập luận rằng ít nhất một điểm ở giữa, sự khác biệt sẽ tiến đến 0. Một giải pháp sẽ là theo dõi một bức tường làm giảm tối thiểu khoảng cách giữa tất cả các viên gạch nơi chênh lệch tiến đến 0.

Dù giải pháp đó có tính đến những trở ngại hay không phụ thuộc vào chức năng khoảng cách. Nếu bạn chỉ sử dụng khoảng cách Manhattan hoặc Euclide mà không xem xét các đường dẫn có thể, thì bức tường kết quả sẽ không tận dụng các chướng ngại vật hiện có trong bản đồ.

Lưu ý: giải pháp này tiếp cận diện tích bằng nhau cho màu xanh và phần còn lại trong kịch bản phẳng.

Giải pháp 2 :

Tóm lại, bạn có thể tìm thấy các điểm sặc giữa khu vực ảnh hưởng của màu xanh và các điểm khác, sau đó đặt các bức tường ở đó. Làm điều này sẽ đặt các bức tường ở những nơi mà ảnh hưởng không ở trạng thái cân bằng (các bức tường cuối của tôi gần một bên) nhưng sẽ giảm thiểu chiều dài của các bức tường.

Một cách tiếp cận hữu ích để tìm các điểm sặc là chia kịch bản thành các nút lồi và tạo một mạng đại diện cho kịch bản. Bạn sẽ bắt đầu giả định rằng bạn sẽ đặt các bức tường xung quanh các nút trực tiếp có màu xanh lam, và sau đó bắt đầu tiến qua mạng (luôn tăng khoảng cách từ màu xanh) và xem xét chiều dài của bức tường nếu bạn đặt nó xung quanh những gì bạn đã tiến lên cho đến nay. Giải pháp của bạn là vị trí có chiều dài tối thiểu (và vị trí của các bức tường là các điểm sặc).

Trong thực tế, thuật toán phức tạp hơn một chút so với điều đó bởi vì có thể có sự phân nhánh trong kịch bản. Bạn chỉ cần xem xét mỗi phân nhánh một lần, và chọn vị trí tốt nhất cho bức tường cho phân nhánh đó.

Giải pháp 3 :

Giải pháp đầu tiên có vấn đề là nó có thể dẫn đến bức tường quá dài. Giải pháp thứ hai có vấn đề là nó có thể dẫn đến những bức tường quá xa màu xanh.

Lưu ý rằng làm việc với pixel, lát hoặc làm việc với mạng khái niệm bản đồ ảnh hưởng, vì việc thể hiện khoảng cách đến các điểm màu là hợp lệ và hữu ích. Vì vậy, có thể áp dụng giải pháp 1 qua mạng các nút lồi.

Giải pháp thứ ba của tôi là kết hợp các phương pháp trên. Khi bạn đang làm việc qua mạng, bạn có thể xem xét độ dài của tường và sự khác biệt về ảnh hưởng - và bất kỳ số liệu nào khác bạn muốn - như một chỉ số duy nhất có giá trị mà bạn có thể tối ưu hóa.


1
Điều này là siêu hữu ích. Sử dụng bản đồ ảnh hưởng nghe có vẻ chính xác như những gì tôi cần. Cảm ơn các liên kết và phản hồi chi tiết.
IanLarson
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.