Este é um problema de coloração gráfica .
Lembre-se de que a coloração de um gráfico é uma atribuição de uma cor aos vértices de um gráfico, de modo que nenhum dois vértices que compartilham uma aresta também tenham a mesma cor. Especificamente, os vértices (abstratos) do gráfico são os polígonos. Dois vértices são conectados a uma aresta (não direcionada) sempre que se cruzam (como polígonos). Se tomarmos alguma solução para o problema - que é uma sequência de (digamos, k ) coleções separadas dos polígonos - e atribuirmos uma cor única a cada coleção da sequência, obteremos uma coloração k do gráfico . É desejável encontrar um pequeno k .
Esse problema é bastante difícil e permanece sem solução para gráficos arbitrários. Considere uma solução aproximada que seja simples de codificar. Um algoritmo seqüencial deve fazer. O algoritmo de Galês-Powell é uma solução gananciosa baseada em uma ordem decrescente dos vértices por grau. Traduzido para o idioma dos polígonos originais, primeiro classifique os polígonos em ordem decrescente do número de outros polígonos sobrepostos. Trabalhando em ordem, dê ao primeiro polígono uma cor inicial. Em cada etapa sucessiva, tente colorir o próximo polígono com uma cor existente: ou seja, escolha uma cor que não sejajá usado por qualquer um dos vizinhos desse polígono. (Existem várias maneiras de escolher entre as cores disponíveis; tente a que foi menos usada ou escolha uma aleatoriamente.) Se o próximo polígono não puder ser colorido com uma cor existente, crie uma nova cor e pinte-a com ela.
Depois de obter uma coloração com um pequeno número de cores, execute as estatísticas zonais cor por cor: por construção, você garante que nenhum polígono de uma determinada cor se sobreponha.
Aqui está um exemplo de código R
. (O código Python não seria muito diferente.) Primeiro, descrevemos sobreposições entre os sete polígonos mostrados.
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)
Ou seja, os polígonos 1 e 2 se sobrepõem, e os polígonos 2 e 3, 3 e 4, ..., 1 e 7.
Classifique os vértices por grau descendente:
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))]
Um algoritmo de coloração sequencial (bruto) usa a cor disponível mais antiga ainda não usada por qualquer polígono sobreposto:
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
}
Inicialize as estruturas de dados ( colors
e color.next
) e aplique o algoritmo:
colors <- rep(0, length(vertices))
color.next <- 1
temp <- sapply(v, color)
Divida os polígonos em grupos de acordo com a cor:
split(vertices, colors)
A saída neste exemplo usa quatro cores:
$`1`
[1] 2 4
$`2`
[1] 3 6 7
$`3`
[1] 5
$`4`
[1] 1
Ele particionou os polígonos em quatro grupos não sobrepostos. Nesse caso, a solução não é ótima ({{3,6,5}, {2,4}, {1,7}} são três cores para este gráfico). Em geral, a solução que obtém não deve ser tão ruim assim.