dinamikus programozás

26
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

Upload: kuper

Post on 24-Jan-2016

31 views

Category:

Documents


1 download

DESCRIPTION

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) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Dinamikus programozás

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ét2. Adjunk rekurzív definíciót az értékére3. Alulról-felfelé (bottom-up) kiszámítjuk a részproblémák optimális megoldásait4. Ezeket kombinálva kiszámítjuk az egész probléma optimális megoldását

Page 2: Dinamikus programozás

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éselétezik optimális zárójelezés

• iMj1 jMk

2…lMmniMm – a szorzótényezők sor-oszlop

kompatibilisek kell, hogy legyenek

• iMj1 jMk

2 időigénye: i*j*k. Például…

• (10x100 * 100x5) * 5x50 5000 + 2500Viszont...

• 10x100 * (100x5 * 5x50) 25000+50000

Page 3: Dinamikus programozás

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 errorelse 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

Page 4: Dinamikus programozás

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 jMk

2…lMmnPn, 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

Page 5: Dinamikus programozás

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] = 0m[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

Page 6: Dinamikus programozás

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?

Page 7: Dinamikus programozás

PéldaM1(30x35)*M2(35x15)*M3(15x5)*M4(5x10)*M5(10x20)*M6(20x25)

0

0

0

0

0

0

i i

j

j

1

1

2

1

6

6

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

m[i,j]: az Mi..j optimális

szorzásszám

s[i,j]: i és j között hol kellett

zárójelezni

15750

2625

750

1

2

3

4

5

1000

5000

7875

4375

2500

3500

9375

7125

5375

11875

1050015125

1

3

3

5

3

3

3

333

Page 8: Dinamikus programozás

Átlósan haladunk, l a kezdő j index

• MSzorzásSorrend(n)for i=1 to n do m[i,i]=0for 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]=Szorzs[i,j]=k

return m, s

Mátrixok száma

Főátló kinullázása

k töréspont (i<=k<j)

Page 9: Dinamikus programozás

Az optimális megoldás• 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)

Mátrixok vektora

A M…Sorrend algoritmus által

elkészített „elvágási” mátrix

Page 10: Dinamikus programozás

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

Page 11: Dinamikus programozás
Page 12: Dinamikus programozás

Legrövidebb utak irányított gráfokban• G=(V,E) irányított gráf + w:ER 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:uv}, ha létezik p, egyébként ∞• Figyelem!! δ(u,v) NEM egyértelmű!!• Legrövidebb utak feszítőfájaminimális súlyú feszítőfa• Problématípusok:• Alapprobléma: egy adott sV 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)

Page 13: Dinamikus programozás

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)

s

a b

c d

e f

g

3

-4

4

5

6

-32 3

-6

7

8

Negatív kör

Page 14: Dinamikus programozás

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ó algoritmusokdinamikus programozás

Page 15: Dinamikus programozás

Dijkstra algoritmusa• Dijkstra(s)for vV do Táv[v]=∞ Szülő[v]=NILTáv[s]=0Bejáratlan=Vwhile Bejáratlan<>{} do u=Bejáratlan.KiveszMin for vSzomszé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

Page 16: Dinamikus programozás

y:∞y:7x:∞x:5

u:∞u:10

A Dijkstra-algoritmus működése

s:0

v:∞

x:5

u:8u:810

5

1

92 3 6 4

2

7

s:0

v:14v:13v:9

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?

Page 17: Dinamikus programozás

Optimális feszítőfaLegrövidebb utak• 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.

a

b

h

i

g

d

f

e

9

10

1411

21

8

4

6

2

7

8

7c4

a

b

h

i

g

d

f

e

9

10

1411

21

8

4

6

2

7

8

7c4

• 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.

Page 18: Dinamikus programozás

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)

Page 19: Dinamikus programozás
Page 20: Dinamikus programozás

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]=∞

Page 21: Dinamikus programozás

• BellmanFord(s)for vV do Táv[v]=∞ Szülő[v]=NILTáv[s]=0for i=1 to |V|-1 do for u,vE 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]=ufor u,vE do if Táv[v]>Táv[u]+Súly[u,v] then return HAMISreturn IGAZ

Negatív kör keresése

A háló lehetséges leghosszabb útja

Egy közelítés hatása legrosszabb esetben |V| lépés után teljesen biztosan eljut minden élhez

A fokozatos közelítés miatt ilyen feltétel csak akkor alakulhat ki,

ha fenti ciklus leállt

Él kiválasztása valamilyen rendezés szerint (pl.

lexikografikus sorrendben)

Page 22: Dinamikus programozás

A Bellman-Ford algoritmus működése

y:∞x:∞

u:∞6 -2

8 -4

2

-3

z:0

v:∞

7

9

7

5u:6

x:7

v:4

y:2

u:2

y:-2

Page 23: Dinamikus programozás

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?

Page 24: Dinamikus programozás

• KIGLegrövidebbUtak(s)A csúcsok topologikus rendezésefor vV do Táv[v]=∞ Szülő[v]=NILTáv[s]=0for uV - a topologikus rendezés

sorrendjében do for vUtó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

r:∞ s:0 t:∞ u:∞ v:∞ x:∞5 2 7 -1 -2

6 1

3 42

s:0 t:2 u:6t:2 v:6 x:4u:6 v:5v:5 x:3x:3

Page 25: Dinamikus programozás

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

• uv, vx élek: az uv tevékenységnek meg kell előznie a vx-et

• Egy uv ú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.

Page 26: Dinamikus programozás

• KIGLeghosszabbUtak(s)A csúcsok topologikus rendezésefor vV do Táv[v]=-∞ Szülő[v]=NILTáv[s]=0for uV a topologikus rendezés sorrendjében do for vUtó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

r:-∞ s:0 t:-∞ u:-∞ v:-∞ x:-∞5 2 7 1 2

6 1

3 4 2

s:0

Ugyanaz az algoritmus, mint a LegrövidebbUtak...

…csupán a közelítés az ellenkező feltételt vizsgálja

t:2 u:6t:2 v:6 x:4v:10 x:10v:10 x:12u:9u:9 x:12