<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=K%C3%BCrzester_Pfad</id>
	<title>Kürzester Pfad - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=K%C3%BCrzester_Pfad"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=K%C3%BCrzester_Pfad&amp;action=history"/>
	<updated>2026-06-27T07:21:49Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=K%C3%BCrzester_Pfad&amp;diff=289315&amp;oldid=prev</id>
		<title>imported&gt;Hfst: SSSP verweist hier hin</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=K%C3%BCrzester_Pfad&amp;diff=289315&amp;oldid=prev"/>
		<updated>2025-11-02T15:46:45Z</updated>

		<summary type="html">&lt;p&gt;SSSP verweist hier hin&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[File:Shortest path with direct weights.svg|thumb|upright=1.2|Kürzester Pfad (A, C, E, D, F), blau, zwischen den Knoten A und F in einem gewichteten [[gerichteter Graph|gerichteten Graph]]]]&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;kürzester Pfad&amp;#039;&amp;#039;&amp;#039; ist in der [[Graphentheorie]] ein [[Weg (Graphentheorie)|Pfad]] zwischen zwei unterschiedlichen [[Knoten (Graphentheorie)|Knoten]] &amp;lt;math&amp;gt;s,t \in V&amp;lt;/math&amp;gt; eines [[Graph (Graphentheorie)|Graphen]], welcher minimale Länge bezüglich einer [[Kantengewicht|Kantengewichtsfunktion]] &amp;lt;math&amp;gt;c\colon E \to \mathbb{R}&amp;lt;/math&amp;gt; hat.&lt;br /&gt;
Haben die [[Kante (Graphentheorie)|Kanten]] im Graphen alle das Gewicht 1, ist also &amp;lt;math&amp;gt;c(e) = 1&amp;lt;/math&amp;gt; für alle Kanten &amp;lt;math&amp;gt;e \in E&amp;lt;/math&amp;gt;, so ist der kürzeste Pfad ein &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;–&amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-Pfad mit der geringstmöglichen Anzahl von Kanten zwischen &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Aufgabe für einen gegebenen Graph einen kürzesten Pfad zu berechnen, ist ein [[Optimierungsproblem]] und wird in der Literatur oft als Shortest Path Problem oder Single-Source Shortest Path (&amp;#039;&amp;#039;&amp;#039;SSSP&amp;#039;&amp;#039;&amp;#039;)  bezeichnet&amp;lt;ref&amp;gt;[[Bernhard Korte]], [[Jens Vygen]]: &amp;#039;&amp;#039;Combinatorial Optimization. Theory and Algorithms.&amp;#039;&amp;#039; 4th edition. Springer, Berlin u. a. 2008, ISBN 978-3-540-71844-4 (&amp;#039;&amp;#039;Algorithms and Combinatorics&amp;#039;&amp;#039; 21)&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Komplexität ==&lt;br /&gt;
Die Komplexität hängt maßgeblich von der Art der Gewichtsfunktion ab und davon, ob Pfade oder [[Kantenzug|Kantenzüge]] betrachtet werden.&lt;br /&gt;
In Kantenzüge können sich Knoten und Kanten wiederholen, während Pfade keinen Knoten doppelt verwenden.&lt;br /&gt;
Man unterscheidet drei Arten von Gewichtsfunktionen:&lt;br /&gt;
*Gewichtsfunktionen ohne negative Gewichte;&lt;br /&gt;
*Konservative Gewichtsfunktion: Eine Gewichtsfunktion heißt &amp;#039;&amp;#039;konservativ&amp;#039;&amp;#039; für den Graphen &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;, wenn &amp;lt;math&amp;gt;c(C) = \sum_{e \in C} c(e) \geq 0&amp;lt;/math&amp;gt; für alle [[Zyklus (Graphentheorie)|Zyklen]] &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; von &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;;&lt;br /&gt;
*Gewichtsfunktionen mit beliebigen Gewichten.&lt;br /&gt;
&lt;br /&gt;
Die genaue Problemformulierung ist entscheidend um die Komplexitätsfrage beantworten zu können.&lt;br /&gt;
&lt;br /&gt;
; Ohne negative Gewichte:Mit [[Dijkstra-Algorithmus|Dijkstras Algorithmus]] kann man das Problem in einer Laufzeit von &amp;lt;math&amp;gt;O(m + n \cdot \log(n))&amp;lt;/math&amp;gt; lösen, wobei &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; die Anzahl der Kanten und &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; die Anzahl der Knoten im Graphen bezeichnen. Man beachte, dass die kürzesten Pfade auch kürzeste Kantenzüge sind. Sind alle Gewichte echt positiv, stimmen die kürzesten Pfade mit den kürzesten Kantenzügen überein.&lt;br /&gt;
; Mit beliebigen Gewichten und mit Kantenzügen: Falls der Graph einen Zyklus enthält, bei dem die Summe über die Gewichte strikt negativ ist, dann gibt es Knoten &amp;lt;math&amp;gt;s,t&amp;lt;/math&amp;gt;, die keinen kürzesten Kantenzug haben. Wenn es einen Kantenzug von &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; zu diesem Zykel gibt und einen Kantenzug von diesem Zykel zu &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;, dann kann man einen beliebig kurzen Kantenzug von &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; nach &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; erzeugen, indem der Zyklus nur hinreichend oft durchlaufen wird. Der Algorithmus von [[Bellman-Ford]] kann in einer Laufzeit von &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt; einen kürzesten Kantenzug finden (falls es ihn gibt) oder beweisen, dass es keinen gibt, indem ein negativer Zyklus gefunden wird. Das Entscheidungsproblem, ob es einen Pfad der Länge &amp;lt;math&amp;gt;\leq C&amp;lt;/math&amp;gt; gibt, lässt sich damit in [[Polynomialzeit]] lösen.&lt;br /&gt;
; Mit beliebigen Gewichten und mit Pfaden: Diese Variante des Problems ist [[NP-schwer]]. Dies kann zum Beispiel durch eine Reduktion vom NP-schweren [[Hamiltonpfadproblem]] bewiesen werden, indem beim Kürzester-Pfad-Problem alle Gewichte auf −1 gesetzt werden. Man beachtet, dass diese Konstruktion negative Zyklen enthält, und deswegen gilt die NP-Schwere nicht für konservative Gewichtsfunktionen.&lt;br /&gt;
; Konservative Gewichtsfunktion und mit Pfaden: Der Algorithmus von [[Bellman-Ford]] kann in einer Laufzeit von &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt; einen kürzesten Pfad finden.&lt;br /&gt;
&lt;br /&gt;
Die Literatur beschränkt sich meistens auf nichtnegative Gewichte oder konservative Gewichtsfunktion.&lt;br /&gt;
Mit einer dieser Zusatzforderungen ist jeder kürzeste Pfad automatisch ein kürzester Kantenzug und deswegen wird in der Literatur diese Unterscheidung oft nicht gemacht.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zum Problem des kürzesten Pfades, ist das Problem des [[Längster Pfad|längsten Pfades]] sogar für ungewichtete Graphen [[NP-Schwere|NP-schwer]].&lt;br /&gt;
&lt;br /&gt;
== Variationen des Problems ==&lt;br /&gt;
Abgesehen von der Bestimmung eines kürzesten &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;–&amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-Pfades gibt es noch einige weitere, jedoch sehr ähnliche Probleme:&lt;br /&gt;
&lt;br /&gt;
=== Single-source shortest path (SSSP) ===&lt;br /&gt;
Diese Variante befasst sich mit dem Problem, wie man die kürzesten Wege zwischen einem gegebenen Startknoten und allen übrigen Knoten eines Graphen berechnet.&lt;br /&gt;
Für nichtnegative Gewichtsfunktionen lassen sich der [[Dijkstra-Algorithmus]] bzw. der [[A*-Algorithmus]] anpassen, um die kürzesten Wege zu allen Knoten des Graphs zu berechnen.&lt;br /&gt;
Für beliebige konservative Gewichtsfunktionen berechnet der Bellman-Ford-Algorithmus andererseits stets auch die kürzesten Pfade zu allen anderen Knoten.&lt;br /&gt;
&lt;br /&gt;
=== Single-destination shortest path (SDSP) ===&lt;br /&gt;
Ziel ist hier die Bestimmung eines kürzesten Pfades zwischen einem Endknoten und allen anderen Knoten des Graphen.&lt;br /&gt;
Dieses Problem kann durch eine Umkehrung der Kantenrichtungen als SSSP beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== All-pairs shortest path (APSP) ===&lt;br /&gt;
In dieser Variante geht es um die Bestimmung der kürzesten Pfade zwischen allen Knotenpaaren eines Graphen. Abhängig von der Gewichtsfunktion ist es effizienter, für jeden Knoten nacheinander das SSSP lösen oder jedoch spezialisierte Verfahren wie etwa den [[Floyd-Warshall-Algorithmus]] oder den [[Min-Plus-Matrixmultiplikations-Algorithmus]] zu verwenden, die gleichzeitig für alle Paare kürzeste Pfade bestimmen.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
[[Datei:Prim Algorithm 0.png|200px|mini|Beispielgraph]]&lt;br /&gt;
Im abgebildeten gegebenen Graphen ist ein kürzester Pfad zwischen den Knoten &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; der Pfad, welcher in &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; startet, und über &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; nach &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; geht. Die Pfadkosten betragen hierbei &amp;lt;math&amp;gt;9+8=17&amp;lt;/math&amp;gt;.&lt;br /&gt;
Will man jedoch einen Pfad von &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; nach &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; finden, so ist der direkte Weg mit Kosten von &amp;lt;math&amp;gt;15&amp;lt;/math&amp;gt; nicht der kürzestmögliche Pfad, da der Weg von &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; über &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt; nach &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt; nur Kosten von &amp;lt;math&amp;gt;14=8+6&amp;lt;/math&amp;gt; hat.&lt;br /&gt;
&lt;br /&gt;
== Formulierung als lineares Programm ==&lt;br /&gt;
Zur Bestimmung eines kürzesten Pfades lässt sich außerdem ein [[Lineare Optimierung|lineares Programm]] heranziehen. Man interpretiert in diesem Fall den Pfad als [[Flüsse und Schnitte in Netzwerken|Fluss]] mit einem Flusswert von 1 auf den Kanten des Graphen. Die Bestimmung des kürzesten Pfades ist dann ein Spezialfall des Min-cost-flow-Problems. Die entsprechende Formulierung lautet:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\min        &amp;amp; \sum_{e \in E} c_e x_e \\&lt;br /&gt;
\text{so dass } &amp;amp; \forall \; v \in V\colon\;&lt;br /&gt;
                  \sum_{e \in \operatorname{\delta^-}(v)} x_e - \sum_{e \in \operatorname{\delta^+}(v)} x_e&lt;br /&gt;
                  = &lt;br /&gt;
                    \begin{cases}&lt;br /&gt;
                    -1,&amp;amp; \text{falls } v = s \\&lt;br /&gt;
                     1,&amp;amp; \text{falls } v = t \\&lt;br /&gt;
                     0,&amp;amp; \text{sonst }&lt;br /&gt;
                    \end{cases} \\&lt;br /&gt;
                &amp;amp; \forall \; e \in E\colon\; x_e \geq 0 \\&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Falls ein &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;–&amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-Pfad im gegebenen Graphen existiert, so hat das Programm eine [[Lineare Optimierung#Lösbarkeit aus theoretischer Sicht|zulässige]] Lösung.&lt;br /&gt;
Das Programm ist allerdings unbeschränkt, wenn die Gewichtsfunktion nicht konservativ ist. In diesem Fall kann der Fluss nämlich entlang eines Zykels mit negativen Kosten beliebig weit erhöht werden. Andernfalls hat das Problem eine Optimallösung &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;, welche einem &amp;lt;math&amp;gt;0/1&amp;lt;/math&amp;gt;-Vektor mit &amp;lt;math&amp;gt;|E|&amp;lt;/math&amp;gt; Einträgen entspricht.&lt;br /&gt;
Die Menge &amp;lt;math&amp;gt;\{e \in E \,:\, x_e = 1 \}&amp;lt;/math&amp;gt; beschreibt dann einen kürzesten &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;–&amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-Pfad, der Zielfunktionswert des Programms entspricht der Länge des Pfades.&lt;br /&gt;
&lt;br /&gt;
== Knotenpotentiale ==&lt;br /&gt;
Es stellt sich heraus, dass  die [[Lineare Optimierung#Dualität|Dualisierung]] des obigen linearen Programms eine anschauliche Interpretation hat. Das duale Programm ist gegeben durch&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{align}&lt;br /&gt;
\max{}        &amp;amp; y_t - y_s \\&lt;br /&gt;
\text{so dass } &amp;amp; \forall \; e=(u,v) \in E\colon\; y_v - y_u \leq c_e   \;\;&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Lösung &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; des dualen Programms nennt man ein &amp;#039;&amp;#039;Knotenpotential&amp;#039;&amp;#039;. Man sieht leicht, dass für jede Lösung &amp;lt;math&amp;gt;(y_v)_{v \in V}&amp;lt;/math&amp;gt; der Vektor &amp;lt;math&amp;gt;(y_v + \delta)_{v \in V}&amp;lt;/math&amp;gt;&lt;br /&gt;
ebenfalls eine Lösung ist, wobei man &amp;lt;math&amp;gt;\delta \in \mathbb{R}&amp;lt;/math&amp;gt; beliebig wählen kann. Man setzt in der Regel den Wert von &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; so, dass &amp;lt;math&amp;gt;y_s = 0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Die Zielfunktion ist dann gegeben durch &amp;lt;math&amp;gt;\max \; y_t&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ist &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; ein beliebiger Pfad zwischen &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; und einem Knoten &amp;lt;math&amp;gt;w \neq s&amp;lt;/math&amp;gt;, so lässt sich die Länge des Pfades wie folgt abschätzen:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
 c(P) = \sum_{e \in P} c_e \geq \sum_{e=(u,v) \in P} y_v - y_u = y_w&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Potential eines jeden Knotens ist also eine untere Schranke für die Länge eines Pfades. Eine Optimallösung des dualen Programms findet man, wenn man das Potential eines Knotens &amp;lt;math&amp;gt;w \neq s&amp;lt;/math&amp;gt;&lt;br /&gt;
als die Länge des kürzesten &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;–&amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;-Pfades bezüglich der Zielfunktion &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; setzt.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
{{Siehe auch|Pathfinding}}&lt;br /&gt;
&lt;br /&gt;
Algorithmen, die einen kürzesten Pfad berechnen, finden häufig Anwendung in der Berechnung von Reiserouten. So kann zum Beispiel die Entfernung zwischen zwei Städten berechnet werden. Dabei sind die Städte die Knoten des Graphen und die Straßen die Kanten. Verschiedene Algorithmen sind in der freien [[Python (Programmiersprache)|Python]]-[[Programmbibliothek|Bibliothek]] [[NetworkX]] implementiert.&amp;lt;ref&amp;gt;{{Internetquelle |autor= |url=https://networkx.github.io/documentation/stable/reference/algorithms/shortest_paths.html |titel=Algorithms - Shortest Paths |werk=NetworkX 2.2 documentation |hrsg= |datum= |zugriff=2018-10-24 |sprache=en}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kürzeste Wege mit Nebenbedingungen ==&lt;br /&gt;
Eine Verallgemeinerung des Problems erhält man, wenn man nur &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;–&amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-Pfade&lt;br /&gt;
&amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; betrachtet, die der zusätzlichen Ungleichung &amp;lt;math&amp;gt;\sum_{e \in P} u_e \leq U&amp;lt;/math&amp;gt; gehorchen. Dabei ist&lt;br /&gt;
&amp;lt;math&amp;gt;u \colon E \to \mathbb{R}_+ &amp;lt;/math&amp;gt; eine weitere Gewichtsfunktion und &amp;lt;math&amp;gt;U&amp;lt;/math&amp;gt; eine [[reelle Zahl]].&lt;br /&gt;
&lt;br /&gt;
Das resultierende &amp;#039;&amp;#039;Constrained Shortest Path Problem&amp;#039;&amp;#039; ist dann auch für konservative bzw. nichtnegative Zielfunktionen NP-schwer, siehe H. C. Joksch (1966).&amp;lt;ref&amp;gt;H. C. Joksch (1966)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{BibISBN|0262032937}}&lt;br /&gt;
* Thomas H. Cormen, [[Charles E. Leiserson]], [[Ronald L. Rivest]], Clifford Stein: &amp;#039;&amp;#039;Algorithmen – Eine Einführung&amp;#039;&amp;#039;. 2. Auflage. 2007. ISBN 978-3-486-58262-8&lt;br /&gt;
* H. C. Joksch (1966). &amp;#039;&amp;#039;The shortest route problem with constraints&amp;#039;&amp;#039;. [[Journal of Mathematical Analysis and Applications |J. Math. Anal. Appl.]] 14, Seite 191–197&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Kurzester Pfad}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Graphentheorie]]&lt;br /&gt;
[[Kategorie:Reise- und Routenplanung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Hfst</name></author>
	</entry>
</feed>