Mohó algoritmusok angolul: greedy algorithms, románul: algoritmi greedy 1. feladat. Gazdaságos telefonhálózat építése Bizonyos városok között lehet direkt telefonkapcsolatot kiépíteni, pl. x és y város között a költség k(x, y). Építsünk minimális költségű telefonhálózatot, hogy minden vároból lehessen telefonálni minden városba! A módszer: Kruskal algoritmusa Példa. 1 10 2 5 3 6 5 7 4 8 6 6 9 2 12 1 13 2 6 8 4 4 3 1 2 5 3 6 7 4 5 8 2 1 2 8 4 3 1
----------------------------------------------------------- {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8} ----------------------------------------------------------- 5,7 1 * {1}, {2}, {3}, {4}, {5,7}, {6}, [8} 7,8 2 * {1}, {2}, {3}, {4}, {5,7,8}, {6} 3,4 2 * {1}, {2}, {3,4}, {5,7,8}, {6} 3,8 3 * {1}, {2}, {3,4,5,7,8}, {6} 1,3 4 * {1,3,4,5,7,8}, {2}, {6} 4,8 4 2,3 5 * {1,2,3,4,5,7,8}, {6} 1,5 6 2,5 6 4,5 6 1,6 8 * {1,2,3,4,5,6,7,8} 3,5 9 1,2 10 5,6 12 5,8 13 ----------------------------------------------------------- A csillaggal megjelölt elemek a megoldást adják. 2
Összesen n városunk van: v 1, v 2,... v n. Az algoritmus leírásához tekintsük a direkt kapcsolotok E = {e 1, e 2,..., e m } halmazát úgy, hogy k(e i ) k(e i+1 ), minden i = 1, 2,...,m 1 értékre. Egy e i két várost köt össze, pl. v k, v l. Halmazok helyett egy h = (h 1, h 2,...,h n ) vektort használunk, amelynek elemei kezdetben egyenlőek az indexükkel, ami arra utal, hogy különböző halmazok elemei. Amikor két halmazt egyesítünk, a megfelelő h i értékeket egyenlővé tesszük (egyik halmaz elemeinek h i értékeit a másik halmaz h i értékeire állítjuk.). Kruskal(E) 1. for j=1,2,..., n 2. do h j := j 3. i := 1 4. while h elemei különbözőek 5. do if (e i végpontjai v k, v l ) és (h k h l ) 6. then kiír e i 7. for j:=1, 2,..., n 8. do if h j = h l 9. then h j := h k 10. i:=i+1 A megoldás mindig optimális. 3
2. feladat. Színezzünk ki egy térképet a lehető legkevesebb színnel! Legyenek a színek : 1, 2,.... Mindig a legkisebb számú színt használjuk, amely lehetséges. Nem ad mindig optimális megoldást. A megoldás függ a színezés sorrendjétől. Példa. a 1, b 2, a 3, b 1, a 2, b 3 a 1, b 1, a 2, b 2, a 3, b 3 b 3 a 2 a 1 b 2 a 3 b 1 3 2 b 3 a 2 a 1 2 b 2 3 1 a 3 2 b 1 3 4 3 b 3 a 2 a 1 2 3 b 2 1 a 3 b 1 2 4 Mi a hasonlóság e két példa megoldása között? Mindkettő mohó algoritmus. Lokális optimumot használ a globális optimum meghatározására. Egy adott L halmaz bizonyos tulajdonságú M részhalmazát keressük. Kezdetben M üres, és mindig a legigéretesebb elemmel bővítjük. Van mikor a megoldás optimális, van mikor nem (ekkor a neve: heurisztikus mohó algoritmus). Be kell bizonyítani, hogy a megoldás optimális. 4
Pénzváltás. Feladat: a lehető legkevesebb bankjeggyel (érmével) fizessünk ki egy összeget. Mohó stratégia: mindig a legnagyobb címlettel próbálkozunk. Ha a lehetséges címletek: 1,5,8,10, a mohó megoldás nem mindig optimális. 13=10+1+1+1, az optimális 13=8+5. Ha a lehetséges címletek: 1,5,10,25, a mohó megoldás mindig optimális. 5
Huffman-kód a b c d e f gyakoriság (ezrekben) 45 13 12 16 9 5 fix hosszú kód 000 001 010 011 100 101 változó hosszú kód 0 101 100 111 1101 1100 100 000 betűs szövegben az a 45 000-szer, a b 13 000- szer stb. fordul elő: fix esetben: 300 000 hosszú változó esetben: 224 000 hosszú mert (45 1 + 13 3 + 12 3 + 16 3 + 9 4 + 5 4) 1000 = 224000 100 0 1 86 0 1 0 58 28 14 0 1 0 1 0 1 a:45 b:13 c:12 d:16 e:9 f:5 100 0 1 14 a:45 55 0 1 25 30 0 1 0 1 c:12 b:13 14 d:16 0 1 f:5 e:9 0010110100 0.0.101.101.100 aabbc 6
Hátizsákfeladat Adottak: n tárgy s i tömeggel (súllyal), e i értékkel S súlykapacitású hátizsák Feladat: Maximális nyereséggel pakoljuk meg a hátizsákot, ha egy tárgyból le is vághatunk. ("töredékes hátizsák"-feladat) mohó: érték/súly csökkenő sorrendjében pakolunk optimális Ha csak egész tárgyakat helyezhetünk el, akkor nem mindig optimális. Példa: S = 110, n = 8 e i : 11 21 31 33 43 53 55 65 s i : 1 11 21 23 33 43 45 55 e i /s i : 11 1.9 1.47 1.43 1.3 1.23 1.22 1.18 Megoldás: mohó: 1, 11, 21, 23, 33 összeg = 89, érték = 139 optimális: 1, 11, 21, 33, 43 összeg = 109, érték = 159 töredékes hátizsák: 1, 11, 21, 23, 33, 21 (a 43-ból) összeg = 110, érték = 164.23 7
Ütemezés 1 Feladat: 3 processzoron 9 programot futtatni a lehető legrövidebb idő alatt. A programok időtartamai: 3, 5, 6, 10, 11, 14, 15, 18, 20 másodperc. P 1 P 2 P 3 leghosszabb először 20 10 3 18 11 6 15 14 5 35 mp. P 1 legrövidebb először 3 10 15 P 2 P 3 5 11 18 6 14 20 40 mp. P 1 P 2 P 3 optimális 20 14 18 11 5 15 10 6 3 34 mp. 8
Ütemezés 2 Feladat: n beteg kezelése úgy, hogy az összvárakozás minimális legyen. n = 3 t 1 = 60, t 2 = 10, t 3 = 30. sorrend összvárakozási idő 1,2,3 0+60+(60+10)=130 1,3,2 0+60+(60+30)=150 2,3,1 0+10+(10+30)= 50 2,1,3 0 +10+(10+60)=80 3,1,2 0+30+(30+60)=120 3,2,1 0+30+(30+10)=70 mohó: t 1 t 2... t n sorrendben vizsgálunk a megoldás mindig optimális 9
Eseménykiválasztás a i esemény az [s i, f i ) időintervallumban történik (i = 1, 2,...,n). Feladat: Válasszunk ki minél több eseményt, amelyek nem fedik egymást időben. mohó: rendezzük f i szerint növekvő sorrendbe, és válasszuk ki azokat, amelyek nem fedik egymást optimális i 1 2 3 4 5 6 7 8 9 10 11 s i 1 3 0 5 3 5 6 8 8 2 12 f i 4 5 6 7 8 9 10 11 12 13 14 optimális: a 1, a 4, a 8, a 11 (szintén jó: a 2, a 4, a 9, a 11 ) 10
Huzalozás Feladat: legrövidebb huzallal kössünk össze egy-egy fekete és fehér korongot. 3 3 3 3 1+1+1+3=6 mohó: balról jobbra első fekete-fehér pár, "töröljük", majd folytatjuk optimális 11
Robotok a sakktáblán Egy robot bal-felső sarokból indul, mehet jobbra és lefele. Feladat: minimális számú robot szedje össze az összes érmét a tábláról. R R mohó: jobbra megy, ha van a sorban érme, különben egyet lefele, majd ismétli optimális 12
Utazó ügynök problémája mindig a legközelebbi városba megy nem optimális mohó: A,B,D,B,C,E 16 optimális: A,D,B,C,E 14 13
Általános leírás Adott az L halmaz, egy P tulajdonság az L részhalmazaira (igaz v. hamis). Keresünk egy optimális M részhalmazt. Mohó(L, P) 1. M := 2. while (M nem megoldás) és (L ) 3. do válasszuk ki L-ből a legigéretesebb x elemet 4. L := L \ {x} 5. if P(M {x}) igaz 6. then M := M {x} 7. if M megoldás 8. then return M 9. else return Nincs megoldás Sokszor előfeldolgozást végzünk (pl. rendezzük L elemeit), ekkor a 3. lépésnél mindig a következő elemet választjuk. L minden elemét csak egyszer vizsgáljuk. 14