Một lưu ý nhỏ: bạn nói 'trông giống như một bản đồ đời thực với các quốc gia có hình dạng khác nhau nhưng kích thước bằng nhau), nhưng các quốc gia' thực 'có kích thước rất khác nhau ngay cả trong các khu vực nhất định - ngay cả các quốc gia' lớn 'ở Châu Âu cũng có thể thay đổi rất nhiều, ví dụ như Pháp lớn hơn gấp đôi so với Ý. Như đã nói, rõ ràng có các khu vực chơi trò chơi để thử và giữ kích thước gần như nhau - chỉ cần lưu ý rằng một chút thay đổi ở đây có lẽ là tốt điều !
Cách tiếp cận ban đầu của tôi đối với vấn đề sẽ là 'phát triển' (thay vì 'phát triển') các khu vực của bạn:
- Bắt đầu với một số phân chia cụ thể của bản đồ thành các đoạn có kích thước gần bằng nhau theo các đường thẳng (ví dụ: nếu bạn muốn 6 quốc gia, thì bạn có thể chia bản đồ thành ba lát ngang, sau đó chia từng lát đó 'trên đường chéo' thành hai mảnh). Điều này rõ ràng là dễ thực hiện theo chương trình, đặc biệt là vì nó không phải rất chính xác (trên thực tế, có lẽ không nên rất chính xác).
- Thực hiện một bước ban đầu trên bộ phận, xây dựng cấu trúc dữ liệu 'ranh giới': một tập hợp các hình lục giác có một số hàng xóm hiện đang thuộc về một quốc gia khác. Đây cũng sẽ là thời điểm tốt để kiểm đếm số lượng hình lục giác ở mỗi quốc gia.
Bây giờ, miễn là bạn muốn, hãy chạy mã giả sau:
Pick a random hex A from the boundary list;
Pick a random neighbor B of this hex from a different country;
if (A's country has more hexes than B's country has) {
change hex A to belong to B's country;
} else if (B's country has more hexes than A's country has) {
change hex B to belong to A's country;
} else {
flip a coin to decide which to change;
}
if ( the changed hex's old country has become disconnected ) {
undo and reject this move;
} else {
update the boundary list around the changed hex and its neighbors;
}
Điều này sẽ duy trì sự cân bằng thô giữa kích thước của bất kỳ hai quốc gia láng giềng nào và kiểm tra 'ngắt kết nối' (có thể được thực hiện bằng thuật toán lấp đầy đơn giản) đảm bảo rằng không có quốc gia nào bị vỡ thành từng mảnh. Cập nhật danh sách ranh giới là một hoạt động liên tục - hex đã thay đổi rõ ràng sẽ luôn ở trên ranh giới và bạn chỉ cần kiểm tra sáu hàng xóm của nó để xem liệu có bất kỳ trong số chúng đã trở thành một ô ranh giới không (vì giờ đây hàng xóm của nó đã ở một quốc gia khác) hoặc ngừng là một ô ranh giới (vì bây giờ là quốc gia láng giềng ở cùng một quốc gia), sửa đổi ranh giới được đặt khi cần thiết.
Để cải tiến phương pháp này, bạn thậm chí có thể đưa ra điều kiện hex sẽ thay đổi ngẫu nhiên một chút - thay vì luôn luôn 'cân bằng' hai quốc gia, bạn luôn có thể thực hiện trao đổi với một xác suất nhất định và thậm chí giảm dần xác suất đó thời gian (tương tự như quá trình làm mát trong thuật toán mô phỏng mô phỏng ) để bắt đầu buộc chúng có cùng kích thước.
Lưu ý rằng điều này sẽ không đảm bảo rằng tất cả các khu vực có cùng kích thước (điều này là không thể trừ khi N hoàn toàn phân chia kích thước lưới của bạn) và thậm chí sẽ không đảm bảo rằng tất cả các quốc gia nằm trong một khu vực của nhau; tuy nhiên, cần đảm bảo (chạy đủ số lần lặp) rằng mỗi quốc gia không lớn hơn một hex lớn hơn hoặc nhỏ hơn mỗi quốc gia láng giềng trực tiếp.