Frage

Eingabe: Graph G Ausgang: mehrere unabhängige Sätze, so dass die Mitgliedschaft eines Knotens an alle unabhängigen Sätzen ist einzigartig. Ein Knoten muss daher keine Verbindungen zu beliebigen Knoten in einem eigenen Satz. Hier ist ein Beispiel Weg.

Da Klarstellung für hier eine andere rephrasal genannt wurde:

Unterteilen eines Graphen in Sätze, so dass

  1. i kann beispielsweise in Mengen von seiner Mitgliedschaft einem Knoten von allen anderen sagen, wenn der Knoten i nur in Satz A ist kein anderer Knoten sollte nur in Gruppe A vorhanden sein

    , wenn der Knoten j in der Serie A vorhanden ist und B dann kein anderer Knoten sollte nur in Gruppe A und B vorhanden sein. wenn die Mitgliedschaft von Knoten, die durch ein Bitmuster codiert ist, dann haben diese Bitmustern Abstand mindestens eine Hamming

  2. Wenn zwei benachbarte Knoten in dem Graphen sind, sollen sie nicht in dem gleichen Satz vorhanden sein, damit ein unabhängiger Satz sein

Beispiel: B hat keine benachbarten Knoten D => A, A => D

Lösung:

  1. A B /
  2. / B D

A hat Bitmusters 10 und keine benachbarten Knoten in seinem Satz. B hat 11-Bit-Muster und keine benachbarten Knoten, D 01 hat daher alle Knoten haben Hammingabstands mindestens 1 eine nicht benachbarten Knoten => richtig

Falsch, weil D und A verbunden sind:

  1. A D B
  2. / D B

A hat Bitmusters 10 und D in ihren eingestellten, sind sie nebeneinander. B hat Bitmusters 11 und keine benachbarten Knoten, D weist 11 als B hat, so gibt es zwei Fehler in dieser Lösung und daher ist es nicht akzeptiert.

Natürlich soll dies als die Anzahl der Knoten, um mehr Sets erweitert werden, in der Graph steigt, da Sie mindestens log(n) Sets benötigen.

Ich schrieb bereits eine Umwandlung in MAX-TV, ein Sat-Löser für diesen Einsatz. aber die Anzahl der Klauseln ist nur zu groß. Ein direkterer Ansatz wäre schön. Bisher habe ich eine Annäherung, aber ich würde eine exakte Lösung gefällt oder zumindest eine bessere Annäherung.

Ich habe einen Ansatz versucht, wo ich von einer beliebigen Lösung zu einem besser man einen Partikel-Schwarm zu optimieren verwendet. Allerdings ist die Laufzeit ist ziemlich schrecklich, und die Ergebnisse sind bei weitem nicht groß. Ich suche nach einem dynamischen Algorithmus oder so etwas, aber ich kann nicht begreifen, wie dieses Problem zu teilen und zu erobern.

War es hilfreich?

Lösung

keine vollständige Antwort, und ich weiß nicht, wie nützlich es für Sie sein wird. Aber hier geht:

Die Hamming-Distanz scheint mir ein roter Hering. Ihr Problem Aussage sagt es mindestens 1 sein muss, aber es 1000. Es genügt zu sagen, für jeden Knoten des Satzes Mitgliedschaften der Bit-Codierung ist einzigartig sein könnte.

Ihre Problemstellung formuliert sie es nicht aus, aber Ihre Lösung oben schlägt jeder Knoten ein Mitglied von mindestens 1 Satz sein muss. dh. ein Bit-Codierung aller 0-ist für jeden Knoten des Satzes Mitgliedschaften nicht erlaubt.

Das Ignorieren verbundenen Knoten für einen Moment, disjunkte Knoten einfach: Einfach Anzahl sie nacheinander mit einer nicht verwendeten Bit-Codierung. Speichern Sie die für letzte.

Ihr Beispiel oben genannten Verwendungen Kanten gerichtet, aber wieder, die mich als ein roter Hering trifft. Wenn A nicht in dem gleichen Satz wie D, weil A => D, D kann nicht in dem gleichen Satz wie A sein unabhängig davon, ob D => A.

Sie erwähnen benötigen mindestens log (N) Sätze. Sie werden auch in den meisten N-Sets haben. Ein vollständig zusammenhängenden Graphen (mit (n ^ 2-n) / 2 ungerichteten Kanten) erfordert N Sätze jeder einen einzelnen Knoten enthält.

In der Tat, wenn Ihr Diagramm enthält einen vollständig verbunden simplex von M Abmessungen (M in 1..N-1) mit M + 1 Ecken und (M ^ 2 + M) / 2 ungerichtete Kanten, werden Sie mindestens benötigen M + 1-Sets.

In Ihrem Beispiel oben haben Sie einen solchen Simplex (M = 1) mit 2 Ecken {A, D} und 1 (ungerichtet) Kante {(A, D)}.

Es scheint, dass das Problem die größten vollständig verbunden Simplexen zu finden, in Ihrem Diagramm unten kochte. Anders ausgedrückt, haben Sie ein Routing-Problem: Wie viele Dimensionen brauchen Sie zu routen Ihre Kanten so kein Kreuz? Es klingt nicht wie ein sehr skalierbares Problem.

Der erste große simplex zu finden ist einfach. Jeder Knoten Knoten bekommt einen neuen Satz mit einem eigenen Bit.

Die disjunkten Knoten sind einfach. Sobald die verbundenen Knoten behandelt werden, einfach die disjunkte Anzahl Knoten Skipping sequentiell alle zuvor verwendeten Bitmuster. Von Ihrem Beispiel oben, da A und D 01 nehmen und 10, der nächste verfügbare Bitmuster für B 11.

Der schwierige Teil wird dann, wie alle verbleibenden Simplexen falten, so viel wie möglich in das bestehende Angebot, bevor neue Sets mit neuen Bits zu schaffen. Beim Zusammenklappen muß man verwenden, 2 oder mehr Bits (Sets) für jeden Knoten, und die Bits (Sets) nicht überschneidet mit den Bits (Sets) für jeden benachbarten Knoten.

Überlegen Sie, was zu Ihrem Beispiel geschieht oben, wenn man fügt einen weiteren Knoten, C, zum Beispiel:

C verbindet sowohl direkt an A und D, dann ist das anfängliche Problem wird den 2-simplex mit 3 Vertices Auffinden {A, C, D} und 3 Kanten {(A, C), (A, D), ( CD)}. Sobald A, C und D die Bitmuster nehmen 001, 010 und 100, für disjunkte B die niedrigste verfügbare Bitmuster 011 ist.

Wenn auf der anderen Seite verbinden C direkt A oder D, aber nicht beide, die Graph hat zwei 1-Simplexe. Angenommen wir die 1-Simplex mit den Eckpunkten {A, D} finden sie zuerst die Bitmuster 01 und 10 geben, wird das Problem dann, wie C zu falten in diesem Bereich. Der einzige Bitmuster mit mindestens 2 Bits 11 ist, sondern dass je nachdem, was schneidet Knoten C zu Verbindungen so müssen wir eine neue Gruppe erstellen und legten C darin. An diesem Punkt ist die Lösung ähnlich der oben.

Wenn C disjunkt ist, entweder B oder C wird das Bitmuster 11 erhalten und die verbleibenden einen neuen Satz benötigen und das Bitmuster 100 erhalten.

Angenommen C Connects zu B, aber nicht A oder D. Wiederum weist der Graph zwei 1-Simplexe aber diesmal disjunkt. Angenommen, {A, D} wird zuerst wie oben gibt A und D die Bitmustern gefunden 10 und 01. Wir falten können B oder C in den bestehenden Bereich. Der einzige verfügbare Bitmuster im Bereich 11 und entweder B oder C könnte dieses Muster erhalten, da weder angrenzend an A oder D ist Sobald 11 verwendet wird, stellt keine Bitmuster mit 2 oder mehr Bits übrigbleiben, und wir werden schaffen müssen ein neuer Satz für die verbleibenden Knoten ihnen das Bitmuster 100.

geben

Angenommen C verbindet alle 3 A, B und D. In diesem Fall hat der Graph eine 2-simplex mit 3 vertexes {A, C, D} und ein 1-simplex mit 2 Scheiteln {B, C}. wie oben fortgefahren wird, nach dem größten simplex Verarbeitung, A, C und D-Bit-Muster erhalten wird 001, 010, 100. Für B in diesen Bereich Falzen, die verfügbaren Bitmustern mit 2 oder mehr Bits gesetzt sind: 011, 101, 110 und 111. Alle diese außer 101 schneiden mit C so B würde das Bitmuster 101 erhalten.

Die Frage ist dann: Wie effizient können Sie den größten voll angeschlossenen Simplexen finden

Wenn die größte vollständig verbundenen simplex zu finden ist zu teuer , könnte man eine ungefähre obere Grenze Potential gelegt vollständig verbunden Simplexe von maximal Minima in Hinblick auf die Verbindungen zu finden:

  1. Sweep durch die Aktualisierung Kanten der Eckpunkte mit einer Zählung der Verbindungskanten.

  2. für jeden angeschlossenen Knoten erzeugt eine Reihe von Cn zählt zunächst Null wobei Cn die Anzahl der Kanten mit dem Knoten n.

  3. Sweep durch die Kanten wieder, für den angeschlossenen Knoten N1 und N2, erhöht die Zählung in n1 entsprechend Cn2 und vice versa. Wenn Cn2> Cn1, aktualisieren Sie die letzte Zählung in dem n1-Array und vice versa.

  4. Sweep durch die angeschlossenen Knoten wieder, berechnend eine obere Schranke für der größte jeder simplex Knoten könnte sei ein Teil von. Sie könnten einen Taube-Loch-Array mit einer Liste von Scheitelpunkten bauen für jeden oberen, wie Sie durch den Knoten gebunden kehren.

  5. Arbeit durch die Taubenlochanordnung von der größten zur kleinsten Extrahieren und Falten Knoten in einzigartige Sets.

Wenn die Knoten in einem Satz N und die Kanten in einer Menge E sind, wird die Komplexität sein: O (| N | + | E | + O (Schritt 5))

Wenn die obigen Annäherung genügt, sich die Frage: Wie effizient können Sie Knoten in bestehende Bereiche falten Sie die Anforderungen gegeben

Andere Tipps

Das vielleicht nicht die Antwort, die Sie vielleicht erwarten, aber ich kann nicht einen Ort, um einen Kommentar hinzufügen finden. Also tippe ich es hier direkt. Ich kann Ihre Frage nicht ganz verstanden. Oder geht das spezifische Wissen müssen verstehen? Was ist die unabhängige Menge? Da ich einen Knoten in einem unabhängigen Satz von einem gerichteten Graphen hat einen Zwei-Wege-Pfad zu einem anderen Knoten in dieser Reihe kennen. Ist Ihre Idee gleich?

Wenn dieses Problem wie das, was ich davon ausgehen, können unabhängige Sätze durch diesen Algorithmus zu finden: 1. Nicht Tiefensuche auf der gerichteten Graphen, die Zeit des Baums von diesem Knoten verwurzelten aufzeichnet durchlaufen wird. 2. dann umkehren alle Kanten in dieser Grafik 3. Wählen Sie auf der modifizierten Graph wieder Tiefe frist Suche. Die algorihtm erklärt gerade durch Buch "Einführung in alogrithm"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top