Ini adalah masalah pewarnaan grafik .
Ingatlah bahwa pewarnaan grafik adalah penugasan warna ke simpul grafik sedemikian rupa sehingga tidak ada dua simpul yang berbagi tepi juga akan memiliki warna yang sama. Secara khusus, simpul (abstrak) grafik adalah poligon. Dua simpul terhubung dengan tepi (tidak terarah) setiap kali mereka berpotongan (sebagai poligon). Jika kita mengambil solusi untuk masalah ini - yang merupakan urutan dari (katakanlah k ) koleksi poligon yang terpisah - dan berikan warna yang unik untuk setiap koleksi dalam urutan, maka kita akan mendapatkan k -warna grafik. . Sangat diinginkan untuk menemukan k kecil .
Masalah ini cukup sulit dan tetap tidak terpecahkan untuk grafik yang berubah-ubah. Pertimbangkan solusi perkiraan yang mudah dikodekan. Algoritma berurutan harus dilakukan. Algoritme Welsh-Powell adalah solusi serakah berdasarkan pada urutan menurun dari titik demi titik. Diterjemahkan ke bahasa poligon asli, pertama-tama urutkan poligon dalam urutan jumlah poligon lain yang tumpang tindih. Agar berhasil, beri poligon pertama warna awal. Pada setiap langkah berturut-turut, cobalah untuk mewarnai poligon berikutnya dengan warna yang ada: yaitu, pilih warna yang tidaksudah digunakan oleh semua tetangga poligon itu. (Ada banyak cara untuk memilih di antara warna yang tersedia; coba salah satu yang paling sedikit digunakan atau pilih salah satu secara acak.) Jika poligon berikutnya tidak dapat diwarnai dengan warna yang ada, buat warna baru dan warnai dengan itu.
Setelah Anda mencapai pewarnaan dengan sejumlah kecil warna, lakukan zonalstats warna dengan warna: dengan konstruksi, Anda dijamin tidak akan memiliki dua poligon warna yang tumpang tindih.
Berikut kode contoh di R
. (Kode Python tidak akan jauh berbeda.) Pertama, kami menggambarkan tumpang tindih di antara tujuh poligon yang ditampilkan.
edges <- matrix(c(1,2, 2,3, 3,4, 4,5, 5,1, 2,6, 4,6, 4,7, 5,7, 1,7), ncol=2, byrow=TRUE)
Yaitu, poligon 1 dan 2 tumpang tindih, dan begitu juga poligon 2 dan 3, 3 dan 4, ..., 1 dan 7.
Urutkan simpul berdasarkan derajat menurun:
vertices <- unique(as.vector(edges))
neighbors <- function(i) union(edges[edges[, 1]==i,2], edges[edges[, 2]==i,1])
nbrhoods <- sapply(vertices, neighbors)
degrees <- sapply(nbrhoods, length)
v <- vertices[rev(order(degrees))]
Algoritma pewarnaan berurutan (kasar) menggunakan warna paling awal yang tersedia yang belum digunakan oleh poligon yang tumpang tindih:
color <- function(i) {
n <- neighbors(i)
candidate <- min(setdiff(1:color.next, colors[n]))
if (candidate==color.next) color.next <<- color.next+1
colors[i] <<- candidate
}
Inisialisasi struktur data ( colors
dan color.next
) dan terapkan algoritma:
colors <- rep(0, length(vertices))
color.next <- 1
temp <- sapply(v, color)
Bagi poligon menjadi kelompok-kelompok sesuai dengan warna:
split(vertices, colors)
Output dalam contoh ini menggunakan empat warna:
$`1`
[1] 2 4
$`2`
[1] 3 6 7
$`3`
[1] 5
$`4`
[1] 1
Ini telah mempartisi poligon menjadi empat kelompok yang tidak tumpang tindih. Dalam hal ini solusinya tidak optimal ({{3,6,5}, {2,4}, {1,7}} adalah tiga warna untuk grafik ini). Secara umum solusi yang didapat seharusnya tidak terlalu buruk.