Cobertura de grade por retângulos

15

Temos uma grade . Nós temos uma coleção de retângulos nessa grade, cada retângulo pode ser representado como um -by- binário matriz . Queremos cobrir a grade com esses retângulos.N1×N2N1N2R

A versão de decisão deste conjunto cobre o problema NP-complete?

  • Entrada: coleçãoC={R1,R2,,RL} de retângulos na grade (tamanho da entrada: N1N2L ) e KN+
  • Saída: Subconjunto SC com |S|K e S contendo para cada célula pelo menos um retângulo que a cobre.

Exemplo visual do problema

Descobri que o caso 1D ( N2=1 ) pode ser resolvido em tempo polinomial por meio de programação dinâmica: qualquer cobertura ideal será a união de

  • uma cobertura ideal para alguns subproblemas de cobrir as primeiras células N1n1 .
  • um retângulo 1D, ou seja, um intervalo, cobrindo as n1 células restantes 1 .

Não acho que o DP possa funcionar para o problema 2D: para o problema 1D, você tem um subproblema N1 a ser resolvido, mas para o 2D você tem subproblemas (número de Nordeste) caminhos de rede na grade).(N1+N2N2)

Acho que o problema pode ser NP, mas não tenho certeza (embora pareça mais difícil que P), e não consegui encontrar uma redução polinomial de um problema NP-completo (3-SAT, Vertex Cover, ...)

Qualquer ajuda ou dica é bem-vinda.

Yann
fonte
3
Dica: procure uma redução do Vertex Cover, na qual criamos um por | V | grade de blocos, cada um dos quais é um bloco de 3 por 3 de elementos da matriz. Cada linha de blocos corresponde a uma aresta e conterá 2 blocos especialmente projetados, correspondentes aos seus vértices do ponto final. Para cada vértice, haverá uma altura- 3 | E | , retângulo largura-1 que passa pela coluna central da coluna de 3 por 3 blocos correspondentes a esse vértice. Como você pode forçar o total de qualquer cobertura k -vertex válida a custar exatamente | E | ( | V | + 3 )|E||V|3|E|k ? (Você vai precisar de outros retângulos.)|E|(|V|+3)+k
j_random_hacker
Eu acho que esse provavelmente é um exercício de lição de casa, então estou um pouco relutante em dizer muito mais do que isso por enquanto. A fórmula de custo que eu dei tem algumas pistas. Lembre-se de que você pode forçar pelo menos 1 dentre vários retângulos, tornando-os os únicos retângulos que cobrem algum elemento da matriz (o caso especial de 1 retângulo também é útil). FWIW, eu também tentei usar um -por- | V | primeiro, onde a escolha de um vértice corresponderia a "atravessar" uma linha e a coluna correspondente, mas não conseguia descobrir como forçar a i- ésima coluna a ser escolhida quando a i- ésima linha for escolhida ou vice-versa. |V||V|ii
Jrandom_hacker
Eu tive o mesmo problema com -por- | V | rede. Acho que vejo que tipo de solução você tem em mente (embora não tenha exatamente a mesma fórmula de custo), veja minha edição. A propósito, não é um exercício de lição de casa. É um problema combinatório que apareceu em um problema de engenharia da vida real. Resolvemos isso com o MIP, mas eu queria ter certeza de que o problema era NP (e não tinha solução polinomial). De qualquer forma, se você confirmar que a solução é válida, poderá colocar sua dica como resposta e eu a validarei (desde que encontrei a solução com a sua ajuda). |V||V|
Yann
11
Sim, isso é quase exatamente a redução que eu tinha em mente! :) Fiz seus retângulos "tipo 4" um pouco mais compridos em uma extremidade: onde os seus ocupam 2 células em um bloco, os meus ocupam todos os 3. Em vez dos retângulos especiais "tipo 3" para os blocos finais, eu uso a linha superior inteira como retângulos "tipo 2" para . Finalmente, tenho um retângulo que ocupa as células do centro esquerdo e inferior esquerdo de cada bloco final esquerdo (invertido horizontalmente para cada bloco final direito). Assim, você pode cobrir as 2 linhas inferiores de todos os blocos, incluindo e entre os blocos finais, usando um ou padrão. a<j<b|==|
Jrandom_hacker
11
Eu gosto do seu -por- 3 | V | ideia de redução. Com isso, diferente dos 3 | E | -por- 3 | V | redução, pode haver soluções de custo mínimo que não correspondam às coberturas de vértices - mas todas essas soluções podem ser transformadas em soluções de custo igual (no mínimo mínimo) usando o mesmo argumento do seu último marcador; um problema para a redução :)|E|3|V|3|E|3|V|
j_random_hacker

Respostas:

4

Graças à dica de j_random_hacker, encontrei uma solução para reduzir a cobertura de vértices ao problema de grade:

Nós fazemos um -por- | V | grade de 3 por 3 blocos, ou seja, um 3 | E | -por- 3 | V | grade, com vértices ordenados como colunas { v 1 , , v N 1 } e arestas ordenadas como linhas { e 1 , , e N 2 } . Vamos construir retângulos nesta grade (o desenho abaixo ajudará muito a entender os diferentes retângulos usados)|E||V|3|E|3|V|{v1 1,...,vN1 1}{e1 1,...,eN2}

insira a descrição da imagem aqui

Para cada vértice, criamos um retângulo do tipo 1, que cobre a coluna central da coluna de blocos correspondente a esse vértice, então temos retângulos do tipo 1.|V|

Cada bloco corresponde a um casal único , com e i = ( v a , v b ) para cada bloco, adicionamos um retângulo do tipo 2:(eEu,vj)eEu=(vuma,vb)

  • se ou b < j , este é um retângulo de 3 por 3 que cobre todo o bloco.j<umab<j
  • j=umaj=b
  • uma<j<b

|E||V|

(eEu,vuma)(eEu,vb)

  • (eEu,vuma)(eEu,vb)

2|E|

Agora, para cada aresta, construímos retângulos do tipo 4, entre os blocos finais, temos dois retângulos para a segunda linha:

  • Uma que vai da praça central do primeiro bloco à praça central esquerda do segundo bloco.
  • Uma que vai da praça central direita do primeiro bloco à praça central do segundo bloco.
  • E os mesmos dois retângulos para a terceira linha.

4|E|

Então agora, para cobrir a grade:

  • |E|(|V|+2)|V|+4|E|

Para cobrir, para uma determinada aresta, a parte entre os blocos finais da aresta ainda não cobertos (segunda e terceira linhas da linha de blocos), podemos usar:

  • o retângulo quatro do tipo 4.
  • um retângulo do tipo 1 e dois retângulos do tipo 4.

Observe que, em qualquer caso, precisamos de pelo menos dois retângulos do tipo 4.

|E|(|V|+4)+k

  • |E|(|V|+2)

  • |E|(|V|+4)+k|E|(|V|+4)+k

|E|(|V|+6)+|V|9|V||E|

|E|3|V||V|+4|E|3|E|+k

Yann
fonte