Útkeresések
Gráfalgoritmusok Gráfbejárások Legrövidebb utak egy forrásból Minimális súlyú feszítőfa keresése Mesterséges intelligencia
Gráfbejárások: a mélységi stratégia Korosodó lámpagyújtogató egy középkori város utcáit járja: Főtérről indul Onnan nyíló sötét utcába megy és felgyújtja a lámpákat ha elágazáshoz ér, tovább megy egy másik sötét utcába és ott felgyújtja a lámpákat ha zsákutcába ér akkor visszamegy az előző kereszteződéshez és másik utcát választ
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Mélységi bejárás
Gráfbejárások: a szélességi stratégia Az alaphelyzet hasonló, de a lámpagyújtogató aznap este fáradt és elhívja a barátait (akik elég sokan vannak) segíteni. - a főtérről indulnak - a csapat annyi fele oszlik minden elágazásnál, ahány sötét utca kivezet belőle
Szélességi bejárás
Szélességi bejárás
Szélességi bejárás
Szélességi bejárás
Szélességi bejárás
Szélességi bejárás algoritmusa Elérjük a kezdőcsúcsot Elérjük a kezdőcsúcs szomszédait Majd az 1 távolságra lévő csúcsok szomszédait, és így tovább… Közben kiiratjuk a csúcsok távolságait, és a szülőket Minden csúcsot csak egyszer járunk be
Szélességi bejárás algoritmusa Algoritmikus megvalósítás: sor adatszerkezet segítségével Színezés: fehér: nem érintett csúcsok szürke: kiterjesztés alatt álló csúcsok fekete: kiterjesztett csúcsok
Szélességi bejárás algoritmusa Q=[1]
Szélességi bejárás algoritmusa Q=[2,3,4]
Szélességi bejárás algoritmusa Q=[3,4,5,6]
Szélességi bejárás algoritmusa Q=[4,5,6]
Szélességi bejárás algoritmusa Q=[5,6,10]
Szélességi bejárás algoritmusa Q=[6,10,7,8,9]
Szélességi bejárás algoritmusa Q=[10,7,8,9]
Szélességi bejárás algoritmusa Q=[7,8,9]
Szélességi bejárás algoritmusa Q=[8,9]
Szélességi bejárás algoritmusa Q=[9]
Szélességi bejárás algoritmusa Q=[ ]
Minimális költségű utak egy forrásból Élsúlyozott gráfok Pl.: Magyarország úthálózata: a gráf csúcsai városok élei a városokat összekötő utak, ahol az út megtételének költségét az élsúlyok jelzik
Dijkstra algoritmus (Nemnegatív) élsúlyozott irányított gráf Elsőbbségi (prioritásos) sorban tároljuk a kiterjesztendő csúcsokat Alapelv: mindig a legkisebb költségű utat folytatjuk (mohó algoritmus)
Dijkstra algoritmus
Dijkstra algoritmus
Dijkstra algoritmus
Dijkstra algoritmus
Dijkstra algoritmus
Dijkstra algoritmus „legrövidebb utak fája”
A Dijkstra-algoritmus műveletigénye
A Dijkstra-algoritmus műveletigénye A prioritásos sor megvalósítása rendezetlen tömbbel: a lineáris idejű a keresés miatt => T(n)=σ(n*n)= σ(n2) Kupaccal: a keresés log(n)-es, a fenntartás e*log(n)-es => T(n)= σ(n+e)*log(n)-es Sűrű gráf esetén: e~n2 => σ(n2*log(n))> σ(n2)
Bellmann-Ford algoritmus Negatív élsúlyozású gráfokra is működik Feltétel, hogy ne legyen a gráfban negatív összköltségű irányított kör Az algoritmus elve: n-szer járjuk be a gráfot, keresve az s-ből induló 1,2…n-1 hosszúságú legrövidebb utakat a gráf összes pontjába Műveletigény: T(n)=Θ((n-1)*e) (~n3 ) Példa: valutaátváltások
Bellmann-Ford algoritmus
Bellmann-Ford algoritmus
Bellmann-Ford algoritmus
Bellmann-Ford algoritmus
Bellmann-Ford algoritmus
Bellmann-Ford algoritmus
Bellmann-Ford algoritmus
Minimális költségű feszítőfák Pl.: városok elektromos ellátásának kiépítése
Minimális költségű feszítőfák Lényegében 3 főbb módszert ismerünk Prim Kruskal Borovka Ezek egy közös absztrakt ősből, a piros-kék eljárásból származtathatók.
A piros-kék eljárás Kék szabály: Piros szabály: válasszunk X csúcshalmazt, amiből nem vezet ki kék él az X-ből kivezető legkisebb súlyú élt színezzük kékre Piros szabály: válasszunk egy egyszerű kört amiben nincs piros él a legnagyobb súlyú színtelen élt színezzük pirosra
Példa kék szabályra
Példa kék szabályra
Példa piros szabályra
Példa piros szabályra
Kruskal algoritmus Kezdetben n db (egy pontból álló) kék fa van Két lehetőség a kiválasztott élre: - ha két különböző kék fában vannak a végpontjai kékre színezzük - ha ugyanabban akkor pirosra Nagyon mohó
A Prim algoritmus a kék szabály véges sok alkalmazásával ér célt egyetlen fát tartunk nyilván, ami folyamatosan növekszik a Dijkstra-algoritmushoz „hasonló”
Prim algoritmus X={ }
Prim algoritmus X={ }
Prim algoritmus X={1}
Prim algoritmus X={1,2}
Prim algoritmus X={1,2,5 }
Prim algoritmus X={1,2,5,4 }
Prim algoritmus X={1,2,5,4,3 }
Prim algoritmus X={1,2,5,4,3,6 }
A Prim algoritmus műveletigénye
A Prim algoritmus műveletigénye A prioritásos sor megvalósítása rendezetlen tömbbel: a lineáris idejű a keresés miatt => T(n)=σ(n*n)= σ(n2) Kupaccal: a keresés log(n)-es, a fenntartás e*log(n)-es => T(n)= σ(n+e)*log(n)-es Sűrű gráf esetén: e~n => σ(n2*log(n))> σ(n2)
Mesterséges intelligencia: az A* A mélységi és szélességi bejárás ötvözéséből jön létre Szükség van egy heurisztikus függvényre, amely előre „megbecsüli” a kiterjesztendő pont és cél várható távolságát Legjobbat először keresés
Legjobbat először keresés
Vége Köszönöm a figyelmet!