<?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=Szeligor</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=Szeligor"/>
	<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/Szeligor"/>
	<updated>2026-06-09T22:56:49Z</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=552</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=552"/>
		<updated>2017-05-16T05:28:10Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: /* Telepítés */&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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
Grafikus megjelenítéshez a QGIS programcsomag megfelelő választás lehet.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú A* 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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Floyd-Warshall algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a súlyozott gráfban, mindegyiknél kiszámolva a legrövidebb utat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsWarshall(sql text, directed boolean, reverse_cost boolean); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost ha igaz, akkor a cost értékét az ellentétes irányból vesszük.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Floyd-Warshall algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspWarshall(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
        false, false&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A vezetési távolság algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) egy seq-id párossal tér vissza, amely azt írja le, mi a legjobb haladási sorrend a mátrixban, hogy eljussunk a start csúcsból a meghatározott csúcsokig.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_tsp(sql text, ids varchar, source integer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utazó ügynök algoritmus SQL paraméterrel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_tsp(&amp;#039;SELECT id AS source_id, x, y FROM vertex_table&amp;#039;,&amp;#039;2,7,11&amp;#039;,7);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Távolsági mátrixszal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id FROM pgr_tsp(&amp;#039;{{0,1,2,3},{1,0,3,2},{2,3,0,4},{3,2,4,0}}&amp;#039;,2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A legrövidebb út kanyarodási korlátokkal algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie, attól függően, hogy van-e megszorítás:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_trsp(sql text, source integer, target integer, directed boolean, has_rcost boolean [,restrict_sql text]);&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_trsp(sql text, source_edge integer, source_pos double precision, target_edge integer, target_pos double precision, directed boolean, has_rcost boolean [,restrict_sql text]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table;&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TSRP algoritmussal kiegészítve az előző lekérdezés megszorítások nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_trsp(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Megszorításokkal (külön táblában tároljuk):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_trsp(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false,&lt;br /&gt;
                &amp;#039;SELECT to_cost, to_edge AS target_id,&lt;br /&gt;
           from_edge || coalesce(&amp;#039;&amp;#039;,&amp;#039;&amp;#039; || via, &amp;#039;&amp;#039;&amp;#039;&amp;#039;) AS via_path&lt;br /&gt;
       FROM restrictions&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A vezetési távolság algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vezetési távolság algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_drivingDistance(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
        2, 3&lt;br /&gt;
      );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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;br /&gt;
* [http://docs.pgrouting.org/2.3/en/doc/index.html pgRouting v2.3 Manual]&lt;br /&gt;
* [http://docs.pgrouting.org/2.3/en/doc/src/developer/sampledata.html Sample pgRouting data]&lt;br /&gt;
* [https://anitagraser.com/2011/02/07/a-beginners-guide-to-pgrouting/ pgRouting guide]&lt;/div&gt;</summary>
		<author><name>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=551</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=551"/>
		<updated>2017-05-16T05:03:10Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: /* Külső hivatkozá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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú A* 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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Floyd-Warshall algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a súlyozott gráfban, mindegyiknél kiszámolva a legrövidebb utat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsWarshall(sql text, directed boolean, reverse_cost boolean); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost ha igaz, akkor a cost értékét az ellentétes irányból vesszük.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Floyd-Warshall algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspWarshall(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
        false, false&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A vezetési távolság algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) egy seq-id párossal tér vissza, amely azt írja le, mi a legjobb haladási sorrend a mátrixban, hogy eljussunk a start csúcsból a meghatározott csúcsokig.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_tsp(sql text, ids varchar, source integer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utazó ügynök algoritmus SQL paraméterrel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_tsp(&amp;#039;SELECT id AS source_id, x, y FROM vertex_table&amp;#039;,&amp;#039;2,7,11&amp;#039;,7);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Távolsági mátrixszal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id FROM pgr_tsp(&amp;#039;{{0,1,2,3},{1,0,3,2},{2,3,0,4},{3,2,4,0}}&amp;#039;,2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A legrövidebb út kanyarodási korlátokkal algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie, attól függően, hogy van-e megszorítás:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_trsp(sql text, source integer, target integer, directed boolean, has_rcost boolean [,restrict_sql text]);&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_trsp(sql text, source_edge integer, source_pos double precision, target_edge integer, target_pos double precision, directed boolean, has_rcost boolean [,restrict_sql text]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table;&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TSRP algoritmussal kiegészítve az előző lekérdezés megszorítások nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_trsp(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Megszorításokkal (külön táblában tároljuk):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_trsp(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false,&lt;br /&gt;
                &amp;#039;SELECT to_cost, to_edge AS target_id,&lt;br /&gt;
           from_edge || coalesce(&amp;#039;&amp;#039;,&amp;#039;&amp;#039; || via, &amp;#039;&amp;#039;&amp;#039;&amp;#039;) AS via_path&lt;br /&gt;
       FROM restrictions&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A vezetési távolság algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vezetési távolság algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_drivingDistance(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
        2, 3&lt;br /&gt;
      );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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;br /&gt;
* [http://docs.pgrouting.org/2.3/en/doc/index.html pgRouting v2.3 Manual]&lt;br /&gt;
* [http://docs.pgrouting.org/2.3/en/doc/src/developer/sampledata.html Sample pgRouting data]&lt;br /&gt;
* [https://anitagraser.com/2011/02/07/a-beginners-guide-to-pgrouting/ pgRouting guide]&lt;/div&gt;</summary>
		<author><name>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=549</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=549"/>
		<updated>2017-05-15T20:44:08Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: /* Utazó ügynök probléma */&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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú A* 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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Floyd-Warshall algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a súlyozott gráfban, mindegyiknél kiszámolva a legrövidebb utat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsWarshall(sql text, directed boolean, reverse_cost boolean); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost ha igaz, akkor a cost értékét az ellentétes irányból vesszük.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Floyd-Warshall algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspWarshall(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
        false, false&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A vezetési távolság algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) egy seq-id párossal tér vissza, amely azt írja le, mi a legjobb haladási sorrend a mátrixban, hogy eljussunk a start csúcsból a meghatározott csúcsokig.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_tsp(sql text, ids varchar, source integer);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utazó ügynök algoritmus SQL paraméterrel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_tsp(&amp;#039;SELECT id AS source_id, x, y FROM vertex_table&amp;#039;,&amp;#039;2,7,11&amp;#039;,7);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Távolsági mátrixszal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id FROM pgr_tsp(&amp;#039;{{0,1,2,3},{1,0,3,2},{2,3,0,4},{3,2,4,0}}&amp;#039;,2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A legrövidebb út kanyarodási korlátokkal algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie, attól függően, hogy van-e megszorítás:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_trsp(sql text, source integer, target integer, directed boolean, has_rcost boolean [,restrict_sql text]);&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_trsp(sql text, source_edge integer, source_pos double precision, target_edge integer, target_pos double precision, directed boolean, has_rcost boolean [,restrict_sql text]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table;&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TSRP algoritmussal kiegészítve az előző lekérdezés megszorítások nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_trsp(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Megszorításokkal (külön táblában tároljuk):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_trsp(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false,&lt;br /&gt;
                &amp;#039;SELECT to_cost, to_edge AS target_id,&lt;br /&gt;
           from_edge || coalesce(&amp;#039;&amp;#039;,&amp;#039;&amp;#039; || via, &amp;#039;&amp;#039;&amp;#039;&amp;#039;) AS via_path&lt;br /&gt;
       FROM restrictions&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A vezetési távolság algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vezetési távolság algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_drivingDistance(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
        2, 3&lt;br /&gt;
      );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=548</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=548"/>
		<updated>2017-05-15T20:38:34Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: /* Legrövidebb utak kanyarodási korlátokkal */&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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú A* 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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Floyd-Warshall algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a súlyozott gráfban, mindegyiknél kiszámolva a legrövidebb utat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsWarshall(sql text, directed boolean, reverse_cost boolean); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost ha igaz, akkor a cost értékét az ellentétes irányból vesszük.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Floyd-Warshall algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspWarshall(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
        false, false&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A legrövidebb út kanyarodási korlátokkal algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie, attól függően, hogy van-e megszorítás:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_trsp(sql text, source integer, target integer, directed boolean, has_rcost boolean [,restrict_sql text]);&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_trsp(sql text, source_edge integer, source_pos double precision, target_edge integer, target_pos double precision, directed boolean, has_rcost boolean [,restrict_sql text]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table;&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TSRP algoritmussal kiegészítve az előző lekérdezés megszorítások nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_trsp(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Megszorításokkal (külön táblában tároljuk):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_trsp(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false,&lt;br /&gt;
                &amp;#039;SELECT to_cost, to_edge AS target_id,&lt;br /&gt;
           from_edge || coalesce(&amp;#039;&amp;#039;,&amp;#039;&amp;#039; || via, &amp;#039;&amp;#039;&amp;#039;&amp;#039;) AS via_path&lt;br /&gt;
       FROM restrictions&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A vezetési távolság algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vezetési távolság algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_drivingDistance(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
        2, 3&lt;br /&gt;
      );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=547</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=547"/>
		<updated>2017-05-15T20:32:35Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: /* Vezetési távolság */&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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú A* 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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Floyd-Warshall algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a súlyozott gráfban, mindegyiknél kiszámolva a legrövidebb utat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsWarshall(sql text, directed boolean, reverse_cost boolean); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost ha igaz, akkor a cost értékét az ellentétes irányból vesszük.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Floyd-Warshall algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspWarshall(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
        false, false&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A vezetési távolság algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, minden sor egy élt tartalmaz, amelyiken átmentünk, plusz az utolsó az utolsó élt.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vezetési távolság algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_drivingDistance(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
        2, 3&lt;br /&gt;
      );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=546</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=546"/>
		<updated>2017-05-15T20:27:30Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: /* Floyd-Warshall algoritmus */&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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú A* 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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Floyd-Warshall algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a súlyozott gráfban, mindegyiknél kiszámolva a legrövidebb utat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsWarshall(sql text, directed boolean, reverse_cost boolean); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost ha igaz, akkor a cost értékét az ellentétes irányból vesszük.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Floyd-Warshall algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspWarshall(&lt;br /&gt;
        &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
        false, false&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=545</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=545"/>
		<updated>2017-05-15T20:19:45Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: /* Kétirányú A^\ast algoritmus */&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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kétirányú A* 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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=544</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=544"/>
		<updated>2017-05-15T20:19:12Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: /* Kétirányú A^\ast algoritmus */&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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=543</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=543"/>
		<updated>2017-05-15T20:16:17Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdAstar(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
x1 az él start pontjának x koordinátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordinátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kétirányú A* algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2&lt;br /&gt;
     FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 10, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
SELECT * FROM pgr_bdAStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost&lt;br /&gt;
     FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 10, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Yen algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, id3, cost) sorok halmazával tér vissza, melyek utakat hoznak létre (a legrövidebb utat a két csúcs között) összesen az első k darabot. &lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 az út azonosítója,&lt;br /&gt;
az id2 a csúcs azonosítója,&lt;br /&gt;
az id3 az él azonosítója (az utolsó sorban 0)&lt;br /&gt;
a cost az áthaladás költsége id2-től id3-at használva.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yen algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, false&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS route, id2 AS node, id3 AS edge, cost&lt;br /&gt;
  FROM pgr_ksp(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
    7, 12, 2, true&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=540</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=540"/>
		<updated>2017-05-15T19:44:48Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepítés után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A 2.3 pgRouting library tartalma/leírása &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://docs.pgrouting.org/2.3/en/doc/index.html itt]&amp;lt;/span&amp;gt; található.&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordintátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordintátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A*algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=537</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=537"/>
		<updated>2017-05-15T19:33:52Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepíté után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordintátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordintátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A*algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=536</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=536"/>
		<updated>2017-05-15T19:33:11Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
Elődje volt a pgDijkstra, amelyet később kiterjesztettek és pgRouting-nak neveztek el. Napjainkban a fenntartását a Georepublic, az iMaptools és a felhasználók végzik.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OSGeo&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
A pgRouting az OSGeo Foundation-nek egy OSGeo Labs projektje és része az OSGeo Live-nak, ami egy hordozható szoftver, mellyel ki széles körben ki lehet próbálni térinformatikai szoftvereket installálás nélkül.&lt;br /&gt;
Teljesen ingyenes, szabadon használható, módosítható és dokumentációt, valamint mintaadatokat is tartalmaz.&lt;br /&gt;
&lt;br /&gt;
A pgRoutingot sokféle módon tudjuk használni, adatmódosítást is több különböző szoftverrel is végezhetünk, pl. pgAdmin, QGIS használatával, vagy konkrét Pl/pgSQL utasítások használatával. Az adatmódosításokat a routing engine azonnal elvégzi és a &amp;quot;cost&amp;quot; paraméter kiszámítása is működik dinamikusan.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú PostGIS, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepíté után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordintátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordintátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A*algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=531</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=531"/>
		<updated>2017-05-14T22:48:40Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú postgis, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepíté után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között). Az algoritmus Dijkstra algoritmuson alapszik, heurisztikus kikötéssel, amely hatékonyabbá teszi.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül (az utolsó sorra 0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_astar(sql text, source integer, target integer,&lt;br /&gt;
                       directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
x1 az él start pontjának x koordintátája,&lt;br /&gt;
y1 az él start pontjának y koordinátája,&lt;br /&gt;
x2 az él end pontjának x koordintátája,&lt;br /&gt;
y2 az él end pontjának y koordinátája,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A*algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2 FROM edge_table&amp;#039;,&lt;br /&gt;
    4, 1, false, false);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT * FROM pgr_AStar(&lt;br /&gt;
    &amp;#039;SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost FROM edge_table &amp;#039;,&lt;br /&gt;
    4, 1, true, true);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!A Kétirányú A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=530</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=530"/>
		<updated>2017-05-14T22:36:35Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú postgis, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepíté után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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 k-Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    Az A* algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között), vagy összeadja a költségeket (attól függ, melyik verziót használjuk).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az összeköltséggel tér vissza&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_kdijkstraPath(text sql, integer source,&lt;br /&gt;
                 integer[] targets, boolean directed, boolean has_rcost); -- az útban lévő élek halmazával tér vissza&lt;br /&gt;
/*Ezekben a source a startcsúcs azonosítója,&lt;br /&gt;
a targets a célcsúcsok azonosítójának tömbje,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
k-Dijkstra algoritmussal kiegészítve az előző lekérdezés úgy, hogy az úttal tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS path, id2 AS edge, cost FROM pgr_kdijkstraPath(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Költséggel tér vissza:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
Returning a cost result&lt;br /&gt;
SELECT seq, id1 AS source, id2 AS target, cost FROM pgr_kdijkstraCost(&lt;br /&gt;
    &amp;#039;SELECT id, source, target, cost FROM edge_table WHERE cost &amp;gt;= 0&amp;#039;,&lt;br /&gt;
    10, array[4,12], false, false&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=529</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=529"/>
		<updated>2017-05-14T22:22:31Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú postgis, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepíté után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Majd, ha akarjuk létrehozunk spatial index-et a lekérdezések hatékonyabb végrehajtása érdekében.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE INDEX road_gist ON road USING GIST (the_geom);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5. Már mehetnek is a lekérdezések!&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Kétirányú Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között) úgy, hogy elkezdi megkeresni a legrövidebb utat a startcsúcsból és párhuzamosan a célcsúcsból is. Akkor ér véget, ha a két keresés valahol középen véget ér.&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,&lt;br /&gt;
                                directed boolean, has_rcost boolean);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_bdDijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=528</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=528"/>
		<updated>2017-05-14T22:09:47Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
Természetesen különböző platformokra is elérhető a csomag: Linux, MAC OS és Windows alá is.&lt;br /&gt;
&lt;br /&gt;
Én a Windows verziót választottam.&lt;br /&gt;
A pgRouting honlapján lévő hivatalos telepítési útmutató alapján hosszas, bonyodalmas telepítésre számítottam, de meglepően egyszerűnek bizonyult.&lt;br /&gt;
Nem kell más, csak egy PostgreSQL és a hozzá tartozó, megfelelő verziójú postgis, amelyet a kapcsolódó StackBuilder-rel automatikusan, könnyen telepíthetünk.&lt;br /&gt;
&lt;br /&gt;
Elérhetőek más extension-ök is, én csak a PostGIS-pgRouting kombót választottam.&lt;br /&gt;
&lt;br /&gt;
Telepíté után az úgy nevezett pgAdmin alkalmazást kell elindítani és ebben kell csatlakozni az adatbázisunkhoz.&lt;br /&gt;
Az adatbázis futhat localhost-on, sőt, egy kezdeti adatbázist már a PostGIS telepítése során létrehozhatunk.&lt;br /&gt;
&lt;br /&gt;
Az adatbázis jelszóval védett és különböző felhasználókat is létre lehet benne hozni, majd a táblákról megmondani, kiknek van hozzá jogosultsága - tehát itt semmi meglepetés nincs.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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 (hasonló hozzá az osm2pgrouting is, de ez sajnos egy ideje Windows alatt nem működik).&lt;br /&gt;
*	&amp;#039;&amp;#039;&amp;#039;shp2pgsql&amp;#039;&amp;#039;&amp;#039;:	PostgreSQL shapefile betöltője (az újabb verziójához GUI is tartozik, mellyel könnyen lehet shapefile-okat betölteni).&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;
Előfordulhat olyan eset is, amikor a pl. shapefile-ból betöltött táblánkon nem tudunk automatikusan topológiát építeni, mivel csak egy &amp;quot;geometry&amp;quot; típusú oszlopból tudjuk, hol van az elhelyezkedése, azaz nem tudjuk a start és az end csúcsát.&lt;br /&gt;
Szerencsére erre is van megoldás:&lt;br /&gt;
&lt;br /&gt;
1. Létrehozunk egy view-t, amelyikbe kiszámoljuk az adott geom start és end csúcsát (ebben az esetben a road táblán hajtjuk végre az átalakítást).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE OR REPLACE VIEW road_ext AS&lt;br /&gt;
   SELECT *, startpoint(the_geom), endpoint(the_geom)&lt;br /&gt;
   FROM road;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Létrehozunk egy táblát, amelyben az egyes csomópontokat tároljuk, és ezeknek adunk egy unique ID-t is.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE node AS&lt;br /&gt;
   SELECT row_number() OVER (ORDER BY foo.p)::integer AS id, &lt;br /&gt;
          foo.p AS the_geom&lt;br /&gt;
   FROM (         &lt;br /&gt;
      SELECT DISTINCT road_ext.startpoint AS p FROM road_ext&lt;br /&gt;
      UNION&lt;br /&gt;
      SELECT DISTINCT road_ext.endpoint AS p FROM road_ext&lt;br /&gt;
   ) foo&lt;br /&gt;
   GROUP BY foo.p;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Ahhoz, hogy bejárható hálózatot kapjunk, létrehozunk egy táblát az eredeti és a csomópontok összejoin-olásával.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
CREATE TABLE network AS&lt;br /&gt;
   SELECT a.*, b.id as start_id, c.id as end_id&lt;br /&gt;
   FROM road_ext AS a&lt;br /&gt;
      JOIN node AS b ON a.startpoint = b.the_geom&lt;br /&gt;
      JOIN node AS c ON a.endpoint = c.the_geom;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=414</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=414"/>
		<updated>2017-04-28T06:21:14Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre (a legrövidebb utat a két csúcs között).&lt;br /&gt;
Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 az él azonosítója (az utolsó sorban -1),&lt;br /&gt;
a cost az áthaladás költsége id1-től id2 élen keresztül.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dijkstra algoritmussal kiegészítve az előző lekérdezés reverse_cost nélkül:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, false, false&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reverse_cost-tal:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS node, id2 AS edge, cost&lt;br /&gt;
        FROM pgr_dijkstra(&lt;br /&gt;
                &amp;#039;SELECT id, source, target, cost, reverse_cost FROM edge_table&amp;#039;,&lt;br /&gt;
                7, 12, true, true&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jól látható, hogy a két módszer csak a directed és a has_rcost értékekben különbözik.&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=413</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=413"/>
		<updated>2017-04-28T06:14:39Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Dijkstra algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza, melyek egy utat hoznak létre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,&lt;br /&gt;
                           boolean directed, boolean has_rcost);&lt;br /&gt;
/*Ebben a source a startcsúcs azonosítója,&lt;br /&gt;
a target a célcsúcs azonosítója,&lt;br /&gt;
a directed akkor igaz, ha az él irányított,&lt;br /&gt;
a has_rcost akkor igaz, ha negatív élek vannak, ekkor a kapott sorokat az algoritmus visszafelé dolgozza fel.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT id, source, target, cost [,reverse_cost] FROM edge_table&lt;br /&gt;
/* Ebben az id az él azonosítója,&lt;br /&gt;
a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége,&lt;br /&gt;
a reverse_cost opcionális, akkor lesz használva, ha a directed és a has_rcost értéke is igaz.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciája,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=412</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=412"/>
		<updated>2017-04-28T06:04:25Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
/*Ebben a seq a sorok szekvenciéja,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
/* Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=411</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=411"/>
		<updated>2017-04-28T06:02:22Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ebben a seq a sorok szekvenciéja,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=410</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=410"/>
		<updated>2017-04-28T06:00:43Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
    A Johnson algoritmus pgRouting lekérdezéseket használva:&lt;br /&gt;
Az algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
Ebben a seq a sorok szekvenciéja,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=409</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=409"/>
		<updated>2017-04-28T05:33:42Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
Ugyanez pgRouting nyelven:&lt;br /&gt;
A Johnson algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
Ebben a seq a sorok szekvenciéja,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
&amp;lt;/&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&gt;
    );&lt;br /&gt;
&amp;lt;/&amp;lt;syntaxhighlight&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
	<entry>
		<id>http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=408</id>
		<title>PgRouting</title>
		<link rel="alternate" type="text/html" href="http://gis.inf.elte.hu/giswiki/index.php?title=PgRouting&amp;diff=408"/>
		<updated>2017-04-28T05:31:31Z</updated>

		<summary type="html">&lt;p&gt;Szeligor: &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; nyelven í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. Lehetővé teszi &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/Gr%C3%A1f gráf adatszerkezetek]&amp;lt;/span&amp;gt; kezelését, í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. A programcsomag &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[https://hu.wikipedia.org/wiki/GNU_General_Public_License GNU GPL v2]&amp;lt;/span&amp;gt; licenc alatt használható.&lt;br /&gt;
&lt;br /&gt;
== Telepítés ==&lt;br /&gt;
A PostGIS újabb verziói (2.0+) már tartalmazzák a pgRouting csomagot, így nem szükséges külön telepíteni, csak aktiválni kell, a következő módon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE EXTENSION pgrouting;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A teljes telepítési útmutató elérhető a pgRouting honlapján.&lt;br /&gt;
&lt;br /&gt;
== Felépítés ==&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;pre&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á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;/pre&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;syntaxhighlight lang=&amp;quot;bash&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;syntaxhighlight lang=&amp;quot;sql&amp;quot;&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;/syntaxhighlight&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;
Ugyanez pgRouting nyelvre vetítve:&lt;br /&gt;
A &lt;br /&gt;
A Johnson algoritmus pgr_costResult(seq, id1, id2, cost) sorok halmazával tér vissza minden csúcspárra a gráfban:&lt;br /&gt;
&lt;br /&gt;
pgr_costResult[] pgr_aspsJohnson(sql text); -- magyarul minden egyes csúcspárra kiszámolja az összes költséget.&lt;br /&gt;
Ebben a seq a sorok szekvenciéja,&lt;br /&gt;
az id1 a startcsúcs azonosítója,&lt;br /&gt;
az id2 a célcsúcs azonosítója,&lt;br /&gt;
a cost az id1-től id2-ig jutás költsége.&lt;br /&gt;
&lt;br /&gt;
Segítségül egy olyan SQL lekérdezést használunk, amelyiknek a vizsgált gráf éleivel kell visszatérnie:&lt;br /&gt;
&lt;br /&gt;
SELECT source, target, cost FROM edge_table;&lt;br /&gt;
Ebben a source: az él startcsúcsának azonosítója,&lt;br /&gt;
a target az él célcsúcsának azonosítója,&lt;br /&gt;
a cost egy pozitív szám, az élen való áthaladásnak a költsége.&lt;br /&gt;
&lt;br /&gt;
Johnson algoritmussal kiegészítve az előző lekérdezés:&lt;br /&gt;
SELECT seq, id1 AS from, id2 AS to, cost&lt;br /&gt;
    FROM pgr_apspJohnson(&lt;br /&gt;
        &amp;#039;SELECT source, target, cost FROM edge_table&amp;#039;&lt;br /&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;
&lt;br /&gt;
* [http://pgrouting.org/ A pgRouting hivatalos honlapja]&lt;br /&gt;
* [http://docs.pgrouting.org/latest/en/doc/index.html pgRouting Dokumentáció]&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;
* [http://workshop.pgrouting.org/index.html pgRouting Workshop]&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>Szeligor</name></author>
		
	</entry>
</feed>