2016-06-17 4 views
0

Da ich nicht in verschiedenen Optimierungs/Baum-Algorithmen sehr gut bin, suche ich Hilfe.Algorithmus zum Finden der besten Kombination oder Pfad durch die Knoten

Problembeschreibung:

Angenommen, eine große Folge von sortierten Knoten mit jedem Knoten repräsentiert einen ganzzahligen Wert L. L wird immer größer, mit jedem Knoten immer gegeben und es werden keine Knoten haben die gleiche L.
das Ziel ist es nun, die beste Kombination von Knoten zu finden, wo der Unterschied zwischen den L-Werten der nachfolgenden Knoten ist am nächsten zu einem gegebenen ganzzahligen Wert M (L), die über L. ändert

Beispiel:

Also, am Anfang hätte ich L = 50 und M = 100. Die nächsten Knoten haben L = 70,140,159,240,310.

Erstens scheint der Wert von 159 L + M = 150 am nächsten zu liegen, also wird er als der richtige Wert gewählt. Im nächsten Schritt ist jedoch noch M = 100 gegeben und wir bemerken, dass L + M = 259, was weit von 240 entfernt ist. Wenn wir jetzt zurückgehen und den Knoten mit L = 140 wählen, was dann ist gefolgt von 240, ist die Gesamtübereinstimmung zwischen den M-Werten und den L-Differenzen stärker. Der Algorithmus sollte in der Lage sein, zum optimalen Pfad zurückzufinden, selbst wenn ein Fehler auf dem Weg gemacht wurde.

Einige zusätzliche Informationen:

1) der Startknoten ist nicht unbedingt ein Teil der besten Kombination/Pfad, aber wenn erforderlich, könnte man zunächst einen Algorithmus entwickeln, der die besten Starter Kandidaten wählt.
2) die optimale Kombination der Knoten folgt der sortierten Reihenfolge und nicht "springt zurück" -> also 1,3,5,7 ist möglich, aber nicht 1,3,5,2,7.
3) Am Ende sollten die Differenzen zwischen den L-Werten der ausgewählten Knoten im mittleren quadratischen Abstand den M-Werten am nächsten sein

Jede Hilfe wird sehr geschätzt!

+0

Ihre Bedingung (3) nützlich ist, in Verbindung steht, was Sie versuchen, zu tun, was zu sein scheint: Aus einer Folge von n Knoten, wählen Sie eine Teilfolge (Lücken erlaubt) von k Knotenpositionen x_1, ..., x_k, so dass 1 <= x_i <= n, i

+0

Hallo, Sie haben die wichtigen Informationen aus dem Text sehr gut abstrahiert, danke dafür. Alles, was du geschrieben hast, ist korrekt. Ich bemerkte auch das Problem des Algorithmus, dann die Anzahl der Knoten zu reduzieren. Alles, was ich tun kann, ist die Anzahl der Knoten zu schätzen, die berücksichtigt werden sollten. Dies wird jedoch nur eine (relativ gute) Näherung der korrekten Anzahl von Knoten sein. Eine zusätzliche Einschränkung könnte daher sein, diesen Wert zu berücksichtigen, z. um die Anzahl von Knoten zu beschränken, die größer als ein Minimalwert ist. –

+0

Gut, das ist genau das, was ich vorschlage, und das Problem löst meine Antwort :) –

Antwort

1

Wenn ich Ihre Frage richtig verstanden habe, könnten Sie Dijktras Algorithmus verwenden:

https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

http://www.mathworks.com/matlabcentral/fileexchange/20025-dijkstra-s-minimum-cost-path-algorithm

Dafür haben Sie Ihre Nachbarn von jedem Knoten kennen und eine Adjazenzmatrix erstellen. Mit der Implementierung des Dijktras-Algorithmus, den ich oben gepostet habe, können Sie Kantengewichte angeben. Sie können Ihr Kantengewicht so spezifizieren, dass L des Knotens + M ist. Für jede Knotenkombination haben Sie also Ihr L des neuen Knotens + M. Auf diese Weise sollte der Algorithmus den optimalen Pfad zwischen Ihren Knoten finden. Um alle Kanten Kombinationen erhalten Sie Matlabs Graph Funktionen nutzen:

http://se.mathworks.com/help/matlab/ref/graph.html

Wenn ich Ihr Problem richtig verstanden benötigen Sie einen ungerichteten Graphen. Sie können auf alle Kanten mit dem Befehl G.Edges zugreifen, nachdem Sie das Diagramm erstellt haben.

Ich weiß, es ist nicht die perfekte Antwort, aber ich hoffe, es hilft!

P.S. Nur aufpassen, Djikstras Algorithmus kann nur positive Kantengewichte handhaben.

+0

Danke, Ihre Hilfe wird sehr geschätzt! Im Moment folge ich der Route von j_random_hackers Lösung, die dem Dijkstra-Algorithmus (?) Sehr ähnlich zu sein scheint, aber trotzdem Ihre Hinweise berücksichtigt. Lustigerweise habe ich, obwohl ich mit Optimierungsalgorithmen fast nichts zu tun habe, einmal den Floyd-Warshall-Algorithmus für eine triviale Aufgabe berechnet, konnte aber irgendwie nicht an eine Anwendung für dieses Problem denken. –

0

Angenommen, wir haben eine Zahl M und eine Liste von n Zahlen, L [1], ..., L [n], und wir wollen eine Teilfolge von mindestens q der letzteren Zahlen finden, die die Summe der quadrierten Fehler (SSE) in Bezug auf M, wobei die SSE eine Liste von Positionen k x [1], ..., x [k] in Bezug auf M wird durch

SSE(M, x[1], ..., x[k]) = sum((L[x[i]]-L[x[i-1]]-M)^2) over all 2 <= i <= k, 

gegeben mit der SSE einer Liste von 0 oder 1 Positionen definiert als 0.

(Ich führe hier den Parameter q und die zugehörige Einschränkung in die Länge der Untersequenz ein, denn ohne diese gibt es immer eine Untersequenz der Länge genau 2, die die mi nimum möglich SSE - und ich vermute, dass eine solche kurze Sequenz Ihnen nicht hilfreich)

Dieses Problem in O (Qn^2) Zeit und O (QN) Raum gelöst werden könnendynamic programming verwenden. .

definieren f (i, j) erreichbar unter den folgenden Randbedingungen die minimale Summe der quadrierten Fehler sein:

  1. Die Anzahl an Position i ausgewählt wird, und ist die am weitesten rechts liegende Position ausgewählt. (Hier bedeutet i = 0, dass keine Positionen ausgewählt sind.)
  2. Wir fordern, dass mindestens j (anstelle von q) dieser ersten i-Nummern ausgewählt wird.

Auch g definieren (i, j) das Minimum von f (k, j) über alle < 0 = k < sein = i. Somit ist g (n, q) die kleinste Summe von quadratischen Fehlern, die für das gesamte ursprüngliche Problem erreichbar sind. Für eine effiziente (O (1)) Berechnung von g (i, j), beachten Sie, dass

g(i>0, j>0) = min(g(i-1, j), f(i, j)) 
g(0, 0) = 0 
g(0, j>0) = infinity 

Um f (i, j) zu berechnen, beachten Sie, dass, wenn i> 0, dann muss jede Lösung durch Anhängen der gebildet werden i-te Position zu irgendeiner Lösung Y, die wenigstens j-1 Positionen auswählt und deren am weitesten rechts liegende ausgewählte Position sich links von i befindet - dh deren am weitesten rechts liegende ausgewählte Position k ist, für einige k < i. Die Gesamt-SSE dieser Lösung für das (i, j) -Teilproblem wird sein, was immer die SSE von Y war, zuzüglich eines festen Terms von (L [x [i]] - L [x [k]] - M)^2 - - Um diese Gesamt-SSE zu minimieren, genügt es, die SSE von Y zu minimieren. Aber wir können dieses Minimum berechnen: es ist g (k, j-1).

Da dies gilt für jede 0 < = k < i, sie alle solche Werte von k, um zu versuchen genügt, und die man nehmen, die die niedrigste Gesamt SSE gibt:

f(i>=j, j>=2) = min of (g(k, j-1) + (L[x[i]]-L[x[k]]-M)^2) over all 0 <= k < i 
f(i>=j, j<2) = 0  # If we only need 0 or 1 position, SSE is 0 
f(i, j>i) = infinity # Can't choose > i positions if the rightmost chosen position is i 

Mit den oben genannten Rezidiven und Base In Fällen können wir g (n, q) berechnen, die minimal mögliche Summe von quadratischen Fehlern für das gesamte Problem. Nach memoising values of f(i, j) and g(i, j) ist die Zeit zur Berechnung aller benötigten Werte von f (i, j) O (qn^2), da es höchstens (n ​​+ 1) * (q + 1) mögliche unterschiedliche Kombinationen von Eingabeparametern gibt (i, j), und das Berechnen eines bestimmten Wertes von f (i, j) erfordert höchstens (n ​​+ 1) Iterationen der Schleife, die Werte von k auswählt, wobei jede Iteration O (1) Zeit außerhalb von rekursiven Unteralarmen benötigt. Die Speicherung von Lösungswerten von f (i, j) erfordert höchstens (n ​​+ 1) * (q + 1) oder O (qn), Raum und ebenso für g (i, j). Wie oben festgestellt, kann g (i, j) in O (1) -Zeit berechnet werden, wenn alle benötigten Werte von f (x, y) berechnet wurden, so dass g (n, q) in derselben Zeitkomplexität berechnet werden kann.

Um tatsächlich eine Lösung entsprechend dieser minimalen SSE zu rekonstruieren, können Sie die berechneten Werte von f (i, j) in umgekehrter Reihenfolge zurückverfolgen, wobei jedes Mal nach einem Wert von k gesucht wird, der einen Minimalwert in der Wiederholung erreicht (Es kann im Allgemeinen viele solche Werte von k geben), setze i auf diesen Wert von k und fahre fort bis i = 0. Dies ist eine standardmäßige dynamische Programmiertechnik.

+0

Vielen Dank für die Antwort. Während ich also durch die Lösung gehe und sie noch verstehe, scheint diese Lösung anzunehmen, dass M eine Konstante ist. Wie jedoch in dem Post angegeben, sollten die Unterschiede zwischen den L-Werten "am nächsten bei einem gegebenen ganzzahligen Wert M (L) sein, der sich über L" ändert. Daher ist M für jeden Knoten oder Wert verschieden und kann am Ende doppelt oder halb so groß sein wie der Anfang. Nachfolgende M-Werte liegen jedoch sehr nahe beieinander und ändern sich beispielsweise von 100 auf 102 oder 98. –

+0

Nach dem Lesen scheint dies kein Problem zu sein, da der mittlere quadratische Fehler nur zum vorherigen Fehler addiert wird und M basierend auf L [x [i]] und L [x [k]] gewählt werden kann. Außerdem erfordert dieser Algorithmus meines Erachtens, dass der Anfangs- und der Endwert des Vektors Teil der optimalen Kombination sind. –

+0

Ich hatte tatsächlich angenommen, dass M konstant ist, aber glücklicherweise macht es den Algorithmus überhaupt nicht schädlich, wenn er stattdessen eine Funktion des Endpunkts (oder des Anfangs oder sogar beider Punkte) jedes benachbarten Paars ausgewählter Positionen macht. –

0

Ich beantworte jetzt meinen eigenen Post mit meiner aktuellen Implementierung, um meine Post zu strukturieren und Bilder zu laden. Leider tut der Code nicht, was er tun soll. Stellen Sie sich L, M und q wie in den folgenden Bildern vor. Mit den calcf - und calcg - Funktionen berechnete ich die F - und G - Matrizen, wobei F (i + 1, j + 1) das berechnete und gespeicherte f (i, j) und G (i + 1, j + 1) von g (i , j). Die SSE der optimalen Kombination sollte G (N + 1, q + 1) sein, aber das Ergebnis ist falsch. Wenn jemand den Fehler gefunden hat, würde das sehr geschätzt werden.

G and F Matrix of given problem in the workspace. G and F are created by calculating g(N,q) via calcg(L,N,q,M).

calcf and calcg functions

Verwandte Themen