Nous avons une grille . Nous avons une collection de rectangles sur cette grille, chaque rectangle peut être représenté en tant que -by- matrice binaire . Nous voulons couvrir la grille avec ces rectangles.
La version de décision de cet ensemble de problèmes de couverture NP-complète?
- Entrée: Collection de rectangles sur la grille (taille d'entrée: ), et
- Sortie: sous-ensemble avec | S | ≤ K et S contenant pour chaque cellule au moins un rectangle la recouvrant.
J'ai trouvé que le cas 1D ( ) peut être résolu en temps polynomial par programmation dynamique: toute couverture optimale va être l'union de
- une couverture optimale pour certains sous-problèmes de couverture des premières cellules .
- un rectangle 1D, c'est-à-dire un intervalle, couvrant les cellules restantes .
Je ne pense pas cependant que DP puisse fonctionner pour le problème 2D: pour le problème 1D, vous avez un sous-problème à résoudre, mais pour 2D vous avez ( N 1 + N 2sous-problèmes (nombre de trajets du réseau Nord-Est sur la grille).
Je pense que le problème pourrait être NP, mais je ne suis pas sûr (bien qu'il semble plus difficile que P), et je n'ai pas réussi à trouver une réduction polynomiale d'un problème NP-complet (3-SAT, Vertex Cover, ...)
Toute aide ou indice est le bienvenu.
|=
=|
Réponses:
Grâce à l'indice de j_random_hacker, j'ai trouvé une solution pour réduire la couverture de sommet au problème de grille:
Nous faisons un -par- | V | grille de blocs 3 par 3, soit un 3 | E | -par- 3 | V | grille, avec des sommets classés en colonnes { v 1 , … , v N 1 } et des bords classés en lignes { e 1 , … , e| E| | V| 3 | E| 3 | V| { v1, … , VN1} . Nous allons construire des rectangles sur cette grille (le dessin ci-dessous aidera beaucoup à comprendre les différents rectangles utilisés){ e1, … , EN2}
Chaque bloc correspond à un couple unique , avec e i = ( v a( eje, vj) eje= ( vune,vb)
Nous avons2 | E|
Maintenant, pour chaque arête, nous construisons des rectangles de type 4, entre les blocs d'extrémité, nous avons deux rectangles pour la deuxième ligne:
Alors maintenant, pour couvrir la grille:
Pour recouvrir, pour un bord donné, la partie entre les blocs d'extrémité de bord non encore recouverte (deuxième et troisième rangées de la rangée de blocs), on peut soit utiliser:
Notez que dans tous les cas, nous avons besoin d'au moins deux rectangles de type 4.
la source