<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>http://gis.inf.elte.hu/giswiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Benek</id>
	<title>GIS Wiki - Szerkesztő közreműködései [hu]</title>
	<link rel="self" type="application/atom+xml" href="http://gis.inf.elte.hu/giswiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Benek"/>
	<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/wiki/Speci%C3%A1lis:Szerkeszt%C5%91_k%C3%B6zrem%C5%B1k%C3%B6d%C3%A9sei/Benek"/>
	<updated>2026-05-13T17:30:47Z</updated>
	<subtitle>Szerkesztő közreműködései</subtitle>
	<generator>MediaWiki 1.31.7</generator>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=231</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=231"/>
		<updated>2016-06-04T15:49:01Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldhatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forrásalgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, input és output paraméterek megadásával a felhasználók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039;: C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni,&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. sorszámú csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták (&amp;lt;code&amp;gt;x1, x2, y1, y2&amp;lt;/code&amp;gt;), &lt;br /&gt;
*	név (&amp;lt;code&amp;gt;osm_name&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	csomópont azonosító (&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	lehetséges továbbhaladási irány (&amp;lt;code&amp;gt;osm_source_id, osm_target_id&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	útszakasz hossza (&amp;lt;code&amp;gt;km&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	megengedett sebesség (&amp;lt;code&amp;gt;kmh&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	költség (&amp;lt;code&amp;gt;cost&amp;lt;/code&amp;gt;),&lt;br /&gt;
*       geometria (&amp;lt;code&amp;gt;geom_way&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Szakirodalom ==&lt;br /&gt;
&lt;br /&gt;
* Regina O. Obe, Leo S. Hsu. [https://locatepress.com/pgrouting &amp;quot;pgRouting: A Practical Guide&amp;quot;], &amp;#039;&amp;#039;Locate Press&amp;#039;&amp;#039;, 2016.&lt;br /&gt;
* Regina O. Obe, Leo S. Hsu. [https://www.manning.com/books/postgis-in-action-second-edition &amp;quot;PostGIS in Action (Second Edition)&amp;quot;], &amp;#039;&amp;#039;Manning Publictions&amp;#039;&amp;#039; (ISBN 9781617291395). 2015. pp 286-290.&lt;br /&gt;
* Lijing Zhang, Xuanhui He. [http://link.springer.com/chapter/10.1007%2F978-3-642-25349-2_133 &amp;quot;Route Search Base on pgRouting&amp;quot;], &amp;#039;&amp;#039;Software Engineering and Knowledge Engineering: Theory and Practice Vol 2.&amp;#039;&amp;#039;. Springer-Verlag Berlin Heidelberg, 2012. pp 1003-1007.&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 OpenStreetMap fájl betöltése Osm2Po-val és útvonalkeresés]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=230</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=230"/>
		<updated>2016-06-03T09:59:39Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Kapcsolódó alkalmazások */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039;: C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni,&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
A [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja vezetési távolság] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták (&amp;lt;code&amp;gt;x1, x2, y1, y2&amp;lt;/code&amp;gt;), &lt;br /&gt;
*	név (&amp;lt;code&amp;gt;osm_name&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	csomópont azonosító (&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	lehetséges továbbhaladási irány (&amp;lt;code&amp;gt;osm_source_id, osm_target_id&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	útszakasz hossza (&amp;lt;code&amp;gt;km&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	megengedett sebesség (&amp;lt;code&amp;gt;kmh&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	költség (&amp;lt;code&amp;gt;cost&amp;lt;/code&amp;gt;),&lt;br /&gt;
*       geometria (&amp;lt;code&amp;gt;geom_way&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Szakirodalom ==&lt;br /&gt;
&lt;br /&gt;
* Regina O. Obe, Leo S. Hsu. [https://www.manning.com/books/postgis-in-action-second-edition &amp;quot;PostGIS in Action&amp;quot;], &amp;#039;&amp;#039;Manning Publictions&amp;#039;&amp;#039; (ISBN 9781617291395). 2015. pp 286-290.&lt;br /&gt;
* Lijing Zhang, Xuanhui He. [http://link.springer.com/chapter/10.1007%2F978-3-642-25349-2_133 &amp;quot;Route Search Base on pgRouting&amp;quot;], &amp;#039;&amp;#039;Software Engineering and Knowledge Engineering: Theory and Practice Vol 2.&amp;#039;&amp;#039;. Springer-Verlag Berlin Heidelberg, 2012. pp 1003-1007.&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 OpenStreetMap fájl betöltése Osm2Po-val és útvonalkeresés]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=229</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=229"/>
		<updated>2016-06-03T09:59:21Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Kapcsolódó alkalmazások */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039;: C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni,&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
A [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja vezetési távolság] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták (&amp;lt;code&amp;gt;x1, x2, y1, y2&amp;lt;/code&amp;gt;), &lt;br /&gt;
*	név (&amp;lt;code&amp;gt;osm_name&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	csomópont azonosító (&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	lehetséges továbbhaladási irány (&amp;lt;code&amp;gt;osm_source_id, osm_target_id&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	útszakasz hossza (&amp;lt;code&amp;gt;km),&lt;br /&gt;
*	megengedett sebesség (&amp;lt;code&amp;gt;kmh&amp;lt;/code&amp;gt;),&lt;br /&gt;
*	költség (&amp;lt;code&amp;gt;cost&amp;lt;/code&amp;gt;),&lt;br /&gt;
*       geometria (&amp;lt;code&amp;gt;geom_way&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Szakirodalom ==&lt;br /&gt;
&lt;br /&gt;
* Regina O. Obe, Leo S. Hsu. [https://www.manning.com/books/postgis-in-action-second-edition &amp;quot;PostGIS in Action&amp;quot;], &amp;#039;&amp;#039;Manning Publictions&amp;#039;&amp;#039; (ISBN 9781617291395). 2015. pp 286-290.&lt;br /&gt;
* Lijing Zhang, Xuanhui He. [http://link.springer.com/chapter/10.1007%2F978-3-642-25349-2_133 &amp;quot;Route Search Base on pgRouting&amp;quot;], &amp;#039;&amp;#039;Software Engineering and Knowledge Engineering: Theory and Practice Vol 2.&amp;#039;&amp;#039;. Springer-Verlag Berlin Heidelberg, 2012. pp 1003-1007.&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 OpenStreetMap fájl betöltése Osm2Po-val és útvonalkeresés]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=228</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=228"/>
		<updated>2016-06-03T09:57:34Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Szakirodalom */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039;: C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni,&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
A [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja vezetési távolság] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták (x1, x2, y1, y2), &lt;br /&gt;
*	név (osm_name),&lt;br /&gt;
*	csomópont azonosító (id),&lt;br /&gt;
*	lehetséges továbbhaladási irány (osm_source_id, osm_target_id),&lt;br /&gt;
*	útszakasz hossza (km),&lt;br /&gt;
*	megengedett sebesség (kmh),&lt;br /&gt;
*	költség (cost),&lt;br /&gt;
*       geometria (geom_way).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Szakirodalom ==&lt;br /&gt;
&lt;br /&gt;
* Regina O. Obe, Leo S. Hsu. [https://www.manning.com/books/postgis-in-action-second-edition &amp;quot;PostGIS in Action&amp;quot;], &amp;#039;&amp;#039;Manning Publictions&amp;#039;&amp;#039; (ISBN 9781617291395). 2015. pp 286-290.&lt;br /&gt;
* Lijing Zhang, Xuanhui He. [http://link.springer.com/chapter/10.1007%2F978-3-642-25349-2_133 &amp;quot;Route Search Base on pgRouting&amp;quot;], &amp;#039;&amp;#039;Software Engineering and Knowledge Engineering: Theory and Practice Vol 2.&amp;#039;&amp;#039;. Springer-Verlag Berlin Heidelberg, 2012. pp 1003-1007.&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 OpenStreetMap fájl betöltése Osm2Po-val és útvonalkeresés]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=227</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=227"/>
		<updated>2016-06-03T09:57:08Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039;: C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni,&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
A [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja vezetési távolság] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták (x1, x2, y1, y2), &lt;br /&gt;
*	név (osm_name),&lt;br /&gt;
*	csomópont azonosító (id),&lt;br /&gt;
*	lehetséges továbbhaladási irány (osm_source_id, osm_target_id),&lt;br /&gt;
*	útszakasz hossza (km),&lt;br /&gt;
*	megengedett sebesség (kmh),&lt;br /&gt;
*	költség (cost),&lt;br /&gt;
*       geometria (geom_way).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Szakirodalom ==&lt;br /&gt;
&lt;br /&gt;
* Regina O. Obe, Leo S. Hsu. [https://www.manning.com/books/postgis-in-action-second-edition &amp;quot;PostGIS in Action&amp;quot;], &amp;#039;&amp;#039;Manning Publictions&amp;#039;&amp;#039; (ISBN 9781617291395). 2015. 286-290.&lt;br /&gt;
* Lijing Zhang, Xuanhui He. [http://link.springer.com/chapter/10.1007%2F978-3-642-25349-2_133 &amp;quot;Route Search Base on pgRouting&amp;quot;], &amp;#039;&amp;#039;Software Engineering and Knowledge Engineering: Theory and Practice Vol 2.&amp;#039;&amp;#039;. Springer-Verlag Berlin Heidelberg, 2012. 1003-1007.&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 OpenStreetMap fájl betöltése Osm2Po-val és útvonalkeresés]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=226</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=226"/>
		<updated>2016-06-03T09:36:51Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Kapcsolódó alkalmazások */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039;: C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni,&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
A [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja vezetési távolság] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták (x1, x2, y1, y2), &lt;br /&gt;
*	név (osm_name),&lt;br /&gt;
*	csomópont azonosító (id),&lt;br /&gt;
*	lehetséges továbbhaladási irány (osm_source_id, osm_target_id),&lt;br /&gt;
*	útszakasz hossza (km),&lt;br /&gt;
*	megengedett sebesség (kmh),&lt;br /&gt;
*	költség (cost),&lt;br /&gt;
*       geometria (geom_way).&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=225</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=225"/>
		<updated>2016-06-03T09:31:16Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Használat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039;: C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni,&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
A [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja vezetési távolság] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták  [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=224</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=224"/>
		<updated>2016-06-03T09:30:50Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Telepítés, Architektúra */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039;: C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
A [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja vezetési távolság] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták  [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=223</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=223"/>
		<updated>2016-06-03T09:30:18Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A &amp;#039;&amp;#039;&amp;#039;pgRouting&amp;#039;&amp;#039;&amp;#039; egy &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Ny%C3%ADlt_forr%C3%A1sk%C3%B3d%C3%BA_szoftver nyílt forráskódú]&amp;lt;/span&amp;gt;, &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/C%2B%2B C++]&amp;lt;/span&amp;gt;-ban írt bővítmény a [[PostGIS]]/&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/PostgreSQL PostgreSQL]&amp;lt;/span&amp;gt; térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez.&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039; C/C++ kód az algoritmushoz.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	Vektoros adatok konverziója.&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop,&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Dijkstra-algoritmus Dijkstra algoritmus]&amp;lt;/span&amp;gt; egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az [https://en.wikipedia.org/wiki/A*_search_algorithm &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Yen%27s_algorithm Yen algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm Floyd-Warshall algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A [https://en.wikipedia.org/wiki/Johnson%27s_algorithm Johnson algoritmus] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja utazó ügynök probléma] a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
A [https://hu.wikipedia.org/wiki/Az_utaz%C3%B3_%C3%BCgyn%C3%B6k_probl%C3%A9m%C3%A1ja vezetési távolság] egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például [[OpenStreetMap]] (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az [[OSM2PO]]  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták  [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Külső hivatkozások ==&lt;br /&gt;
* [http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
* [http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=200</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=200"/>
		<updated>2016-05-22T18:58:29Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Telepítés, Architektúra */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039; C/C++ kód az algoritmushoz&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
 cd pgrouting&lt;br /&gt;
 cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
 make&lt;br /&gt;
 sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták  [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
[http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
[http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
[http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=199</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=199"/>
		<updated>2016-05-22T18:55:01Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Telepítés, Architektúra */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Az src mappa minden könyvtárában &amp;lt;code&amp;gt;doc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sql&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; almappák találhatók, melyekbe értelemszerűen a következők kerülnek:&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;doc&amp;#039;&amp;#039;&amp;#039;: Az adott algoritmushoz szükséges összes dokumentáció ReStructuredText formátumban. Ennek célja, hogy a függvények leírásával, inpu és output paraméterek megadásával a felhazsnálók számára érthetővé tegye, hogyan működik az algoritmus.&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;sql&amp;#039;&amp;#039;&amp;#039;: Az sql burkolók a C kódhoz&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;src&amp;#039;&amp;#039;&amp;#039; C/C++ kód az algoritmushoz&lt;br /&gt;
*&amp;#039;&amp;#039;&amp;#039;test&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;test.conf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*.test&amp;lt;/code&amp;gt;, és &amp;lt;code&amp;gt;*.rest&amp;lt;/code&amp;gt; fájlok az algoritmus teszteléséhez.&lt;br /&gt;
&lt;br /&gt;
Fejlesztési célból a programot klónozhatjuk Git-en keresztül, majd telepítjük a következők szerint:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
git clone git@github.com:pgRouting/pgrouting.git&lt;br /&gt;
cd pgrouting&lt;br /&gt;
cmake -DWITH_TSP=ON -DWITH_DD=ON .&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták  [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
[http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
[http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
[http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=198</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=198"/>
		<updated>2016-05-22T18:44:12Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés, Architektúra ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A pgRouting két fő összetevőből áll:&lt;br /&gt;
* Egy C modul, amely egy PostgreSQL-ben átadott lekérdezést használ a gráf felépítéséhez&lt;br /&gt;
* C++ modulok, amelyek a lekérdezést úgynevezett boost gráffá alakítják, és futtatják az útvonal-választást.&lt;br /&gt;
&lt;br /&gt;
Hogy mely összetevőt használja a program futása során, az az algoritmus fajtájától függ.&lt;br /&gt;
&lt;br /&gt;
A függvénykönyvtár szerkezete pedig a következőképp néz ki:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
cmake/                 - cmake fájlok&lt;br /&gt;
  CMakeLists.txt         - Top level cmake &lt;br /&gt;
  doc/                   - Top level doc, a nem forráslgoritmus-specifikus dokumentáció helye&lt;br /&gt;
    themes/              - Sphinx téma a doc-nak&lt;br /&gt;
    static/              - dokumentáció képei&lt;br /&gt;
  src/                  &lt;br /&gt;
    astar/               - A* algoritmus&lt;br /&gt;
    common/              - pgRouting projektekben szükséges közös fájlok&lt;br /&gt;
    dijkstra/            - Dijkstra algoritmus&lt;br /&gt;
    driving_distance/    - Vezetési távolság&lt;br /&gt;
    trsp/                - Legrövidebb utak kanyarodási korlátokkal&lt;br /&gt;
    tsp/                 - Utazó ügynök&lt;br /&gt;
  tools/                 - Tesztelési eszközök&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták  [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
[http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
[http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
[http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=130</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=130"/>
		<updated>2016-04-28T18:05:25Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták  [[Fájl:Osm.png|thumb|450px|Útvonal megjelenítése OSM2PO webszolgáltatásként]]&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk.&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
[http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
[http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
[http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=129</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=129"/>
		<updated>2016-04-16T13:41:24Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Használat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk:&lt;br /&gt;
[[Fájl:Osm.png]]&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
[http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
[http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
[http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=128</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=128"/>
		<updated>2016-04-16T13:40:35Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Kapcsolódó alkalmazások */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amely egyből alkalmas a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;demo.bat&amp;lt;/code&amp;gt; fájl szerkesztésével specifikálhatjuk térképünk paramétereit, például, hogy mely térképrészleten dolgozzunk. A [https://mapzen.com/data/metro-extracts/ Mapzen] oldalán kész &amp;lt;code&amp;gt;.pbf&amp;lt;/code&amp;gt; formátumú városrészleteket találhatunk, melyeket kompatibilisek az Osm2Po-val. A fájl futtatásával előáll egy &amp;lt;code&amp;gt;.sql&amp;lt;/code&amp;gt; fájl is, melyet importálhatunk a postGIS adatbázisunkba, és akár pgRouting lekérdezéseket is futtathatunk rajta. &lt;br /&gt;
Amíg fut a program, helyi webszerveren (&amp;lt;code&amp;gt;localhost:8888/Osm2poService&amp;lt;/code&amp;gt;) jeleníthető meg az importált térképrészlet, melyen az útkeresést is kipróbálhatjuk:&lt;br /&gt;
[[Fájl:Osm.png]]&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
[http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
[http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
[http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=127</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=127"/>
		<updated>2016-04-16T13:25:37Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amelyek egyből alkalmasak a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség&lt;br /&gt;
&lt;br /&gt;
[[Fájl:Osm.png]]&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
[http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
[http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;br /&gt;
&lt;br /&gt;
[http://www.bostongis.com/PrinterFriendly.aspx?content_name=pgrouting_osm2po_1 Loading OpenStreetMap with Osm2Po and route querying]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=F%C3%A1jl:Osm.png&amp;diff=126</id>
		<title>Fájl:Osm.png</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=F%C3%A1jl:Osm.png&amp;diff=126"/>
		<updated>2016-04-16T13:21:06Z</updated>

		<summary type="html">&lt;p&gt;Benek: Benek feltöltötte a(z) „Fájl:Osm.png” fájl új változatát&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Legrövidebb út keresése OpenStreetMap adathalmazon&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=F%C3%A1jl:Osm.png&amp;diff=125</id>
		<title>Fájl:Osm.png</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=F%C3%A1jl:Osm.png&amp;diff=125"/>
		<updated>2016-04-16T13:17:54Z</updated>

		<summary type="html">&lt;p&gt;Benek: Legrövidebb út keresése OpenStreetMap adathalmazon&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Legrövidebb út keresése OpenStreetMap adathalmazon&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=124</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=124"/>
		<updated>2016-04-16T10:16:52Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Hivatkozások */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amelyek egyből alkalmasak a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
&lt;br /&gt;
[http://http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
&lt;br /&gt;
[http://http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=123</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=123"/>
		<updated>2016-04-16T10:16:42Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Hivatkozások */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amelyek egyből alkalmasak a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;br /&gt;
[http://http://www.postgresonline.com/journal/archives/362-An-almost-idiots-guide-to-install-PostgreSQL-9.5,-PostGIS-2.2-and-pgRouting-2.1.0-with-Yum.html Fejlesztőkörnyezet telepítési útmutató]&lt;br /&gt;
[http://http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Manual]&lt;br /&gt;
[http://http://workshop.pgrouting.org/index.html pgRouting Workshop]&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=122</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=122"/>
		<updated>2016-04-16T10:02:43Z</updated>

		<summary type="html">&lt;p&gt;Benek: /* Kapcsolódó alkalmazások */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez, amelyek egyből alkalmasak a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség&lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=121</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=121"/>
		<updated>2016-04-16T10:01:59Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett algoritmusok egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez , hogy azok egyből alkalmasak a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=120</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=120"/>
		<updated>2016-04-16T10:01:15Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Lekérdezés szintaxis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
Minden pgRouting lekérdezés az alábbi formátumot követi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
SELECT pgr_&amp;lt;algorithm&amp;gt;(&amp;lt;SQL for edges&amp;gt;, start, end, &amp;lt;additonal options&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Ahol a &amp;lt;code&amp;gt;pgr_&amp;lt;/code&amp;gt;előtaggal hívjuk meg a lentebb ismertetett [[Algoritmusok]] egyikét. A belső SQL lekérdezéssel adjuk meg a táblát, amelyre az algoritmust futtatjuk, a kezdő- és végponto(ka)t, valamint opcionális további szűrési feltételeket. Például, ha a [http://http://docs.pgrouting.org/latest/en/doc/src/developer/sampledata.html#sampledata pgRouting dokumentációjában] bemutatott mintaadatokkal dolgozunk, az alábbi lekérdezéssel a 2. csúcsból a 3. sorszámúba vezető legrövidebb utat kapjuk meg:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT * FROM pgr_dijkstra(&lt;br /&gt;
      &amp;#039;SELECT id, source, target, cost, reverse_cost &lt;br /&gt;
      FROM edge_table&amp;#039;, 2, 3);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez , hogy azok egyből alkalmasak a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=119</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=119"/>
		<updated>2016-04-16T09:28:38Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
Útvonal-meghatározásra alkalmas adathalmazt például OpenStreetMap (OSM) térképekből nyerhetünk ki. Ehhez egyik alkalmas segédeszköz az OSM2PO  alkalmazás, amely megfelelő topológiájú SQL fájlt állít elő a megadott térképrészlethez , hogy azok egyből alkalmasak a pgRouting-gal vagy QGIS-szel való feldolgozásra. Az OSM2PO révén vizualizálhatjuk is a legrövidebb utakat. A programmal előállított SQL táblákban minden útkereszteződéshez tartozik egy rekord, melyben a következőket tároljuk:&lt;br /&gt;
*	koordináták&lt;br /&gt;
*	név&lt;br /&gt;
*	csomópont azonosító&lt;br /&gt;
*	lehetséges továbbhaladási irány (élek)&lt;br /&gt;
*	útszakasz hossza&lt;br /&gt;
*	megengedett sebesség&lt;br /&gt;
*	költség &lt;br /&gt;
&lt;br /&gt;
== Hivatkozások ==&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=118</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=118"/>
		<updated>2016-04-10T17:45:42Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
A pgRouting egy nyílt forráskódú, C++-ban írt bővítmény a PostGIS/PostgreSQL térinformatikai adatbázisokhoz. Gráf szerkezetek kezelését teszi lehetővé, így például legrövidebb utakat, csomópontok távolságát és egyéb hálózati elemzést igénylő feladatokat oldatunk meg vele.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói már tartalmazzák a pgRoutingot, így nem szükséges külön telepíteni, csak aktiválni kell.&lt;br /&gt;
&lt;br /&gt;
== Használat ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Adatok betöltése&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A vektoros térképi adatok adatbázis-táblába betöltésére számos eszköz áll rendelkezésre, például:&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2po&amp;#039;&amp;#039;&amp;#039;: OpenStreetMap (OSM) adatok konvertálása SQL formátumba, pgRouting-nak megfelelő formátumban&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;ogr2ogr&amp;#039;&amp;#039;&amp;#039;:	vektoros adatok konverziója&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;osm2pgsql&amp;#039;&amp;#039;&amp;#039;:	OSM adat betöltése postgreSQL-be&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Előfeldolgozás&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Amikor egy GIS fájlt olvasunk be az adatbázisunkba a pgRouting számára, nem feltétlenül követnek alkalmas topológiát a rekordok. A helytelen topológia hibás útvonalakhoz vezetne. Hogy használható adattáblát kapjunk, csomópontokra van szükségünk minden egyes útkereszteződésnél. Az útvonalhálózat megfelelő topológiájának kialakítását segítheti a pgr_createTopology  vagy a pgr_nodeNetwork parancs. Működésük hasonló. Az utóbbi beolvassa a „csúcstalan” hálózat adatbázis-tábláját, majd egy új táblába írja a már felcsúcsozott éleket. Paraméterei&lt;br /&gt;
*	éltábla neve, &lt;br /&gt;
*	tolerancia: a toleranciaértéken belüli csomópontok egy csomópontot fognak alkotni&lt;br /&gt;
*	id, az éltábla elsődleges kulcsa,&lt;br /&gt;
*	geometriát tartalmazó oszlop&lt;br /&gt;
*	kimeneti tábla szuffixe. Alapértelmezetten edge_table_noded.&lt;br /&gt;
&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
== Hivatkozások ==&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=117</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=117"/>
		<updated>2016-04-10T15:55:08Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Bevezetés ==&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
== Használat ==&lt;br /&gt;
== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;br /&gt;
&lt;br /&gt;
== Kapcsolódó alkalmazások ==&lt;br /&gt;
== Hivatkozások ==&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=116</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=116"/>
		<updated>2016-04-10T15:51:29Z</updated>

		<summary type="html">&lt;p&gt;Benek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
=== Dijkstra algoritmus ===&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú Dijkstra algoritmus ===&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
=== k-Dijkstra algoritmus ===&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== A* algoritmus ===&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus ===&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
=== Yen algoritmus ===&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Floyd-Warshall algoritmus ===&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Johnson algoritmus ===&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Utazó ügynök probléma === &lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
=== Legrövidebb utak kanyarodási korlátokkal ===&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
=== Vezetési távolság === &lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=115</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=115"/>
		<updated>2016-04-10T09:51:45Z</updated>

		<summary type="html">&lt;p&gt;Benek: Új oldal, tartalma: „== Algoritmusok ==   &amp;#039;&amp;#039;&amp;#039;Dijkstra algoritmus&amp;#039;&amp;#039;&amp;#039; (Shortest Path Dijkstra)  A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúc…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Algoritmusok ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Dijkstra algoritmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Shortest Path Dijkstra)&lt;br /&gt;
&lt;br /&gt;
A Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát. Ezen kívül minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során egy &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; értéket, ami az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza.&lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;D[s]=0&amp;lt;/math&amp;gt; és minden más &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsra &amp;lt;math&amp;gt;D[v]=\infty&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk a &amp;lt;math&amp;gt;V\setminus H&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket:&lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;D[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kétirányú Dijkstra algoritmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Bi-directional Dijkstra Shortest Path)&lt;br /&gt;
&lt;br /&gt;
A kétirányú Dijkstra algoritmus szintén egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. A Dijkstra algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Egy alternatív lehetőség, hogy a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazok közül minden egyes iterációban csak azt bővítjük, amelyiknél &amp;lt;math&amp;gt;D[x]&amp;lt;/math&amp;gt; kisebb. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra, One to Many Shortest Path)&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Dijkstra algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából több adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer. Valójában a Dijkstra algoritmus a gráf egy adott csúcsából az összes többi csúcsba vezető legrövidebb utat megtalálja, így akárhány célállomást megadhatunk. Az algoritmus akkor fejeződik be, amikor minden egyes célállomás bekerült a Dijkstra algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági mátrixos gráfábrázolás esetén &amp;lt;math&amp;gt;O(|V|^2)&amp;lt;/math&amp;gt;, szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|E|+|V|\log |V|)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Shortest Path &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus a Dijkstra algoritmus általánosítása, és szintén csak nem negatív élsúlyok esetén működik. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus mohó módszert használ. Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomás pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az algoritmus egy &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazban tárolja azon csúcsokat, amelyeknek már ismerjük az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzávezető legrövidebb út hosszát, egy &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazban pedig azokat, amelyeket már elértünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből, de az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből hozzájuk vezető legrövidebb út hosszát még nem ismerjük. Minden &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; csúcsról nyilvántartunk az algoritmus futása során három értéket: &amp;lt;math&amp;gt;D[u]&amp;lt;/math&amp;gt; az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ba vezető addig megismert legrövidebb út hossza, &amp;lt;math&amp;gt;C[u]&amp;lt;/math&amp;gt; egy nem negatív heurisztikus alsó becslés az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető legrövidebb út hosszára, amelyre az is teljesül, hogy az &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból bármely &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsba vezető legrövidebb út hosszára &lt;br /&gt;
&amp;lt;math&amp;gt;C[u]-C[v]&amp;lt;/math&amp;gt; alsó korlát (például egy térkép esetén &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; és &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; légvonalban mért távolsága), végül &amp;lt;math&amp;gt;B[u]=D[u]+C[u]&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Kezdetben &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; üres, &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ben csak az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcs van, és &amp;lt;math&amp;gt;B[s]=0&amp;lt;/math&amp;gt;. Ezután minden iterációban kiválasztunk az &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; halmazból egy olyan &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; csúcsot, amelyre &amp;lt;math&amp;gt;B[x]&amp;lt;/math&amp;gt; minimális, áttesszük &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;-et &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, majd &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; minden olyan &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; szomszédjára, amely nincs &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ban frissítjük először a &amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]=\min\{D[v],D[x]+w(x,v)\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
majd a &amp;lt;math&amp;gt;B[v]&amp;lt;/math&amp;gt; értéket: &lt;br /&gt;
&amp;lt;math&amp;gt;B[v]=\min\{B[v],D[v]+C[v]\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
végül áttesszük &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-t &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-be. Az algoritmus véget ér, amikor &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; átkerül &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;-ba, ekkor &amp;lt;math&amp;gt;B[t]&amp;lt;/math&amp;gt; egy legrövidebb &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be vezető út hossza. Az algoritmus kis módosítással egy legrövidebb utat is megad &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;-be.&lt;br /&gt;
&lt;br /&gt;
A tapasztalat azt mutatja, hogy az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus számos esetben hatékonyabb, mint a Dijkstra algoritmust.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Bi-directional &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; Shortest Path)&lt;br /&gt;
&lt;br /&gt;
A kétirányú &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út megtalálására szolgáló módszer.  Az algoritmus csak nem negatív élsúlyok esetén működik.  Legyen a kiindulási pont &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, a célállomást pedig &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt;  algoritmust futtatjuk a kiindulási pontból az eredeti gráfon, és párhuzamosan a célállomásból a transzponált gráfon (amelyet úgy kapunk az eredeti gráfból, hogy az élek irányítását megfordítjuk).  Akkor állunk meg, ha egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcs mindkét irányból bekerül az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmusnál definiált &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; halmazba (pontosabban a &amp;lt;math&amp;gt;H_s&amp;lt;/math&amp;gt; és a &amp;lt;math&amp;gt;H_t&amp;lt;/math&amp;gt; halmazba is). Az algoritmus kis módosítással egy legrövidebb utat is megad s-ből t-be.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Yen algoritmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(&amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-Shortest Path, Multiple Alternative Paths)&lt;br /&gt;
&lt;br /&gt;
A Yen algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf egy adott csúcsából egy adott másik csúcsába vezető legrövidebb út mellett megtalálja a második, harmadik, …, &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-adik legrövidebb (egyszerű) utat is. Az algoritmus csak nem negatív élsúlyok esetén működik. &lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &lt;br /&gt;
&amp;lt;math&amp;gt;O(k|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Floyd-Warshall algoritmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Floyd-Warshall Algorithm, All Pairs Shortest Path)&lt;br /&gt;
&lt;br /&gt;
A Floyd-Warshall algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus dinamikus programozást használ. Legyen a gráf csúcshalmaza &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_n\}&amp;lt;/math&amp;gt;. Az algoritmus minden &amp;lt;math&amp;gt;0\leqslant k\leqslant n&amp;lt;/math&amp;gt; esetén meghatározza a &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt;-ből &lt;br /&gt;
&amp;lt;math&amp;gt;v_j&amp;lt;/math&amp;gt;-be menő legrövidebb olyan (egyszerű) út &amp;lt;math&amp;gt;T_k[v_i,v_j]&amp;lt;/math&amp;gt; hosszát, amelyen a közbülső csúcsok a &amp;lt;math&amp;gt;\{v_1,v_2,\ldots,v_k\}&amp;lt;/math&amp;gt; halmazból kerülnek ki: &lt;br /&gt;
&amp;lt;math&amp;gt;T_0[v_i,v_j]=w(v_i,v_j)&amp;lt;/math&amp;gt;, és &amp;lt;math&amp;gt;T_k[v_i,v_j]=\min\{T_{k-1}[v_i,v_j],T_{k-1}[v_i,v_k]+T_{k-1}[v_k,v_j]\}&amp;lt;/math&amp;gt; ha &amp;lt;math&amp;gt;k&amp;gt;0&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége &amp;lt;math&amp;gt;O(|V|^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Johnson algoritmus&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
(Johnson’s Algorithm, All Pairs Shortest Path)&lt;br /&gt;
&lt;br /&gt;
A Johnson algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf bármely két csúcsa közötti legrövidebb út megtalálására szolgáló módszer. Az algoritmus negatív élsúlyok esetén is működik, ha a gráf nem tartalmaz negatív összhosszúságú irányított kört. Jelölje a súlyfüggvényt &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt;. Az algoritmus ritka gráfokon teljesít igazán jól. &lt;br /&gt;
&lt;br /&gt;
Vegyünk fel egy új &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; csúcsot, és vezessünk &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;-ből nulla súlyú éleket &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; csúcsaiba. Jelölje az így kapott gráfot &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;. Futtassuk le &amp;lt;math&amp;gt;G&amp;#039;&amp;lt;/math&amp;gt;-re a Bellman-Ford algoritmust az &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; kezdőcsúccsal. Az algoritmus által szolgáltatott távolságérték a gráf egy &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; csúcsára legyen &lt;br /&gt;
&amp;lt;math&amp;gt;D[v]&amp;lt;/math&amp;gt;. Átsúlyozzuk a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf éleit: legyen &amp;lt;math&amp;gt;w&amp;#039;(u,v)=w(u,v)+D[u]-D[v]&amp;lt;/math&amp;gt; minden &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; élre. Most &amp;lt;math&amp;gt;w&amp;#039;&amp;lt;/math&amp;gt; egy nem negatív súlyfüggvény &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt;-n. Futtassuk ezzel a súlyfüggvénnyel a Dijkstra algoritmust a &amp;lt;math&amp;gt;G&amp;lt;/math&amp;gt; gráf minden csúcsából. Egy legrövidebb &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt;-ból &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt;-be vezető út hossza ezután a kapott érték mínusz &amp;lt;math&amp;gt;D[u]-D[v]&amp;lt;/math&amp;gt;. Az algoritmus kis módosítással magukat a legrövidebb utakat is megadja.&lt;br /&gt;
&lt;br /&gt;
Az algoritmus költsége szomszédsági listás gráfábrázolás esetén Fibonacci kupacot használva&lt;br /&gt;
&amp;lt;math&amp;gt;O(|V|(|E|+|V|\log |V|))&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Utazó ügynök probléma&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
(Traveling Sales Person)&lt;br /&gt;
&lt;br /&gt;
Az utazó ügynök probléma a következő. Adott városoknak egy listája, és adott bármely két város között a távolság. Határozzunk meg egy olyan körutat, amely minden városon pontosan egyszer halad át, és a hossza minimális. A problémára nem ismert polinomiális költségű algoritmus. A program ún. simulated annealing technikán alapuló algoritmust használ egy jó közelítő megoldás meghatározására.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Legrövidebb utak kanyarodási korlátokkal&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
(Turn Restriction Shortest Path (TRSP))&lt;br /&gt;
&lt;br /&gt;
Az algoritmus egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráf adott csúcsából egy másik adott csúcsába vezető legrövidebb út meghatározásakor képes figyelembe venni, hogy két csatlakozó él egymás utáni bejárása extra költséggel bírhat. Ezeket a megszorításokat egy külön táblában adhatjuk meg. Tapasztalat szerint az algoritmus közel olyan gyors, mint az &amp;lt;math&amp;gt;A^\ast&amp;lt;/math&amp;gt; algoritmus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Vezetési távolság&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
(Driving Distance)&lt;br /&gt;
&lt;br /&gt;
Egy súlyozott élű, irányított &amp;lt;math&amp;gt;G=(V,E)&amp;lt;/math&amp;gt; gráfban a Dijkstra algoritmus felhasználásával megadja azon csúcsokat, melyekbe egy vagy több adott csúcsból egy adott értéknél rövidebb úton el lehet jutni.&lt;/div&gt;</summary>
		<author><name>Benek</name></author>
		
	</entry>
</feed>