Comment minimiser la cardinalité d'un ensemble et de partitions disjointes soumises à des contraintes en temps polynomial?

8

Le vrai problème auquel je suis confronté est le suivant.

INSTANCE : j'ai des ensemblesN:={1,,n} et K:={1,,k} et matrice aij>0 pour tous iK et jN.

QUESTION : J'ai besoin de trouver un sous-ensembleS de N de taille aussi petite que possible et partitionner l'ensemble K dans |S| ensembles disjoints Kj dont l'union est égale K de telle sorte que pour tous jS, J'ai

jSjjaijaij1,
pour tout .iKj

Exemple:

Soit et la matrice n=k=3

[0.62.71.21.32.60.81.50.40.6].

Dans cet exemple, doit être égal à et K_1 = \ {3 \} et K_2 = \ {1,2 \} .SS={1,2}K1={3}K2={1,2}

J'ai remarqué deux faits:

  • S'il existe des jN tels que aij1 pour tout iK alors S={j} et Kj=K ; et
  • S'il existe des iK tels que aij<1 alors S= .

Ma question : est-il possible de résoudre ce problème d'optimisation en temps polynomial (au moins avec l'algorithme d'approximation)?

La première chose que j'ai essayé de faire est de le transformer en un problème connu, puis d'appliquer un algorithme connu pour cela. J'ai pensé à le transformer en un ensemble de couvertures ou d' emballages mais j'ai échoué et je ne pense pas non plus que ce soit intéressant.


Le problème que j'ai essayé de formuler.

Je ensembles et et la matrice pour tout et . De plus, j'ai ensembles disjoints pour chaque , (j'ai ajouté en entrée car je ne pouvais pas le formuler autrement.)N:={1,,n}K:={1,,k}aij>0iKjNnKjKjNKj

Enfin, j'obtiens ceci:

minimizeS|S|subject tojSjjaijaij1,jS,iKj,SN.

Merci.

drzbir
la source
Avez-vous essayé de reformuler en tant qu'ILP en utilisant des variables binaires ? Votre objectif passe à min avec une modification similaire dans la contrainte. Un solveur ILP standard peut très bien le gérer. xjxj
Nicholas Mancuso
Mais je pense que cela ne me donnerait pas un algorithme de temps polynomial?
drzbir
Peut-être en théorie, mais pas en pratique. Les solveurs modernes comme CPLEX sont incroyablement bons pour trouver des solutions optimales en un temps relativement court grâce à l'heuristique de branchement et liée et à d'autres heuristiques.
Nicholas Mancuso
Les tous ? Si c'est le cas, alors je pense que la formulation de votre "vrai problème" a un problème, car il est optimisé trivialement en laissant être n'importe quel ensemble singleton : faire cela fait que la somme sur le LHS de votre fonction objectif soit 0 .aij1S{j}
j_random_hacker
Tous les sont pas tous supérieurs à . aij1
drzbir

Réponses:

4

Même la version décisionnelle de ce problème, dans laquelle nous essayons de déterminer simplement s'il existe une solution possible, est NP-difficile par réduction à partir d' Exact Cover . (La version d'optimisation, où nous recherchons une solution réalisable qui minimise , est clairement au moins aussi difficile que cela.)|S|

La matrice à une seule ligne et à une seule colonne contenant la valeur 0,5 est un exemple d'entrée pour laquelle il n'existe aucune solution réalisable. En voici une autre:

[0.243.1350.6].

Création d'un gadget "Choisissez au plus un"

Tout d'abord, notez que si la valeur maximale dans une ligne est , et que cette ligne contient (au moins) deux copies de , disons en et , , alors ne peut pas contenir à la fois et , car si tel était le cas, l'un des deux cas suivants doit se produire, chacun conduisant à une contradiction:aix>0xaijaijjjSjj

  1. iKjKj : Supposons que wlog . Mais alors , contredisant l'exigence que .iKjΣmS,mjaimaij=x=aijΣmS,mjaimaij1
  2. iKjKj : Supposons alors . Mais alors , et puisque est maximal dans la ligne , le plus élevé que pourrait être clairement , donc nous devons violer la même inégalité qu'auparavant.iKp,p{j,j}ΣmS,mpaimaij+aij=2xxiaipx

Ainsi , nous pouvons choisir une valeur maximale qui est en toute sécurité supérieure à la somme de toutes les valeurs non maximales de la ligne, et des copies d'utilisation de cette valeur maximale pour faire respecter ce qui est inclus dans au plus une de ces colonnes .S

Nous pouvons transformer cette contrainte «choisir au plus une» en une contrainte «choisir exactement une» en utilisant toute valeur positive inférieure à 1 comme valeur «non maximale». En effet, chaque ligne appartient à une partie de la partition de ligne, et si alors la RHS de l'inégalité devient négative pour la ligne , il n'y a donc aucun moyen de la satisfaire: donc au moins un doit être forcé dans tel que .iKjaij<1ijSaij1

Donc, pour vous assurer que l'une des colonnes d'un ensemble est forcée dans , créez une ligne comme suit:TNSai

  • Set pour chaque .aij=n+1jT
  • Réglez pour chaque autre .aij=0.5j

Ainsi, la réduction de la couverture exacte est simple: il y a une ligne pour chaque élément, une colonne pour chaque ensemble, avec chaque fois que l'ensemble comprend l'élément et sinon. Les deux directions ("L'instance EC d'entrée est une instance YES instance construite du problème OP est une instance YES", et "L'instance construite du problème OP est une instance YES une instance EC d'entrée est une instance YES") sont clairs.aij=n+1jiaij=0.5

j_random_hacker
la source
L' exemple vous avez donné, je pense, a une solution de . 2×2S={2}
drzbir
J'ai et . Donc mon inégalité est pour . Parce que l'inégalité doit être valable pour tous les . S={2}K2=K={1,2}0ai21iK2={1,2}iKj
drzbir
Tu as raison, désolé. Je vais le réparer maintenant.
j_random_hacker
J'ai écrit ce problème sous forme de programme entier et je l'ai résolu. Maintenant, je dois le résoudre avec un algorithme gourmand (mieux, un algorithme avec une garantie de performance). Comme vous l'avez suggéré, j'ai cherché un saut de couverture exact pour trouver des idées sur la façon de concevoir un bon algorithme pour cela. As tu des idées?
drzbir
C'est NP-difficile, donc presque certainement aucun algorithme poly-temps n'existe. J'essaierais de vérifier toutes les colonnes simples, toutes les paires de colonnes, tous les triplets, etc. jusqu'à ce que vous trouviez un ensemble satisfaisant. Le sous-problème que vous devez résoudre pour chaque ligne (à savoir, décider quel élément de choisir pour cette ligne) est facile. S
j_random_hacker