Satu catatan kecil: Anda mengatakan 'terlihat seperti peta kehidupan nyata dengan negara-negara yang bentuknya berbeda tetapi ukurannya sama), tetapi negara-negara' nyata 'sangat berbeda ukurannya bahkan di dalam wilayah tertentu - bahkan negara-negara' besar 'di Eropa dapat sangat bervariasi, misalnya dengan Perancis lebih dari dua kali lebih besar dari Italia. Dengan begitu, jelas ada wilayah permainan untuk mencoba dan mempertahankan ukuran kira-kira sama - hanya perlu diketahui bahwa sedikit variasi di sini mungkin bagus hal yang !
Pendekatan awal saya untuk masalah ini adalah untuk 'mengembangkan' (bukan 'menumbuhkan') wilayah Anda:
- Mulailah dengan beberapa pembagian konkret dari peta menjadi potongan-potongan berukuran kira-kira sama dengan garis lurus (misalnya, jika Anda ingin 6 negara, maka Anda dapat membagi peta menjadi tiga irisan horizontal, dan kemudian membagi masing-masing irisan 'di diagonal' menjadi dua bagian). Ini jelas mudah dilakukan secara terprogram, terutama karena tidak harus sangat tepat (pada kenyataannya, mungkin seharusnya tidak terlalu tepat).
- Lakukan operan awal pada divisi, membangun struktur data 'batas': seperangkat heks yang memiliki beberapa tetangga saat ini milik negara yang berbeda. Ini juga akan menjadi waktu yang tepat untuk menghitung berapa banyak heksa di setiap negara.
Sekarang, selama yang Anda inginkan, jalankan pseudocode berikut:
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;
}
Ini akan menjaga keseimbangan antara ukuran dua negara tetangga, dan cek 'terputus' (yang dapat dilakukan dengan algoritma pengisian banjir sederhana) memastikan bahwa tidak ada negara yang pernah terbelah menjadi beberapa bagian. Memperbarui daftar batas adalah operasi waktu konstan - hex yang diubah jelas akan selalu berada di batas, dan Anda bisa memeriksa enam tetangganya untuk melihat apakah ada di antara mereka yang telah menjadi sel batas (karena tetangganya sekarang ada di batas negara yang berbeda) atau berhenti menjadi sel batas (karena tetangganya ada di negara yang sama sekarang), memodifikasi batas yang ditetapkan sesuai kebutuhan.
Untuk penyempurnaan dari pendekatan ini, Anda bahkan dapat membuat kondisi hex mana yang berubah sedikit acak - daripada selalu 'menyeimbangkan' kedua negara, Anda selalu dapat membuat swap dengan probabilitas tertentu, dan bahkan secara bertahap mengurangi probabilitas itu lebih dari waktu (mirip dengan proses pendinginan dalam algoritma Annealing Simulatif ) untuk mulai memaksa mereka untuk ukuran yang kira-kira sama.
Perhatikan bahwa ini tidak akan menjamin bahwa semua area berukuran persis sama (yang tidak mungkin kecuali N tetap membagi ukuran grid Anda dengan sempurna), dan itu bahkan tidak akan menjamin bahwa semua negara berada dalam satu hex satu sama lain di area; itu harus menjamin (berjalan selama cukup iterasi) bahwa setiap negara tidak lebih dari satu hex lebih besar atau lebih kecil dari masing-masing tetangganya, meskipun.