Griglia di copertura di rettangoli


15

Abbiamo una griglia . Abbiamo una collezione di rettangoli questa griglia, ogni rettangolo può essere rappresentato come un N 1 -by- N 2 matrice binaria R . Vogliamo coprire la griglia con quei rettangoli.N1×N2N1N2R

La versione decisionale di questo set copre il problema NP-complete?

  • Input: Collection di rettangoli sulla griglia (dimensione input: N 1 N 2 L ) e K N +C={R1,R2,,RL}N1N2LKN+
  • Uscita: sottoinsieme con | S | K e SSC|S|KS contenenti per ogni cella almeno un rettangolo che lo copre.

Esempio visivo del problema

Ho scoperto che il caso 1D ( ) può essere risolto in tempo polinomiale mediante la programmazione dinamica: qualsiasi copertura ottimale sarà l'unione diN2=1

  • una copertura ottimale per alcuni sottoproblemi relativi alla copertura delle prime celle.N1n1
  • un rettangolo 1D, ovvero un intervallo, che copre le restanti celle.n1

Non credo tuttavia che DP possa funzionare per il problema 2D: per il problema 1D, hai un sottoproblema da risolvere, ma per 2D hai ( N 1 +N1 sottoproblemi (numero di percorsi reticolari nord-est sulla griglia).(N1+N2N2)

Penso che il problema potrebbe essere NP, ma non sono sicuro (anche se sembra più difficile di P) e non sono riuscito a trovare una riduzione polinomiale da un problema NP completo (3-SAT, Vertex Cover, ...)

Qualsiasi aiuto o suggerimento è il benvenuto.


3
Suggerimento: cerca una riduzione da Vertex Cover, in cui creiamo un di | V | griglia di blocchi, ognuno dei quali è un blocco 3 per 3 di elementi matrice. Ogni fila di blocchi corrisponde a un bordo e conterrà 2 blocchi appositamente progettati corrispondenti ai suoi vertici del punto finale. Per ogni vertice ci sarà un'altezza 3 | E | , rettangolo larghezza-1 che passa attraverso la colonna centrale della colonna di blocchi 3 per 3 corrispondenti a quel vertice. In che modo è possibile forzare il totale di qualsiasi copertura k -vertex valida al costo esatto | E | ( | V | + 3 )|E||V|3|E|k|E|(|V|+3)+k ? (Avrai bisogno di altri rettangoli.)
j_random_hacker l'

Penso che questo sia probabilmente un esercizio di compiti a casa, quindi sono un po 'riluttante a dire molto di più per ora. La formula di costo che ho dato contiene alcuni indizi. Tieni presente che puoi forzare almeno 1 di diversi rettangoli rendendoli gli unici rettangoli che coprono alcuni elementi della matrice (è utile anche il caso speciale di 1 rettangolo). FWIW, ho anche provato a usare un -by- | V | prima la griglia, in cui la scelta di un vertice corrisponderebbe al "barrare" una riga e la colonna corrispondente, ma non è riuscito a capire come forzare la scelta della I -colonna quando viene scelta la I -riga o viceversa. |V||V|ii
j_random_hacker l'

Ho avuto lo stesso problema con -by- | V | griglia. Penso di vedere che tipo di soluzione hai in mente (non ho esattamente la stessa formula di costo), vedi la mia modifica. A proposito, non è un esercizio di compiti a casa. È un problema combinatorio che è apparso in un vero problema di ingegneria della vita. Lo risolviamo con MIP, ma volevo essere sicuro che il problema fosse NP (e non aveva una soluzione polinomiale). In ogni caso, se confermi che la soluzione è valida, puoi dare il tuo suggerimento come risposta e io lo convaliderò (poiché ho trovato la soluzione con il tuo aiuto). |V||V|
Yann,

1
Sì, è quasi esattamente la riduzione che avevo in mente! :) Ho reso i tuoi rettangoli di "tipo 4" leggermente più lunghi a un'estremità: dove i tuoi occupano 2 celle all'interno di un blocco, i miei occupano tutti 3. Invece di speciali rettangoli di "tipo 3" per gli endblock, uso l'intera riga superiore, solo come i rettangoli di "tipo 2" per . Alla fine ho un rettangolo che occupa le celle al centro-sinistra e in basso a sinistra all'interno di ciascun blocco di sinistra (girato orizzontalmente per ogni blocco di destra). In questo modo puoi coprire le 2 file inferiori di tutti i blocchi inclusi e tra i blocchi finali usando un o . a<j<b|==|
j_random_hacker,

1
Mi piace il tuo -by- 3 | V | idea di riduzione. Con questo, a differenza del 3 | E | -by- 3 | V | riduzione, ci possono essere soluzioni a costo minimo che non corrispondono alle coperture dei vertici - ma tutte queste soluzioni possono essere trasformate in soluzioni a basso costo (almeno minimo) usando lo stesso argomento dell'ultimo punto elenco, quindi non lo è un problema per la riduzione :)|E|3|V|3|E|3|V|
j_random_hacker il

Risposte:


4

Grazie al suggerimento di j_random_hacker, ho trovato una soluzione per ridurre la copertura dei vertici al problema di rete:

Facciamo un -by- | V | griglia di blocchi 3 per 3, ovvero un 3 | E | -by- 3 | V | griglia, con vertici ordinati come colonne { v 1 , ... , v N 1 } e bordi ordinati come righe { e 1 , ... , e N 2 } . Costruiremo rettangoli su questa griglia (il disegno seguente aiuterà molto a comprendere i diversi rettangoli utilizzati)|E||V|3|E|3|V|{v1,,vN1}{e1,,eN2}

enter image description here

Per ogni vertice, creiamo un rettangolo di tipo 1, che copre la colonna centrale della colonna di blocchi corrispondente a quel vertice, quindi abbiamo rettangoli di tipo 1.|V|

Ogni blocco corrisponde a una coppia unica , con e i = ( v a , v b ) per ogni blocco aggiungiamo un rettangolo di tipo 2:(ei,vj)ei=(va,vb)

  • se o b < j , questo è un rettangolo 3 per 3 che copre l'intero blocco.j<ab<j
  • se (resp. j = b ), si tratta di un rettangolo 3 per 1 che copre la colonna sinistra (resp. destra) del blocco.j=aj=b
  • se , si tratta di un rettangolo 1 per 3 che copre la riga superiore del blocco.a<j<b

Quindi abbiamo rettangoli di tipo 2, questi rettangoli saranno obbligatori da scegliere, in quanto ognuno sarà l'unica copertura per l'angolo in alto a sinistra (o in alto a destra) del blocco in cui si trova.|E||V|

(ei,va)(ei,vb)

  • (ei,va)(ei,vb)

2|E|

Ora, per ogni bordo costruiamo rettangoli di tipo 4, tra i blocchi finali, abbiamo due rettangoli per la seconda riga:

  • Uno che va dalla piazza centrale del primo blocco alla piazza centrale-sinistra del secondo blocco.
  • Uno che va dalla piazza centrale destra del primo blocco alla piazza centrale del secondo blocco.
  • E gli stessi due rettangoli per la terza fila.

4|E|

Quindi ora, per coprire la griglia:

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

Per coprire, per un dato bordo, la parte tra i blocchi di estremità del bordo non ancora coperta (seconda e terza fila della fila di blocchi), possiamo usare:

  • i quattro rettangoli di tipo 4.
  • un rettangolo di tipo 1 e due rettangoli di tipo 4.

Si noti che in ogni caso, abbiamo bisogno di almeno due rettangoli di tipo 4.

Quindi qui la funzione di costo sarà: |E|(|V|+4)+K

  • Se la loro è una copertura di vertici valida con meno di k vertici: usiamo il |E|(|V|+2)rettangoli obbligatori, quindi per i rettangoli opzionali, possiamo usare i rettangoli di tipo 1 corrispondenti alla copertura del vertice e per ogni riga, abbiamo bisogno solo di 2 rettangoli di tipo 4 (abbiamo già un rettangolo di tipo 1). Quindi, se il grafico ha una copertura vertice valida, la griglia ha una copertura set valida.

  • Se disponiamo di una copertura set valida per la griglia (con meno di |E|(|V|+4)+K) rettangoli, quindi per ogni bordo o abbiamo già un rettangolo di tipo 1 (e il bordo è "coperto") o quattro rettangoli di tipo 4, nel qual caso, possiamo sostituirne due con un rettangolo di tipo 1, e abbiamo ancora una copertura valida con |E|(|V|+4)+Krettangoli. Seguendo questo processo, raggiungiamo una soluzione valida senza riga utilizzando quattro rettangoli di tipo 4, da cui è possibile ottenere una copertura dei vertici valida.

Quindi la copertura del vertice può essere ridotta alla copertura della griglia. E l'istanza del problema alla griglia può essere codificata da|E|(|V|+6)+|V| copre su una griglia con 9|V||E| elementi, quindi la riduzione è polinomiale e il problema alla griglia è NPC.

PS: Ho notato dopo aver scritto questa risposta che molti rettangoli sono in realtà inutili e una riduzione molto più semplice può essere fatta usando un |E|-di-3|V| griglia con |V|+4|E| copertine, utilizzando la funzione di costo 3|E|+K

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.