Dinamikus programozás

Slides:



Advertisements
Hasonló előadás
Készítette: Kosztyán Zsolt Tibor
Advertisements

A Floyd-Warshall algoritmus
A Dijkstra algoritmus.
Nevezetes algoritmusok
Programozási tételek, és „négyzetes” rendezések
Készítette: Major Máté
Illeszkedési mátrix Villamosságtani szempontból legfontosabb mátrixreprezentáció. Legyen G egy irányított gráf, n ponton e éllel. Az n x e –es B(G) mátrixot.
Minimális költségű feszítőfák
DAG topologikus rendezése
Dijkstra algoritmus Irányított gráfban.
Dijkstra algoritmus Baranyás Bence. Feladat Adott egy G=(V,E) élsúlyozott, irányított vagy irányítás nélküli, negatív élsúlyokat nem tartalmazó, véges.
Az összehasonlító rendezések
Készítette: Pető László
Java programozási nyelv 2. rész – Vezérlő szerkezetek
Papp Róbert, Blaskovics Viktor, Hantos Norbert
A digitális számítás elmélete
Prím algoritmus.
1 Györgyi Tamás – GYTNAAI.ELTE 2007 Április 03 Algoritmusok És Adatszerkezetek 2 Gráfalgoritmus Bellman-Ford Algoritmusa S a b d e
„Országos” feladat. Feladat: Egy tetszőleges, színes országokat tartalmazó térképen akar eljutni egy kommandós csapat egy országból egy másikba. Viszont.
Dijkstra algoritmus Algoritmusok és adatszerkezetek 2. Újvári Zsuzsanna.
Szélességi bejárás A szélességi bejárással egy irányított vagy irányítás nélküli véges gráfot járhatunk be a kezdőcsúcstól való távolságuk növekvő sorrendjében.
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Készítette: Kosztyán Zsolt Tibor
Dijkstra-algoritmus ismertetése
Algoritmusok II. Gyakorlat 3. Feladat Pup Márton.
1 AAO folytatás ++ Csink László. 2 Rekurzív bináris keresés (rendezett tömbben) public static int binker(int[] tomb, int value, int low, int high) public.
A Dijkstra algoritmus.
Gráfok 1. Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék
1 Szélességi Bejárás Györgyi Tamás – GYTNAAI.ELTE 2007 Március 22 Algoritmusok És Adatszerkezetek 2 Gráfalgoritmus S b a d e f h g c.
1 Dijkstra Algoritmusa Györgyi Tamás – GYTNAAI.ELTE 2007 Április 02 Algoritmusok És Adatszerkezetek 2 Gráfalgoritmus S a b c d e
Algoritmizálás, adatmodellezés tanítása 8. előadás.
1 Vektorok, mátrixok.
Kruskal-algoritmus.
Algoritmus és adatszerkezet Tavaszi félév Tóth Norbert1 Floyd-Warshall-algoritmus Legrövidebb utak keresése.
Bellmann-Ford Algoritmus
Dodekaéder Hamilton köre
Nagy Szilvia 7. Lineáris blokk-kódok
Útkeresések.
Diszjunkt halmazok adatszerkezete A diszjunkt halmaz adatszerkezet diszjunkt dinamikus halmazok S={S 1,…,S n } halmaza. Egy halmazt egy képviselője azonosít.
Morvai Mária-Júlia F3D3D4.  Adott egy G=(V,E)élsúlyozott, irányított vagy irányítás nélküli, negatív élsúlyokat nem tartalmazó,véges gráf. Továbbá adott.
DIJKSTRA- ALGORITMUS. A Dijkstra-algoritmus egy mohó algoritmus, amivel irányított vagy irányítás nélküli, negatív élsúlyokat nem tartalmazó, véges gráfokban.
Algoritmusok és adatszerkezetek
Excel programozás (makró)
Prim algoritmus Algoritmusok és adatszerkezetek 2. Újvári Zsuzsanna.
INFOÉRA Gráfok, gráfalgoritmusok II. (Horváth Gyula és Szlávi Péter előadásai felhasználásával) Juhász István-Zsakó László: Informatikai.
(Bináris) Kupac (heap) adattípus
Dijkstra algoritmus. Egy minimális költségű utat keres élsúlyozott gráfban A gráf lehet irányított vagy irányítás nélküli Feltétele, hogy pozitív élsúlyok.
Eötvös Konferencia, 2008 április 26. Kovács Máté 1 Útkeresések optimalizálása számítógépes játékokban.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozás II. Gráfok Dijkstra algoritmus Kruskal algoritmus.
HÁLÓZAT Maximális folyam, minimális vágás
Gráfalgoritmusok Tassy Gergely Veres Péter Gimnázium, Budapest június 30.
A Dijkstra algoritmus.
BFák Kiegyensúlyozott keresőfák
Mediánok és rendezett minták
INFOÉRA Gráfok, gráfalgoritmusok III. (Horváth Gyula és Szlávi Péter előadásai felhasználásával) Juhász István-Zsakó László: Informatikai.
Amortizációs elemzés Alapelv: nem egy-egy művelet lefutási idejét vizsgáljuk, hanem több műveletét együtt, sokszor Eredmény: átlagolt időszükséglet időátlagban.
Algoritmusok és Adatszerkezetek I.
Minimális feszítőfák Definíció: Egy irányítatlan gráf feszítőfája a gráfnak az a részgráfja, amely fagráf és tartalmazza a gráf összes cúcspontját. Definíció:
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Gráfalgoritmusok G=(V,E) gráf ábrázolása
Dijkstra algoritmusa: legrövidebb utak
Dijkstra algoritmusa: legrövidebb utak
Dijkstra algoritmusa: legrövidebb utak
Gráfalgoritmusok G=(V,E) gráf ábrázolása
2-3-fák A 2-3-fa egy gyökeres fa az alábbi tulajdonságokkal:
Körmentes irányított gráfban legrövidebb utak
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Előadás másolata:

Dinamikus programozás Problémamegoldási megközelítés – (rossz fordítás) Oszd meg és uralkodj: független részproblémák Dinamikus programozás esetén nem függetlenek. (Az Oszd meg és uralkodj feleslegesen többet dolgozna) Jellemzése: 1. Vázoljuk az optimális megoldás szerkezetét 2. Adjunk rekurzív definíciót az értékére 3. Alulról-felfelé (bottom-up) kiszámítjuk a részproblémák optimális megoldásait 4. Ezeket kombinálva kiszámítjuk az egész probléma optimális megoldását

Dinamikus programozási példa: Mátrixsorozat összeszorzása M1 M2…Mn – a mátrixszorzás asszociatív, de nem kommutatív. Viszont nem egyformán hatékony a zárójelezéselétezik optimális zárójelezés iMj1 jMk2…lMmniMm – a szorzótényezők sor-oszlop kompatibilisek kell, hogy legyenek iMj1 jMk2 időigénye: i*j*k. Például… (10x100 * 100x5) * 5x50  5000 + 2500 Viszont... 10x100 * (100x5 * 5x50)  25000+50000

Mátrixszorzás Melyik az oszlop és melyik a sor? Közös dimenziójú oszlop- ill. sorpárok elemeit összeszorozzuk és összeadjuk. Az eredmény: sorok száma az elsőből, oszlopok száma a másodikból Mátrixszorzat(A,B) if oszlop(A)<>sor(B) then error else for i=1 to sor(A) do for j=1 to oszlop(B) do C[i,j]=0 for k=1 to oszlop(A) do C[i,j]=C[i,j]+A[i,k]*B[k,j] return C

Szorzások számának becslése az összes lehetőség végigvizsgálásával? Exponenciális algoritmus!! Egyetlen újabb mátrixtényező hozzávétele a lehetőségek számát legalább megkétszerezi (bár nem lenne muszáj mindent újra kiszámítani) iMj1 jMk2…lMmnPn, akkor Pn+1>Pn*2 P(1)=1; P(n)= k=0Σn-1 P(k) *P(n-k), ha n>=2 Észrevétel: (M1M2…Mk )*(Mk+1…Mn) Ha a teljes szorzat optimális, akkor a részszorzatainak is optimálisnak kell lenni. Hányféle lehetőség van a szorzatszámbecslésre

Rekurzív (naív) megoldás Legyen m[i,j] az Mi..j szorzatszakasz optimális kiszámításának szorzatszáma. (1<i,j<n) m[i,i] = 0 m[i,j]=mini<=k<j(m[i,k]+m[k+1,j]+ +sor(i)*oszlop(k)*oszlop(j)) k szerinti ciklusban, az m szerinti rekurzív hívással (FentrőlLefelé-TeljestőlRészekig-TopDown - FeketeLuk megközelítés) exponenciális idő, mert a részfeladatokat esetleg többször is megoldja átfedő részfeladatok

Szorzások számának becslése Hány részfeladat van összesen? Ahány m[i,j] részoptimum, vagyis ahány 1<=i<=j<=n (i,j) pár, összesen n*(n+1)/2= Θ(n2) Megoldás: AlulrólFelfelé, a RészektőlEgészig, BottomUp, a részeredmények tárolásával Algoritmuselemzés: Futásidő: 1 részfeladat kiszámítása egy n hosszú vektor (átló) optimumkeresése.  Θ(n3) Helyigény: Θ(n2) Filozófia: TopDown vagy BottomUp? – Lebontunk, vagy építkezünk? – Csőlátás vagy halszemoptika? – Holisztika vagy redukcionizmus? Ügyes szakbarbárok, vagy haszontalan próféták?

Példa M1(30x35)*M2(35x15)*M3(15x5)*M4(5x10)*M5(10x20)*M6(20x25) i 1 i 10500 6 3500 3 3 3 5 5 5000 15125 5375 11875 3 3 3 4 7125 2500 1000 j 3 750 3 3 9375 4375 7875 2 j 2625 1 m[i,j]: az Mi..j optimális szorzásszám 15750 2 1 s[i,j]: i és j között hol kellett zárójelezni 1 Pl. az m[2,5] = min {m[2,2]+m[3,5]+35*15*20=13000 --- m[2,3]+m[4,5]+35*5*20=7125 --- m[2,4]+m[5,5]+35*10*20=11375} = 7125

Átlósan haladunk, l a kezdő j index Mátrixok száma MSzorzásSorrend(n) for i=1 to n do m[i,i]=0 for l=2 to n do for i=1 to n-l+1 do j=i+l-1 m(i,j)= ∞ for k=i to j-1 do Szorz=m[i,k]+m[k+1,j]+ sor(i)*oszlop(k)*oszlop(j) if Szorz<m[i,j] then m[i,j]=Szorz s[i,j]=k return m, s Főátló kinullázása Átlósan haladunk, l a kezdő j index k töréspont (i<=k<j)

A M…Sorrend algoritmus által elkészített „elvágási” mátrix Az optimális megoldás Mátrixok vektora MátrixLáncSzorzat(M,i,j) if j>i then X=MátrixLáncSzorzat(M,i,s[i,j]) Y=MátrixLáncSzorzat(M,s[i,j]+1,j) return(Mátrixszorzat(X,Y)) else return M[i] A helyes zárójelezés: (M1 * (M2 * M3)) * ((M4 * M5) * M6) A M…Sorrend algoritmus által elkészített „elvágási” mátrix

Hol alkalmazható egyáltalán? Optimalizálási probléma Optimális részstruktúrák Egymást átfedő részfeladatok (az Oszd Meg és Uralkodj nem vizsgálja a visszatérő részfeladatokat, hanem újra megoldja őket) 1-4 1-1 2-4 1-2 3-4 1-3 4-4 2-2 3-4 2-3 4-4 1-1 2-2 3-3 4-4 1-1 2-3 1-2 3-3 3-3 4-4 2-2 3-3 2-2 3-3 1-1 2-2 Egy alternatív megoldás!! Rekurzív, felülről lefelé (naív) megoldás a részeredmények mátrixba történő feljegyzésével

Legrövidebb utak irányított gráfokban G=(V,E) irányított gráf + w:ER súlyfüggvény. Egy p=(v0, v1,…, vk) út súlya: w(p)= i=0Σk w(vi ,vi+1 ) Az u-ból v-be vivő legrövidebb út definíciója: δ(u,v)=Σ min{w(p),p:uv}, ha létezik p, egyébként ∞ Figyelem!! δ(u,v) NEM egyértelmű!! Legrövidebb utak feszítőfájaminimális súlyú feszítőfa Problématípusok: Alapprobléma: egy adott sÎV kezdőcsúcsból az összes v csúcsba vivő legrövidebb utak problémája. Következmények: 1. Adott csúcsba mindenhonnan beérkező legrövidebb utak problémája. (megoldás az élek megfordításával) 2. Adott csúcspár közötti legrövidebb utak problémája (nem ismert aszimptotikusan gyorsabb megoldás, mint az Alapprobléma) 3. Összes csúcspár közötti legrövidebb utak problémája (Alapprobléma minden csúcsra – ennél gyorsabb megoldás is létezik)

Negatív súlyú élek Negatív súlyú élek, ill. negatív összsúlyú körök problematikusak. Ha ilyet tartalmaz egy u-ból v-be vivő út, akkor δ(u,v)=- ∞. Ha v nem elérhető, akkor δ(u,v)=∞ Algoritmuseredmények: 1. Súly, 2. Út (utak) -4 a b 4 3 6 8 5 d g s c -3 Negatív kör 7 2 3 e f -6

Algoritmusok általános jellemzése Dijkstra algoritmusa: csak nemnegatív élekre! Bellman-Ford algoritmus: negatív élekre is működik, megtalálja a negatív köröket is Bellman-Ford algoritmus használata lineáris programozási feladatokra Fokozatos közelítés: az egyes csúcsok elérési súlyainak közelítése a felső korlát fokozatos finomítása (csökkentése) útján Alapelv: az optimális részstruktúrák elve. Egy optimális utakat tartalmazó feszítőfa részei szintén optimális utakat tartalmaznak. Mohó algoritmusokdinamikus programozás

Dijkstra algoritmusa Dijkstra(s) for "vÎV do Táv[v]=∞ Szülő[v]=NIL Táv[s]=0 Bejáratlan=V while Bejáratlan<>{} do u=Bejáratlan.KiveszMin for "vÎSzomszéd(u) do if Táv[v]>Táv[u]+Súly[u,v] then Táv[v]=Táv[u]+Súly[u,v] Szülő[v]=u Elsőbbségi sor, a távolság becslés alapján. Valójában azonban mindig csak a NemBejárt-Bejárt vágatból vesszük a következő csúcsot

A Dijkstra-algoritmus működése 1 u:∞ v:∞ u:10 v:14 u:8 u:8 v:9 v:13 10 2 3 9 6 4 s:0 s:0 5 7 x:5 x:5 x:∞ y:7 y:∞ 2 Megjegyzések: 1. Hasonlít a „SzéltébenBejár” és a „Prim” algoritmusra. Különbség elemzése HÁZI FELADAT… 2. Csak pozitív élsúlyokra működik 3. Mohó? Dinamikus? Bottom-up: Top-down?

Optimális feszítőfaLegrövidebb utak c d A fa TELJES súlya minimális, az egyes élekhez vezető utak nem feltétlenül Minden lépésben a nyitott vágat legkönnyebb élét vesszük hozzá a halmazhoz. Ehhez nem feltétlenül vezet a legrövidebb út. 8 7 9 4 2 4 11 14 i e a 7 6 10 8 h g f 1 2 Az egyes élekhez vezető utak KÜLÖN-KÜLÖN minimálisak, a fa teljes súlya nem feltétlenül, Minden lépésben a nyitott vágat legrövidebb úthosszúságú élét vesszük hozzá a halmazhoz, ez nem feltétlenül a legkönnyebb is. b c d 8 7 9 4 2 4 11 14 i e a 7 6 10 8 h g f 1 2

A Dijkstra algoritmus elemzése 1. A „Bejáratlan” tömb lineáris vektor. KiveszMin O(V), és |V| ilyen művelet van KiveszMin össz. O(V2) A Szomszéd(u) a gráf minden élét 1szer vizsgálja meg. O(V2 +E) 2. A „Bejáratlan” tömb bináris kupac, KiveszMin ideje O(lgV), és |V| ilyen művelet van. Kupacfelépítés: O(V) KulcsotCsökkent: O(lgV), és legfeljebb |E| ilyen művelet van.  össz.O((V+E)lgV) = O(ElgV) 3. Fibonacci kupacokkal: O(VlogV+E)

A Bellman-Ford algoritmus + elemzése Negatív súlyú élek is lehetségesek Negatív körökre HAMIS logikai értéket ad Futási ideje: O(V*E) Buborékrendezéshez hasonló működési elv Negatív körökbe a legkönnyebb út választása miatt bepörög, és a pörgést csak a ciklus vége állítja le Ha egy csúcs nem elérhető, akkor Táv[u]=∞

A háló lehetséges leghosszabb útja BellmanFord(s) for "vÎV do Táv[v]=∞ Szülő[v]=NIL Táv[s]=0 for i=1 to |V|-1 do for "u,vÎE if Táv[v]>Táv[u]+Súly[u,v] then Táv[v]=Táv[u]+Súly[u,v] Szülő[v]=u for "u,vÎE do if Táv[v]>Táv[u]+Súly[u,v] then return HAMIS return IGAZ Él kiválasztása valamilyen rendezés szerint (pl. lexikografikus sorrendben) Egy közelítés hatása legrosszabb esetben |V| lépés után teljesen biztosan eljut minden élhez Negatív kör keresése A fokozatos közelítés miatt ilyen feltétel csak akkor alakulhat ki, ha fenti ciklus leállt

A Bellman-Ford algoritmus működése 5 u:6 u:∞ u:2 v:4 v:∞ -2 6 8 -4 -3 7 z:0 7 2 x:∞ x:7 y:∞ y:2 y:-2 9

Legrövidebb utak Irányított Körmentes Gráfokban (KIG) KIG: A legrövidebb utak jól definiáltak, mert nincs negatív kör Algoritmus: az éleket a csúcsok topologikus rendezésének sorrendjében tekinti Nincs ciklus, nincs visszamutató él Futási idő: Topologikus rendezés: Θ(V+E) – Minden élt egyszer vizsgálunk – Közelítés konstans idő  Θ(V+E) Sejtés: elég lenne csak a kiindulási csúcstól?

KIGLegrövidebbUtak(s) A csúcsok topologikus rendezése for "vÎV do Táv[v]=∞ Szülő[v]=NIL Táv[s]=0 for "uÎV - a topologikus rendezés sorrendjében do for "vÎUtód(u) if Táv[v]>Táv[u]+Súly[u,v] then Táv[v]=Táv[u]+Súly[u,v] Szülő[v]=u Közelítés 6 1 5 2 7 -1 -2 r:∞ s:0 s:0 t:2 t:2 t:∞ u:∞ u:6 u:6 v:6 v:∞ v:5 v:5 x:4 x:3 x:3 x:∞ 3 4 2

PERT (Program Evaluation and Review Technique) diagram – kritikus út meghatározása Munkafolyamat: tevékenységek, mérföldkövek (KIG-ek!) Gráfélek: tevékenységek, súlyok: időtartamok uv, vx élek: az uv tevékenységnek meg kell előznie a vx-et Egy uv út egy tevékenységsorozat, amit csak az adott sorrendben lehet elvégezni Kritikus út: a KIG-en keresztülvezető leghosszabb út. Ez a teljes munkafolyamat időszükségletére vonatkozó alsó határ.

Ugyanaz az algoritmus, mint a LegrövidebbUtak... KIGLeghosszabbUtak(s) A csúcsok topologikus rendezése for "vÎV do Táv[v]=-∞ Szülő[v]=NIL Táv[s]=0 for "uÎV a topologikus rendezés sorrendjében do for "vÎUtód(u) if Táv[v]<Táv[u]+Súly[u,v] then Táv[v]=Táv[u]+Súly[u,v] Szülő[v]=u …csupán a közelítés az ellenkező feltételt vizsgálja 6 1 5 2 7 1 2 r:-∞ s:0 s:0 t:-∞ t:2 t:2 u:6 u:-∞ u:9 u:9 v:6 v:-∞ v:10 v:10 x:12 x:12 x:-∞ x:4 x:10 4 3 2