Comment partitionner un ensemble en un nombre donné de sous-ensembles disjoints soumis à certaines conditions?

11

On me donne un ensemble A{1,,k} , un entier sk et des entiers non négatifs aij . Mon problème est de trouver s sous - ensembles disjoints Sj de {1,,k} tel que:

  1. j=1sSj=A ; et
  2. |Sj|aij pour tous les iSj et j=1,,s .

Comment résoudre ce problème? Est-il difficile de trouver une solution réalisable?

Je pense qu'il n'est pas facile de résoudre le problème car j'ai essayé une procédure qui commence par certains j{1,,n} et assigne i{1,,k} jusqu'au nombre des i attribués à j sont supérieurs à aij pour certains i attribués. Mais ce n'est pas correct car je pourrais me retrouver avec des i qui ne pourraient être attribués à aucun j (à cause de leur aij qui pourrait ne pas être satisfait).

La méthode de la force brute, quand je dois générer tous les sous-ensembles de A et tester chacun, fonctionne pour moi ( k=8,n=3 ) mais très inefficace.

drzbir
la source
Vérifiez si la modification correspond à la question que vous souhaitez poser. De plus, d'où vient ? Est-ce une constante fixe (ne fait pas partie de l'entrée, mais est fixe pour toujours), ou fait-elle partie de l'entrée? Enfin, cherchez-vous une solution pratique? ou cherchez-vous la complexité théorique de ce problème? Si le premier, avez-vous essayé d'utiliser la programmation linéaire entière? amax
DW

Réponses:

10

Ce problème est NP-difficile par réduction de Vertex Cover.

Dans le problème de couverture de , on nous donne un graphique et un nombre , et notre tâche est de déterminer s'il existe un sous-ensemble d'au plus sommets de telle sorte que chaque bord de soit incident sur au moins un sommet en . (De manière équivalente: est-il possible de tuer chaque arête de en supprimant au plus sommets?)G=(V,E)rUrVEUGr

Premièrement, le partitionnement de en sous-ensembles disjoints équivaut à affecter à chaque élément de exactement l'un des labels possibles. L'idée de base de la réduction est de créer une étiquette pour chaque sommet dans , et de "n'autoriser" à affecter à chaque arête qu'une seule des deux étiquettes correspondant à ses extrémités, dans le sens suivant: attribuer à une arête un correspondant label n'introduit aucune contrainte (authentique) sur les autres bords auxquels la même étiquette peut être affectée, tandis que l'attribution d'un bord à une étiquette non correspondante empêche que tout autre bord se voit attribuer la même étiquette - ce qui a bien sûr pour effet d'augmenter le nombre d'étiquettes distinctes requises.AsAsSjvjV

Pour construire une instance de votre problème à partir d'une instance de Vertex Cover:(A,a,s)(G,r)

  1. Réglez surEt créer un élément dans pour chaque bord dans . (Ces paires peuvent être considérées comme les entiers ; toute bijection entre elles fera l'affaire.)k|E|(i,j)AvivjE1,,k
  2. Réglez sursi ou ; sinon, définissez sur 1.a(b,c),d|E|d=bd=ca(b,c),d
  3. Définissez .s=r

Si est une instance YES de Vertex Cover, alors il est facile de voir que l'instance juste construite de votre problème est également une instance YES: il suffit de choisir les étiquettes correspondant aux sommets dans n'importe quelle solution , et pour chaque arête affectez l'élément correspondant selon l'une des étiquettes ou été choisie (choisissez arbitrairement si les deux étiquettes ont été choisies). Cette solution utilise sous-ensembles et est valide car les seuls en vigueur sont ceux des correspondants(G,r)SjvjUvbvcE(b,c)ASbScsaijétiquettes, qui ont pour (non) effet d'empêcher plus debords étant affectés de la même étiquette.|E|

Il reste à montrer qu'une instance YES de votre problème implique que l'original est une instance YES de Vertex Cover. C'est un peu plus compliqué, car une solution valide à peut en général attribuer à un bord une étiquette non correspondante , c'est-à-dire , ce qui signifie que nous ne pouvons pas nécessairement « lire sur » une couverture de sommet valide à partir d' une solution valable .X=(A,a,s)(G,r)YX(i,j)Smm{i,j}UY

Cependant, l'attribution d'une étiquette non correspondante a un coût élevé qui limite considérablement la structure de la solution: chaque fois qu'une arête est affectée à une telle étiquette , avec , le fait qu'un assure qu'il doit être le seul bord affecté à cette étiquette. Ainsi, dans toute solution contenant un tel bord non étiqueté de manière correspondante , nous pourrions construire une solution alternative comme suit:(i,j)Smm{i,j}a(i,j),m=1Y(i,j)SmY

  1. Choisissez arbitrairement la nouvelle étiquette pour que soit ou .Sz(i,j)SiSj
  2. Attribuez cette nouvelle étiquette. Si cela aboutit à une solution invalide, ce doit être parce qu'exactement un autre bord , avait déjà reçu le label . Dans ce cas, définissez et passez à l'étape 1.(i,j)(i,j)z{i,j}Sz(i,j)=(i,j)

L'algorithme ci-dessus doit se terminer de deux manières: soit une nouvelle étiquette est trouvée qui n'introduit aucune contradiction, soit un cycle complet de sommets est trouvé. Dans le premier cas, une nouvelle solution valide avec ensembles est trouvée, tandis que dans le dernier cas, une nouvelle solution valide avec ensembles est trouvée; de toute façon, nous avons construit une nouvelle solution valide avec au moins un bord supplémentaire affecté à une étiquette correspondante . Après avoir répété tout ce processusfois, nous aurons produit une solution valide partir de laquelle une solution au problème Vertex Cover d'origine peut être lue.Szs1s|E|Y

Cette construction est clairement polynomiale, il s'ensuit que votre problème est NP-difficile.

j_random_hacker
la source
Merci de votre aide. Avez-vous une idée de comment résoudre (approximativement) ce problème? (Comme, par exemple, puis-je utiliser des techniques pour résoudre le problème de couverture de vertex?) J'ai essayé une approche gourmande mais, parfois, elle ne parvient pas à produire une solution réalisable. (La façon dont je choisis le fait l'approche gourmande là où une solution pourrait exister.)Sj
drzbir
Eh bien, on s'attend à ce qu'une approche gourmande échoue parfois à produire une solution réalisable, car si c'était toujours le cas, vous résoudriez un problème NP-difficile en poly-temps ;-) N'oubliez pas que ce n'est pas nécessairement faux s'il ne peut pas trouver une solution: il se pourrait bien qu'aucune solution réalisable n'existe.
j_random_hacker
En ce qui concerne les techniques de solution, celle que j'aime s'appelle la recherche de faisceau. Il s'agit essentiellement d'une sorte de branche et de borne qui «oublie» des solutions partielles suffisamment mauvaises pour limiter son utilisation de la mémoire. (B&B est en soi une très bonne approche, et résout parfois les problèmes rapidement, et c'est légèrement plus simple que la recherche par faisceau, donc ça vaut le coup - mais comme c'est une méthode exacte, cela peut bien sûr prendre des millénaires dans certains cas.)
j_random_hacker
(Tout ce qui suit s'applique également à la recherche de faisceaux ainsi qu'au B&B.) Le B&B est une technique très générale. L'essentiel avec cela est d'exploiter les spécificités du problème pour organiser les décisions que vous prenez afin que, autant que possible, les mauvaises décisions (c'est-à-dire les décisions qui ne conduisent pas à des solutions réalisables) soient prises tôt dans l'arbre de recherche. (Ces décisions seront prises quelque part , et chaque niveau plus profond auquel elles seront faites doublera le nombre de fois où elles seront prises.) Pour votre problème, je suggérerais d'abord de classer les éléments en par ordre décroissant de "méchanceté", où. ..A
j_random_hacker
... la gravité de l'élément pourrait être, par exemple, le minimum de sur tout , rompant les liens par le deuxième minimum, puis le troisième minimum, etc. En gros, le "pire" élément sera l'élément qui limite le plus sévèrement tout ensemble auquel il est ajouté. À chaque nœud à la profondeur de l'arborescence de recherche, vous aurez une solution partielle dans laquelle les premiers (et donc les «pires») éléments ont déjà été affectés à des ensembles; vous devrez choisir lequel des ensembles assigner le e élément: c'est-à-dire que vous aurez besoin de jusqu'à appels récursifs. ("Jusqu'à" parce que j'espère que nous avons, ...iaijjddn(d+1)n
j_random_hacker