Đây là một vấn đề màu đồ thị .
Hãy nhớ lại rằng tô màu đồ thị là sự gán màu cho các đỉnh của đồ thị theo cách mà không có hai đỉnh nào có chung một cạnh cũng sẽ có cùng màu. Cụ thể, các đỉnh (trừu tượng) của đồ thị là các đa giác. Hai đỉnh được kết nối với một cạnh (không bị chặn) bất cứ khi nào chúng giao nhau (dưới dạng đa giác). Nếu chúng ta lấy bất kỳ giải pháp cho vấn đề - đó là một chuỗi các (nói k ) bộ sưu tập rời nhau của đa giác - và chỉ định một màu duy nhất cho mỗi bộ sưu tập trong chuỗi, sau đó chúng tôi sẽ có được một k -coloring của đồ thị . Đó là mong muốn để tìm một k nhỏ .
Vấn đề này là khá khó khăn và vẫn chưa được giải quyết cho các biểu đồ tùy ý. Hãy xem xét một giải pháp gần đúng mà đơn giản để viết mã. Một thuật toán tuần tự nên làm. Thuật toán Welsh-Powell là một giải pháp tham lam dựa trên thứ tự giảm dần của các đỉnh theo mức độ. Được dịch sang ngôn ngữ của đa giác gốc, đầu tiên sắp xếp các đa giác theo thứ tự giảm dần của số lượng đa giác khác mà chúng trùng nhau. Làm việc theo thứ tự, cung cấp cho đa giác đầu tiên một màu ban đầu. Trong mỗi bước tiếp theo, hãy thử tô màu cho đa giác tiếp theo bằng một màu hiện có: đó là chọn một màu khôngđã được sử dụng bởi bất kỳ hàng xóm của đa giác đó. .
Khi bạn đã đạt được màu với một số lượng nhỏ màu, hãy thực hiện màu zonalstats theo màu: bằng cách xây dựng, bạn được đảm bảo rằng không có hai đa giác của một màu trùng nhau.
Đây là mã mẫu trong R
. (Mã Python sẽ không khác nhiều.) Đầu tiên, chúng tôi mô tả sự chồng chéo giữa bảy đa giác được hiển thị.
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)
Đó là, đa giác 1 và 2 trùng nhau, và đa giác 2 và 3, 3 và 4, ..., 1 và 7 cũng vậy.
Sắp xếp các đỉnh theo mức độ giảm dần:
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))]
Thuật toán tô màu tuần tự (thô) sử dụng màu có sẵn sớm nhất chưa được sử dụng bởi bất kỳ đa giác chồng chéo nào:
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
}
Khởi tạo cấu trúc dữ liệu ( colors
và color.next
) và áp dụng thuật toán:
colors <- rep(0, length(vertices))
color.next <- 1
temp <- sapply(v, color)
Chia đa giác thành các nhóm theo màu:
split(vertices, colors)
Đầu ra trong ví dụ này sử dụng bốn màu:
$`1`
[1] 2 4
$`2`
[1] 3 6 7
$`3`
[1] 5
$`4`
[1] 1
Nó đã phân vùng các đa giác thành bốn nhóm không chồng chéo. Trong trường hợp này, giải pháp không tối ưu ({{3,6,5}, {2,4}, {1,7}} là ba màu cho biểu đồ này). Nói chung, giải pháp không nên quá tệ.