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.