Mohó algoritmusok�2024.10.09
Ismétlés
Dinamikus programozás
Az eddigiekben egy-egy összetett feladat megoldására oszd-meg-és-uralkodj megoldást használtunk.
A rekurzív megoldás legnagyobb hátránya azonban az, hogy legtöbb esetben, ahogy növekszik az elemszámunk, vele együtt hatványozottan növekszik a megoldáshoz szükséges idő hossza és a lépések száma is.
Dinamikus programozás
A dinamikus programozás a részproblémákra bontás gyengeségeit két fő módszerrel próbálja orvosolni:
Az egyik módszer lényege, hogy programunk futása alatt
(TÁBLÁZATKITÖLTÉS módszere)
def fib( n, memo ) :
if memo[n] != null:
return memo[n]
if (( n == 2 ) || (n == 1)):
result = 1
else
result = fib(n-1) + fib(n-2)
memo[n] = result
return result
memo = 1 1 2 3
T(n) = 2n + 1 …… O(n)
Fibonacci
Dinamikus programozás
A második módszer:
Általában amikor a részproblémákat többször is szükséges megoldani, akkor az összes lehetséges „kis” részproblémát ki kell számolni, hogy az eredeti nagy probléma megoldása kiszámítható legyen.
Dinamikus programozás
Vegyük észre, hogy ez ellentétes az oszd-meg-és-uralkodj algoritmusok filozófiájával, ahol mindig az eredeti problémát bontjuk kisebb és kisebb problémákra
(FELÖLRŐL LEFELÉ ÉPÍTKEZÉS módszere)
Lépcső
Az előző órán a rekurzív algoritmushoz megadtuk az összefüggéseket:
Alapeset:
Rekurzív eset:
Lépcső
Ezek alapján a következő dinamikus programozási eljárást adhatjuk meg, ahol egy T tömböt töltünk ki, T[i] a P(i) értékét tartalmazza:
Sakk
Megoldás:
Az előző órán megadtuk a rekurzív algoritmusokhoz az összefüggéseket.
A következő összefüggések állnak fent:
Alapeset:
Rekurzív eset:
Sakk
Ezek alapján a következő dinamikus programozási eljárást adhatjuk meg, T[i, j] az R(i, j) értékét tartalmazza:
Mohó algoritmusok
Mohó algoritmusok
Mohó algoritmusok
,,optimálisnak tűnő döntés”
Nem minden probléma oldható meg mohó algoritmussal és nem mindig ad optimális megoldást.
Mohó algoritmusok
Ha valami mohó módon megoldható, akkor 2 tulajdonságot biztosan el tudunk róla mondani:
• Optimális részstruktúra: Egy feladat optimális részstruktúrájú, ha a probléma egy optimális megoldása önmagán belül a részfeladatok optimális megoldásait tartalmazza.
• Mohó választás tulajdonság: lokálisan optimális választások a globálisan optimális megoldáshoz vezetnek
Mohó algoritmusok
Egy mohó algoritmus tervezésének lépései:
2. Bizonyítsuk be, hogy mindig van olyan optimális megoldása az eredeti problémának, amely tartalmazza a mohó választást, tehát a mohó választás mindig biztonságos
Mohó algoritmusok
Egy mohó algoritmus tervezésének lépései:
3. Mutassuk meg, hogy a mohó választással olyan részprobléma keletkezik, amelynek egy optimális megoldásához hozzávéve a mohó választást, az eredeti probléma egy optimális megoldását kapjuk.
Mohó algoritmusok
Mohó algoritmusok
Mohó algoritmusok
Mohó algoritmusok
Mohó algoritmusok
Mohó algoritmusok
Pénzváltás probléma
Pénzváltás probléma
Pénzváltás probléma
(Pl.: a pénztáros ad 80.000 Ft-ot 4 db 20.000 Ft-os címlettel, majd a nyugdíjas visszaad 155 Ft-ot.)
Pénzváltás probléma
Megoldás:
Pénzváltás probléma
A pénztáros az alábbi címleteket fogja adni:
3 db 20.000 Ft-os = 60.000 Ft
1 db 10.000 Ft-os = 10.000 Ft
1 db 5.000 Ft-os = 5.000 Ft
2 db 2.000 Ft-os = 4.000 Ft
1 db 500 Ft-os = 500 Ft
1 db 200 Ft-os = 200 Ft
1 db 100 Ft-os = 100Ft
2 db 20 Ft-os = 40 Ft
1 db 5 Ft-os = 5 Ft 79.845 Ft
Ez összesen 13 db papír pénzt, illetve pénzérmét jelent.
Pénzváltás probléma
def findMin(V):
ermek = [ 5, 10, 20, 50,100,200,500,1000,2000 ,5000,10000,20000]
n = len(ermek)
ans = []
i = n - 1
while(i >= 0):
#Keresse meg a címleteket
while (V >= ermek[i]):
V -= ermek[i]
ans.append(ermek[i])
i -= 1
for i in range(len(ans)):
print(ans[i], end = " ")
Levélfeladás
Levélfeladás
Nyugdíjasunk szeretne feladni egy levelet, mely 1400 Ft-ba kerül. Hogyan lehet ezt megtenni, ha a lehető legkevesebb számú bélyeget szeretnénk a borítékra tenni.
Rendelkezésre álló bélyegcímletek:
3.500 Ft
1.000 Ft
700 Ft
340 Ft
210 Ft
100 Ft
10 Ft
Ha a mohó algoritmust használjuk oly módon, hogy mindig a lehető legnagyobb címletű bélyeget ragasztjuk fel, akkor az alábbi megoldást kapjuk:
0 db 3.500 Ft-os = 0 Ft
1 db 1.000 Ft-os = 1.000 Ft
0 db 700 Ft-os = 0 Ft
1 db 340 Ft-os = 340 Ft
0 db 210 Ft-os = 0 Ft
0 db 100 Ft-os = 0 Ft
6 db 10 Ft-os = 60 Ft
1.400 Ft-os
Az algoritmus szerint 8 db bélyegre van szükségünk.
Könnyen látható, hogy a mohó algoritmus által adott megoldás most nem optimális.
Az optimális megoldás 2 db 700 Ft-os bélyeg választása lenne.
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Hátizsák pakoló probléma
Munkavégzés sorrendje
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel
Munkavégzés sorrendje, határidőkkel