{"id":4378,"date":"2019-06-08T10:59:17","date_gmt":"2019-06-08T09:59:17","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=4378"},"modified":"2019-07-01T13:00:54","modified_gmt":"2019-07-01T12:00:54","slug":"graph-basics-of-shortest-paths","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=4378","title":{"rendered":"Graph - Basics of shortest paths"},"content":{"rendered":"<p>Shortcut links:<br \/>\n<a href=\"http:\/\/roboblog.fatal-fury.de\/?p=4295\">Basic graph definitions<\/a><br \/>\nBasics of shortest paths (this page)<\/p>\n<h2>Path lengths and distances<\/h2>\n<p>Sei &#x1D43A = (&#x1D449;, &#x1D434;) ein einfacher, gerichteter Graph und f\u00fcr jede Kante &#x1D44E; &isin; &#x1D434; sei &#x1D459;(&#x1D44E;) eine reale Nummer und die <strong>L\u00e4nge<\/strong> von &#x1D44E;.<\/p>\n<ol>\n<li>Die <strong>L\u00e4nge<\/strong> von einem gew\u00f6hnlichen Path (inklusive gew\u00f6hnliche cycles) ist die Summe von den L\u00e4ngen von allen Kanten in diesem Path.<\/li>\n<li>Abh\u00e4ngig vom Kontext, die <strong>L\u00e4nge<\/strong> von einem generalized Path (inklusive generalized cycles) ist entweder definiert identisch zu gew\u00f6hnlichen Pathen, oder die L\u00e4nge der backwards Kanten werden nicht addiert, sondern subtrahiert.<\/li>\n<li>Wenn die L\u00e4nge von einem gew\u00f6hnlichen oder generalizedn Cycle negativ ist, wird dieser Cycle einen <strong>negativen cycle<\/strong> genannt.<\/li>\n<li>F\u00fcr zwei Knoten &#x1D460;,&#x1D461; &isin; &#x1D449;, <strong>ein k\u00fcrzester Path<\/strong> von &#x1D460; nach &#x1D461; ist ein (&#x1D460;,&#x1D461;)-path mit minimaler L\u00e4nge von allen (&#x1D460;,&#x1D461;) Pathe.<\/li>\n<li>Die <strong>Distance<\/strong> von &#x1D460; nach &#x1D461; ist:\n<ul>\n<li>+unendlich wenn kein (&#x1D460;,&#x1D461;)-path existiert;<\/li>\n<li>-unendlich wenn es einen negativen cycle entlang (&#x1D460;,&#x1D461;)-path gibt;<\/li>\n<li>Die L\u00e4nge von einem k\u00fcrzesten (&#x1D460;,&#x1D461;)-path sonst;<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Note:<br \/>\nIn diesem Kontext sind ungerichtete Graphen als symmetrische gerichtete Graphen anzusehen, so dass zwei gegens\u00e4tzlich gerichtete Kanten die selbe L\u00e4nge haben.<br \/>\nWenn es keine negativen cycles gibt, ist die Distanz von einem Knoten zu sich selbst 0, weil der triviale Path ohne keinen die L\u00e4nge 0 hat. Auf der anderen seite, wenn ein Knoten in einem negativen cycle ist, ist seine Distanz zu sich selbst -unendlich.<br \/>\nWeil durch den negativen cycle ja immer ein Weg mit einer noch k\u00fcrzeren L\u00e4nge gefunden werden kann. Und negativ ist kleiner als Null.<\/p>\n<h2>Subpath property of shortest paths<\/h2>\n<p><strong>Statement<\/strong>: F\u00fcr zwei Knoten &#x1D460;,&#x1D461; &isin; &#x1D449;, sei &#x1D45D; ein k\u00fcrzester (&#x1D460;,&#x1D461;)-Path. Seit &#x1D463;,&#x1D464; &isin; &#x1D449; zwei Knoten auf dem Path &#x1D45D;, so dass &#x1D463; vor &#x1D464; liegt. Dann ist der subpath von &#x1D45D;, von &#x1D463; zu &#x1D464; ein k\u00fcrzester (&#x1D463;,&#x1D464;)-Path.<\/p>\n<p><strong>Beweis<\/strong>: Seien &#x1D45D;<sub>1<\/sub>, &#x1D45D;<sub>2<\/sub> und &#x1D45D;<sub>3<\/sub> die Subpathe von &#x1D45D; von &#x1D460; nach &#x1D463;, von &#x1D463; nach &#x1D464; und von &#x1D464; nach &#x1D461;. F\u00fcr einen Widerspruchsbeweis angenommen, es gibt einen (&#x1D463;,&#x1D464;)-paht &#x1D45D;<sub>2<\/sub>' der k\u00fcrzer ist als &#x1D45D;<sub>2<\/sub>. Dann w\u00fcrde die Aneinanderreihung der Pathe &#x1D45D;<sub>1<\/sub>+&#x1D45D;<sub>2<\/sub>'+&#x1D45D;<sub>3<\/sub> einen k\u00fcrzeren (&#x1D460;,&#x1D461;)-path als &#x1D45D; ergeben. Da &#x1D45D; aber schon der k\u00fcrzeste (&#x1D460;,&#x1D461;)-path ist, ist dies ein Widerspruch.<br \/>\nDie Subpathe eines k\u00fcrzesten Pathes sind ebenfalls k\u00fcrzeste Pathe.<\/p>\n<p><strong>Anmerkung<\/strong>: Gew\u00f6hnlich wird nur der Fall v=s beachtet. Also dass es nur zwei Pathe gibt und die Argumentation mit dem ersten Path gemacht wird. Diese Version wird auch <strong>prefix property<\/strong> genannt.<\/p>\n<h2>Valid distance property<\/h2>\n<p><strong>Definition<\/strong>: F\u00fcr jeden Knoten &#x1D462; &isin; sei &#x1D451;(&#x1D462;) eine real Zahl. Irgendeinen Zahl, muss nicht die Distanz sein. Das <strong>valid distance property<\/strong> wird erf\u00fcllt, wenn &#x1D451;(&#x1D464;)  &le; &#x1D451;(&#x1D463;) + l(&#x1D463;,&#x1D464;) f\u00fcr alle Kanten (&#x1D463;,&#x1D464;) &isin; &#x1D434;.<br \/>\nDas ist einfach so eine Definition.<\/p>\n<p><strong>Statement<\/strong>: Sei &#x1D460; aus &#x1D449; und f\u00fcr jeden Knoten &#x1D462; aus &#x1D449; sei d(&#x1D462;) die Distanz von &#x1D460; nach &#x1D462; unter Beachtung der Kantenl\u00e4ngen &#x1D459;.<br \/>\nEs sei d(&#x1D464;) &le; d(&#x1D463;) + &#x1D459;(&#x1D463;,&#x1D464;) F\u00fcr alle Kanten (&#x1D463;,&#x1D464;) aus &#x1D434;.<br \/>\nDas valid distance property ist erf\u00fcllt f\u00fcr k\u00fcrzeste Wege mit Kantenl\u00e4ngen im Graph. <\/p>\n<p>Hei\u00dft auf gut deutsch, dass es eine \"k\u00fcrzeste\" Kante von &#x1D463; nach &#x1D464; gibt und alle anderen Kanten von &#x1D463; nach &#x1D464; sind l\u00e4nger. Und da &#x1D463; ja beliebig sein kann, hei\u00dft es: Es gibt einen k\u00fcrzesten Weg nach &#x1D464; und alle andern sind l\u00e4nger.<\/p>\n<p><strong>Beweis<\/strong>: The linke Seite der Ungleichung ist die L\u00e4nge von dem k\u00fcrzesten (&#x1D460;,&#x1D464;) Path.<br \/>\nDie rechte Seite ist die L\u00e4nge von <strong>irgendeinem<\/strong> (&#x1D460;,&#x1D464;) Path (also die Aneinanderreihnug von dem k\u00fcrzesten (&#x1D460;,&#x1D463;) Path und einer Kante (&#x1D463;,&#x1D464;))<\/p>\n<p><strong>Statement distance update<\/strong>: In den meisten shortest-path algorithmen, f\u00fcr jeden Knoten &#x1D463; AUS V gibt es ein Attribut d(&#x1D463;).<br \/>\nDieses Attribut entspricht die L\u00e4nge von einem (s,&#x1D463;) Path und ist die echte Distanz von s zu &#x1D463; wenn der Algorithmus terminiert.<br \/>\nIn praktisch allen standard Algorithmen, die folgende Update Operation ist die (einzige) Operation zum updaten des d-Attributs:<br \/>\n1. W\u00e4hle eine Kante (&#x1D463;,w) AUS A<br \/>\n2. Wenn (&#x1D463;,w) das valid distance properts verletzt, also diese Kante einen k\u00fcrzeren Weg zu w erm\u00f6glicht, also d(w) > d(&#x1D463;) + l(&#x1D463;,w) dann setzte d(w) := d(&#x1D463;) + l(&#x1D463;,w)<\/p>\n<h2>Distances along shortest paths<\/h2>\n<p>Sei &#x1D460; &isin; &#x1D449; und f\u00fcr jeden Knoten &#x1D462; &isin; V sei d(&#x1D462;) die Distanz von &#x1D460; nach &#x1D462; unter Ber\u00fccksichtigung der Kantenl\u00e4ngen &#x1D459;.<\/p>\n<p><strong>Statement<\/strong>: Angenommen es gibt keine negativen Cyclen. F\u00fcr eine Kante (&#x1D463;,&#x1D464;), es ist d(&#x1D464;) = d(&#x1D463;) + &#x1D459;(&#x1D463;,&#x1D464;) genau dann wenn die Kante (&#x1D463;,&#x1D464;) die letzte Kante von einem k\u00fcrzesten (&#x1D460;,&#x1D464;) Path ist.<\/p>\n<p><strong>Beweis<\/strong>: <\/p>\n<ol>\n<li>Fall d(w) <strong>=<\/strong> d(v) + l(v,w)<br \/>\nDann hat die Aneinanderreihung von dem k\u00fcrzesten Path von s nach v und (v,w) die L\u00e4nge d(w) und damit die k\u00fcrzeste L\u00e4nge. (Weil die Kante (v,w) eben die letzte Kante im (s,w) Path ist.\n<\/li>\n<li>Fall d(w) <b>!=<\/b> d(v) + l(v,w)<br \/>\nWegen dem valid distanz property ist d(w) < d(v) + l(v,w) (Wenn der Path nicht \u00fcber die k\u00fcrzeste kante geht, dann \u00fcber eine L\u00e4ngere, also ist die Distanz auch gr\u00f6\u00dfer als die k\u00fcrzeste Distanz d(w)).\nF\u00fcr einen Widerspruchsbeweis angenommen, dass ein k\u00fcrzester (s,w) Path ist von der Form p + (v,w). Dann hat p die L\u00e4nge d(w) - l(v,w) < d(v) was ein Widerspruch zur Definition von d(v) ist.<\/li>\n<\/ol>\n<h2>Reconstruction of a shortest path from the distances<\/h2>\n<p>Angenommen, dass f\u00fcr die Knoten &#x1D460;,&#x1D461; &isin; V die Distanz d<sub>&#x1D460;<\/sub>(t) von &#x1D460; to &#x1D461; unter Beachtung der Kantenl\u00e4ngen l, welche eine reale Nummer ist (weder +inf noch -inf). Dann kann ein k\u00fcrzester (&#x1D460;,&#x1D461;) Path &#x1D45D; wie folgt konstruiert werden.<\/p>\n<ol>\n<li>Initialisiere &#x1D45D; als leer<\/li>\n<li>Setzte &#x1D464; := &#x1D461; - Wir konstruieren den Path r\u00fcckw\u00e4rts von &#x1D461; nach &#x1D460;<\/li>\n<li>While w \/= s\n<ol>\n<li>Finde eine Kante (&#x1D463;,&#x1D464;), so dass d<sub>&#x1D460;<\/sub>(&#x1D464;) = d<sub>&#x1D460;<\/sub>(&#x1D463;) + l(&#x1D463;,&#x1D464;) <\/li>\n<li>F\u00fcge die Kante (&#x1D463;,&#x1D464;) an den Anfang von &#x1D45D; an<\/li>\n<li>Setze &#x1D464; := &#x1D463;<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h2>Constructing a shortest-paths arborescence or a negative cycle<\/h2>\n<p>Wie beim Valid distance property erw\u00e4hnt, benutzen die meisten Algorithmen f\u00fcr das k\u00fcrzeste Wege Probleme eine Standard Update Operation. Diese Operation kann wie folgt erweitert werden (mit &#x1D460; f\u00fcr den Startknoten).<br \/>\nJeder Knoten v &isin; V speichert <strong>eine<\/strong> von den incoming Kanten als zus\u00e4tzliches Attribut:<\/p>\n<ol>\n<li>Initialisierung des Attributs:<br \/>\nDieses Attribut wird f\u00fcr den Knoten s mit void initialisiert.<br \/>\nF\u00fcr alle anderen Knoten v, die mit d(v) = +inf initialisiert wurden, wird dieses Attribut auch mit void initialisiert.<\/p>\n<p>Je nachdem ob die ausgehenden Kanten von s bei der Initialisierung beachtet, oder erst w\u00e4hrend der Iteration, ist die Distanz der abgehenden Knoten von s damit nicht +inf.<br \/>\nUnd das zus\u00e4tzliche Attribut dieser Knoten wird mit der initial incoming Kante (s,v) initialisiert.\n<\/li>\n<li>Update: Wann immer die Standard Update Operation auf eine Kante (v,w) angewendet wird (also das Aktualisieren von der Distanz), wird diese Kante (v,w) die incoming Kante von W. Also speichert das zus\u00e4tzliche Attribut immer die zuletzt gesehene Kante.<\/li>\n<\/ol>\n<p><strong>Statement<\/strong>:<br \/>\nBetrachte ein Algorithmus welcher ein k\u00fcrzesten (s,v) Path f\u00fcr jeden Knoten v &isin; V liefert, dabei sind die die Distanzen von s eine real Nummer (weder -inf noch +inf). <\/p>\n<p>Bei Terminierung gelten folgende Statements:<\/p>\n<ol>\n<li>Die incoming Kante von s ist void genau dann wenn s nicht auf einem negative cycle Paht liegt. (Das ist auch so, selbst wenn s auf einem positive cycle Path liegt. Weil der k\u00fcrzeste Weg von s nach t geht nicht nochmal \u00fcber s.)<\/li>\n<li>Die gespeicherten Kanten in dem zus\u00e4tzlichen Attribut bilden ein cycle genau dann wenn die erreichten Knoten einen negativen Cycle bilden. (Einen positiven cycle bilden die Knoten ja nicht, das wissen wir bereits.)<br \/>\n Jeder cycle in diesen ausgew\u00e4hlten Kanten ist ein negative cycle. (Weil es positive Cycle ja nicht gibt)<\/li>\n<li>Wenn die erreichten Knoten von s aus keinen negativen cycle enth\u00e4lt (Und positive cycle haben wir ja nicht), dann bilden die gew\u00e4hlten Kanten eine arborescene bei der der Knoten s die Wurzel ist und die arborescene spannt \u00fcber alle erreichten Knoten.<br \/>\nF\u00fcr jeden erreichbaren Knoten v &isin; V, der Path von s zu v in dieser Arborescene ist ein k\u00fcrzester (s,v)-Path. (Ja was sonst wenn man einen shortest-path Algo laufen l\u00e4sst.)<\/li>\n<\/ol>\n<p>(Was ist das Problem mit negativne cycle bei andern Algos? Die Terminieren nicht?)<\/p>\n<p><strong>Beweis<\/strong>:<br \/>\nDer Algorithmus liefert d(s) < 0 genau dann wenn s auf einem negativen cycle ist. (Positive cycle gibts ja nicht und sonst ist d(s) > 0). Genau in diesem Fall wird die incoming Kante von s geupdated.<br \/>\nDas Beweis Statement Satz 1. (Zur Erinnerung: Satz 1: Die incoming Kante von s ist void wenn NICHT negative cycle. Wenn nicht dann void.)<\/p>\n<p>(Aber woher wissen wir, dass der Algo das denn auch wirklich tut?)<\/p>\n<p>F\u00fcr den 2. Satz beachte erst, dass der zweite Satz impliziert den only-if Teil von dem ersten Satz, so m\u00fcssen wir nicht den only-if Teil von dem ersten Satz beachten.<br \/>\nSei v ein erreichbarer Knoten auf einen negative cycle. Sei p ein Path auf ausgew\u00e4hlten Kanten welcher in v endet.<br \/>\nIm Besonderen, lass p eine maximale anzahl voN Kanten von allen m\u00f6glichen dieser Pathe.<br \/>\nDann p kann nicht an s starte, weil der algorithmus wird eine distanz Wert f\u00fcr v liefern, welcher kleiner ist als die echte Distanz.<br \/>\nKlar, p cann nicht an einem unreachable Knoten starten. Super Klar.<\/p>\n<h2>(Admissible\/zul\u00e4ssige) node potentials<\/h2>\n<p>F\u00fcr jeden Knoten &#x1D463; &isin; &#x1D449;, sei h(&#x1D463;) eine reale Nummer.<br \/>\nF\u00fcr Kante &#x1D44E; = (&#x1D463;,&#x1D464;) &isin; &#x1D434;, sei &#x1D459;<sup>h<\/sup>(&#x1D44E;) := &#x1D459;(&#x1D44E;) - h(&#x1D463;) + h(&#x1D464;)<br \/>\nIn diesem Kontext, diese Werte werden gew\u00f6hnliche node potential genannt.<br \/>\nNode potentials sind zul\u00e4ssig wenn &#x1D459;(&#x1D44E;) >= 0 f\u00fcr alle &#x1D44E; &isin; &#x1D434;. Also Kantengewicht(l\u00e4nge) positiv ist.<\/p>\n<p><strong>Statement:<\/strong><br \/>\nEin (&#x1D460;,&#x1D461;)-path ist k\u00fcrzer als ein anderer (&#x1D460;,&#x1D461;)-path unter der Ber\u00fccksichtigung der Kantenl\u00e4ngen &#x1D459;<sup>h<\/sup>, genau dann wenn die selbe Aussage auch wahr ist f\u00fcr die Kantenl\u00e4ngen &#x1D459;. Also die shortest path Algorithmen funktionieren auch weiterhin.<br \/>\nIm Besonderen, der k\u00fcrzeste Path unter Ber\u00fccksichtigung der Kantenl\u00e4ngen &#x1D459;<sup>h<\/sup> ist exakt der selbe k\u00fcrzeste Path unter Beachtung der Kantenl\u00e4ngen &#x1D459;. Also die Algorithmen geben sogar das selbe Ergebnis zur\u00fcck. Wir haben nichts kaputt gemacht. Nur verbesser. <\/p>\n<p><strong>Beweis:<\/strong><br \/>\nSet &#x1D460; = &#x1D463;<sub>1<\/sub> - &#x1D463;<sub>2<\/sub> - ... - &#x1D463;<sub>k<\/sub> = &#x1D461; die Knoten auf einem (&#x1D460;,&#x1D461;)-path. Gemein ist dass s = &#x1D463;<sub>1<\/sub>  und t = &#x1D463;<sub>k<\/sub><br \/>\nDie L\u00e4nge auf diesem Path unter Ber\u00fccksichtigung von &#x1D459;<sup>h<\/sup> ist dann *einsetzen und umformen von &#x1D459;<sup>h<\/sup>  und &#x1D459; *<br \/>\nAlso: Die L\u00e4nge von einem (&#x1D460;,&#x1D461;)-path unter Ber\u00fccksichtigung von &#x1D459;<sup>h<\/sup> und &#x1D459;, unterscheidet sich nur durch eine Konstante h(&#x1D461;) - h(&#x1D460;).<\/p>\n<p>Ist ja auch klar: Wenn f\u00fcr jede Kante h(&#x1D463;) subtrahiert und h(&#x1D464;) addiert wird, und bei der n\u00e4chsten Kante im Path w mit dem n\u00e4chsten v tauscht. Dann heben sich die Termen in dieser Summe bis auf den ersten und letzten auf.<\/p>\n<p><strong>Anmerkung:<\/strong><br \/>\nAdmissible\/zul\u00e4ssige node potential erm\u00f6glichen effiziente Algorithmen wie Dijkstra, welche nicht-negative Kanten L\u00e4ngen erwarten. Durch die node potentials kann man negative Kanten L\u00e4ngen ins positive ziehen.<\/p>\n<p>G<br \/>\n&#x1D43A<br \/>\nV<br \/>\n&#x1D449;<br \/>\nA<br \/>\n&#x1D434;<br \/>\nE<br \/>\n&#x1D438;<br \/>\nK<br \/>\n&#x1D43E;<br \/>\na<br \/>\n&#x1D44E;<br \/>\nk<br \/>\n&#x1D458;<br \/>\nl<br \/>\n&#x1D459;<br \/>\nm<br \/>\n&#x1D45A;<br \/>\nn<br \/>\n&#x1D45B;<br \/>\np<br \/>\n&#x1D45D;<br \/>\ns<br \/>\n&#x1D460;<br \/>\nt<br \/>\n&#x1D461;<br \/>\nu<br \/>\n&#x1D462;<br \/>\nv<br \/>\n&#x1D463;<br \/>\nw<br \/>\n&#x1D464;<br \/>\nTeilemenge<br \/>\n&sube;<br \/>\nphi<br \/>\n&phi;<br \/>\nElement von<br \/>\n&isin;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Shortcut links: Basic graph definitions Basics of shortest paths (this page) Path lengths and distances Sei &#x1D43A = (&#x1D449;, &#x1D434;) ein einfacher, gerichteter Graph und f\u00fcr jede Kante &#x1D44E; &isin; &#x1D434; sei &#x1D459;(&#x1D44E;) eine reale Nummer und die L\u00e4nge von &#x1D44E;. Die L\u00e4nge von einem gew\u00f6hnlichen Path (inklusive gew\u00f6hnliche cycles) ist die Summe von den [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-4378","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4378"}],"version-history":[{"count":30,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4378\/revisions"}],"predecessor-version":[{"id":4457,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/4378\/revisions\/4457"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4378"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}