Elemente so anordnen, dass einige Elemente nicht zwischen anderen stehen

10

Gegeben sei eine ganze Zahl und eine Menge von Tripletts unterschiedlicher Ganzzahlen finde einen Algorithmus, der entweder eine Permutation der Menge so dass oder bestimmt korrekt, dass keine solche Permutation existiert. Weniger formal wollen wir die Zahlen 1 bis neu ordnen ; Jedes Tripel in zeigt an, dass in der neuen Reihenfolge vor erscheinen muss , aber darf nicht zwischen erscheinenS { ( i , j , k ) 1 i , j , k n , i j , j k , i k } , π { 1 , 2 , , n } ( i , j , k ) S.n

S{(i,j,k)1i,j,kn,ij,jk,ik},
π{1,2,,n}n ( i , j , k ) S i k j i
(i,j,k)S(π(j)<π(i)<π(k))  (π(i)<π(k)<π(j))
n(i,j,k)Sikjiund .k

Beispiel 1

Angenommen, und . DannS = { ( 1 , 2 , 3 ) , ( 2 , 3 , 4 ) }n=5S={(1,2,3),(2,3,4)}

  • π=(5,4,3,2,1) ist keine gültige Permutation, weil , sondern .π ( 1 ) > π ( 3 )(1,2,3)Sπ(1)>π(3)

  • π=(1,2,4,5,3) ist keine gültige Permutation, da aber .(1,2,3)Sπ(1)<π(3)<π(5)

  • (2,4,1,3,5) ist eine gültige Permutation.

Beispiel 2

Wenn und , gibt es keine gültige Permutation. Ebenso gibt es keine gültige Permutation, wenn und ( Ich denke, vielleicht hat hier ein Fehler gemacht.S = { ( 1 ,n=5S={(1,2,3),(2,1,3)}n=5S={(1,2,3),(3,4,5),(2,5,3),(2,1,4)}

Bonus: Welche Eigenschaften von bestimmen, ob eine praktikable Lösung existiert?S

Patrick87
quelle
Warum formulieren Sie die zweite Bedingung nicht als ? Dann haben Sie ein einfaches, mehr oder weniger problematisches Problem. (Beachten Sie, dass ich die Bedingung basierend auf den anderen Annahmen vereinfacht habe.)(σmi,σmj,σmk)S(i>jj>k)
Dave Clarke
Übrigens: Was ist die Motivation für dieses Problem?
Dave Clarke
@ DaveClarke Siehe meine Bearbeitung. Dieses Problem wurde aus einer Diskussion über ein Planungsproblem, das ich mit einigen anderen Studenten im Labor besprochen habe, abstrahiert. Grundsätzlich besteht die Idee darin, dass Sie viele Jobs haben, von denen einige in einer bestimmten Reihenfolge ausgeführt werden müssen. Sie möchten jedoch nicht, dass einige Jobs zwischen Jobs in einer Sequenz geplant werden, möglicherweise aus sehr subtilen Gründen.
Patrick87
3
Warum die Sigmas? Definieren Sie einfach . Verschachtelte Indizes bringen das Jesuskind zum Weinen. Σ={1,2,,n}
JeffE
@ JeffE Ehrlich gesagt, ich mag nur die Ausrede, mit der Gleichungssache zu spielen. Das Schreiben von Code, der zu diesen kleinen kompiliert wird, ist nur viszeral befriedigend . Nehmen Sie nicht , dass von mir, Mann. σ
Patrick87

Antworten:

3

Hier ist ein naiver Algorithmus. Es beruht letztendlich auf roher Gewalt, kann aber manchmal in Ordnung sein.

Jede Einschränkung aus zwei Konjunktionen besteht; Nennen wir sie Typ , und Typ , . Jede Einschränkung vom Typ kann äquivalent als Disjunktion , wobei auf die Tatsache zurückgegriffen wird, dass .(σmi,σmj,σmk)Si<k¬(i<j<k)Ai<kB¬(i<j<k)Bi>jj>kij,jk

  1. Sammeln Sie alle Einschränkungen vom TypNennen Sie das . Überprüfen Sie, ob sie konsistent sind, nämlich dass dies eine Linearisierung der Reihenfolge ist. Dies benötigt -Zeit für die Anzahl der Einschränkungen unter Verwendung der topologischen Sortierung.AΘO(|S|)
  2. Überprüfen Sie für jedes der Disjunkte in der Einschränkung vom Typ , ob es mit der Teilreihenfolge übereinstimmt . Wenn es nicht konsistent ist, entfernen Sie das Disjunct. Wenn beide Disjunkte nicht mit übereinstimmen, fehl. Wenn nur eine Einschränkung vom Typ entfernt wird, fügen Sie die verbleibende zu . Dieser Schritt ist .BΘΘBΘO(|S|2)
  3. Nun gibt es einen offensichtlichen Algorithmus, um eine Lösung zu finden, nämlich alle Kombinationen der Typ- Disjunktionspaare zu berücksichtigen und ihre Konsistenz mit testen , aber dies ist in eindeutig exponentiell . Eine Heuristik zur Verbesserung der Leistung wäre, die Typ- Disjunktionspaare als Zweige eines Baumes zu behandeln - ein Paar bildet die Wurzel, seine Kinder werden vom zweiten Paar gegeben, ihre Kinder vom dritten und so weiter. Unter Verwendung dieser Datenstruktur wird eine Lösung gefunden, indem der Baum in der Tiefe zuerst durchlaufen wird. Jedes Mal, wenn eine neue Einschränkung hinzugefügt wird (mithilfe der Beschriftung eines Zweigs), kann die Konsistenz überprüft werden. Inkonsistente Teilbäume können beschnitten werden.BΘ|S|
    B
  4. Wenn ein Blatt des Baums erreicht ist, haben wir einen konsistenten Satz von Einschränkungen, der aus allen Einschränkungen vom Typ und einem Disjunkt der Einschränkungen vom Typ . Linearisieren Sie das Ergebnis, um die gewünschte Reihenfolge zu erhalten.B.AB

Mein bevorzugter Ansatz wäre es, ihn in eine Reihe von Einschränkungen zu codieren und einen Einschränkungslöser wie Choco zu verwenden. Ich würde ganzzahlige Variablen im Bereich einführen und verlangen, dass sie alle verschieden sind. Dann würde ich jede der oben genannten Einschränkungen direkt als Einschränkungen codieren und dann Choco das Geschäft machen lassen.x i [ 0 , n - 1 ]nxi[0,n1]

Dave Clarke
quelle
1

Hier ist eine teilweise Antwort:

Wenn Sie die Einschränkung für jedes Tripel entfernen, wird Ihr Problem zum Non-Betweeness-Problem, das vollständig ist, und es sind keine effizienten Algorithmen für solche Probleme bekannt. Mit der Einschränkung kann jedoch eine nette Struktur erzwungen werden, die ausgenutzt werden kann, um einen Polynomzeitalgorithmus für Ihr Problem zu finden.N P i < ki<kNPi<k

Mohammad Al-Turkistany
quelle