Wie partitioniere ich eine Menge unter bestimmten Bedingungen in eine bestimmte Anzahl disjunkter Teilmengen?

11

Ich eine Menge , eine ganze Zahl und nicht negative ganze Zahlen a_ {ij} . Mein Problem besteht darin, s disjunkte Teilmengen S_j von \ {1, \ ldots, k \} so zu finden, dass:s k a i j s S j { 1 , , k }A{1,,k}skaijsSj{1,,k}

  1. j=1sSj=A ; und
  2. |Sj|aij für alle iSj und j=1,,s .

Wie kann man dieses Problem lösen? Ist es schwierig, eine praktikable Lösung zu finden?

Ich denke, es ist nicht einfach, das Problem zu lösen, weil ich eine Prozedur ausprobiert habe, die mit j \ in \ {1, \ ldots, n \} beginnt j{1,,n}und i{1,,k} bis zur Nummer zuweist von i zugewiesen j größer als aij für einige i zugeordnet. Dies ist jedoch nicht korrekt, da ich von einigen i übrig bleiben ikönnte, die keinem j zugewiesen werden könnten j(aufgrund ihres aij das nicht erfüllt werden konnte).

Die Brute-Force-Methode, bei der ich alle Teilmengen von A generieren Aund jede testen muss, funktioniert für mich ( k=8,n=3 ), ist aber sehr ineffizient.

drzbir
quelle
Überprüfen Sie, ob die Bearbeitung der Frage entspricht, die Sie stellen möchten. kommt ? Ist das eine feste Konstante (nicht Teil der Eingabe, aber für alle Zeiten fest) oder ist sie Teil der Eingabe? Suchen Sie schließlich eine praktische Lösung? oder suchen Sie nach der theoretischen Komplexität dieses Problems? Wenn erstere, haben Sie versucht, eine ganzzahlige lineare Programmierung zu verwenden? amax
DW

Antworten:

10

Dieses Problem ist durch Reduzierung von Vertex Cover NP-schwer.

Im Vertex Cover-Problem erhalten wir einen Graphen und eine Zahl , und unsere Aufgabe besteht darin, zu bestimmen, ob es eine Teilmenge von höchstens Eckpunkten von so dass jede Kante in einfällt auf zumindest einen Scheitelpunkt in . (Entsprechend: Ist es möglich, jede Kante in zu töten, indem höchstens Eckpunkte gelöscht werden ?)r U r V E U G rG=(V,E)rUrVEUGr

Zuerst Partitionieren in disjunkte Untermengen entspricht , jedes Element in der Zuweisung genau einer der möglichen Etiketten. Die Grundidee der Reduktion besteht darin, für jeden Scheitelpunkt in eine Beschriftung zu erstellen und jeder Kante nur eine der beiden Beschriftungen zu "erlauben", die ihren Endpunkten entsprechen, im folgenden Sinne: Zuweisen einer Kante eine entsprechende Mit label wird keine (echte) Einschränkung eingeführt, welche anderen Kanten derselben Beschriftung zugewiesen werden können, während durch Zuweisen einer Kante zu einer nicht entsprechenden Beschriftung verhindert wird, dass einer anderen Kante dieselbe Beschriftung zugewiesen wird - was natürlich dazu führt, dass die Nummer nach oben verschoben wird von verschiedenen Etiketten erforderlich.s A s S j v j V.AsAsSjvjV

So erstellen Sie eine Instanz Ihres Problems aus einer Instanz von Vertex Cover:( G , r )(A,a,s)(G,r)

  1. Setze aufUnd ein Element schaffen in für jede Kante in . (Diese Paare können als die ganzen Zahlen ; jede Bijektion zwischen ihnen reicht aus.)| E | ( i , j ) A v i v j E 1 , , kk|E|(i,j)AvivjE1,,k
  2. Setze aufwenn oder ; Andernfalls setzen Sie auf 1. | E | d = b d = c a ( b , c ) , da(b,c),d|E|d=bd=ca(b,c),d
  3. Setze .s=r

WennS j v j U v b v cE ( b , c ) A S b S c s a i j | E |(G,r) eine YES-Instanz von Vertex Cover ist, ist es leicht zu erkennen, dass die gerade konstruierte Instanz Ihres Problems auch eine YES-Instanz ist: einfach die Bezeichnungen , die den Vertices in einer beliebigen Lösung und weisen Sie für jede Kante das entsprechende Element je nachdem, welche der Bezeichnungen oder ausgewählt wurde (wählen Sie willkürlich, wenn beide Bezeichnungen ausgewählt wurden). Diese Lösung verwendet Teilmengen und ist gültig, da nur die entsprechenden für die Entsprechung geltenSjvjUvbvcE(b,c)ASbScsaijLabels, die den (Nicht-) Effekt haben, mehr alsKanten, denen das gleiche Etikett zugewiesen wurde.|E|

Es bleibt zu zeigen, dass eine YES-Instanz Ihres Problems impliziert, dass das Original( G , r ) Y X ( i , j ) S m m { i , j } U Y.X=(A,a,s)(G,r) eine YES-Instanz von Vertex Cover ist. Dies ist etwas komplizierter, da eine gültige Lösung bis im Allgemeinen einer Kante eine nicht entsprechende Bezeichnung zuweisen kann , dh , was bedeutet, dass wir dies nicht können notwendigerweise eine gültige Scheitelpunktabdeckung aus einer gültigen Lösung "ablesen" .YX(i,j)Smm{i,j}UY

Das Zuweisen eines nicht entsprechenden Etiketts ist jedoch mit hohen Kosten verbunden, die die Struktur der Lösung stark einschränken: immer dann, wenn eine Kante vorhanden ist S m m { i , j } a ( i , j ) , m = 1 Y ( i , j ) S m Y '(i,j) solches Etikett zugewiesen wird , ist die Tatsache dass sicherstellt, dass es die einzige Kante sein muss, der diese Bezeichnung zugewiesen wurde. In jeder Lösung die eine solche nicht entsprechend markierte Kante , könnten wir also eine alternative Lösung wie folgt konstruieren :Smm{i,j}a(i,j),m=1Y(i,j)SmY

  1. Wählen Sie willkürlich die neue Bezeichnung für als oder .Sz(i,j)SiSj
  2. Weisen Sie diesem neuen Label . Wenn dies zu einer ungültigen Lösung führt, muss dies daran liegen, dass genau einer anderen Kante , bereits die Bezeichnung zugewiesen wurde . In diesem Fall setzen Sie und fahren Sie mit Schritt 1 fort.(i,j)(i,j)z{i,j} ( i , j ) = ( i ' , j ' )Sz(i,j)=(i,j)

s - 1 sSzs1s|E|Y

Diese Konstruktion ist eindeutig eine Polynomzeit, daher ist Ihr Problem NP-schwer.

j_random_hacker
quelle
Danke für deine Hilfe. Haben Sie eine Idee, wie man dieses Problem (ungefähr) lösen kann? (Wie kann ich zum Beispiel Techniken für das Vertex-Cover-Problem verwenden, um es zu lösen?) Ich habe einen gierigen Ansatz versucht, aber manchmal kann keine praktikable Lösung ausgegeben werden. (Die Art und Weise, wie ich wähle, dass der gierige Ansatz fehlschlägt, wenn eine Lösung existieren könnte.)Sj
drzbir
Nun, es wird erwartet, dass ein gieriger Ansatz manchmal keine praktikable Lösung liefert, da Sie, wenn dies immer der Fall wäre, ein NP-hartes Problem in Poly-Time lösen würden ;-) Denken Sie daran, dass es nicht unbedingt falsch ist, wenn es nicht möglich ist eine Lösung finden: Es kann durchaus sein, dass es keine praktikable Lösung gibt.
j_random_hacker
In Bezug auf Lösungstechniken wird eine, die mir gefällt, als Strahlensuche bezeichnet. Dies ist im Grunde eine Art Branch-and-Bound, die ausreichend schlechte Teillösungen "vergisst", um die Speichernutzung zu begrenzen. (B & B ist selbst ein sehr guter Ansatz und löst Probleme manchmal schnell. Es ist etwas einfacher als die Strahlensuche, daher ist es einen
Versuch
(Alle folgenden Punkte gelten auch für die Strahlensuche sowie für B & B.) B & B ist eine sehr allgemeine Technik. Das Wichtigste dabei ist, die Besonderheiten des Problems auszunutzen, um die von Ihnen getroffenen Entscheidungen so zu organisieren, dass möglichst früh im Suchbaum schlechte Entscheidungen (dh Entscheidungen, die nicht zu praktikablen Lösungen führen) getroffen werden . (Diese Entscheidungen werden irgendwo getroffen , und jede Ebene, in der sie getroffen werden, verdoppelt die Häufigkeit , mit der sie getroffen werden.) Für Ihr Problem würde ich vorschlagen, zuerst die Elemente in in absteigender Reihenfolge der "Schlechtigkeit" zu ordnen, wobei. ..A
j_random_hacker
... die Schlechtigkeit des Elements a i ji könnte sein, z. B. das Minimum von über alles j , das Binden durch das zweite Minimum, dann das dritte Minimum usw. bricht. Grob gesagt wird das "schlechteste" Element das Element sein Dies schränkt jede Menge, zu der sie hinzugefügt wird, am stärksten ein. An jedem Knoten in der Tiefe d im Suchbaum haben Sie eine Teillösung, bei der die ersten (und damit "schlechtesten") d Elemente bereits Mengen zugewiesen wurden. Sie müssen auswählen, welcher der n Mengen das ( d + 1 ) -te Element zugewiesen werden soll : Das heißt, Sie benötigen bis zu n rekursive Aufrufe. ("Bis zu", weil wir hoffentlich ...aijjddn(d+1)n
j_random_hacker