580 likes | 782 Views
Mohó algoritmusok. Szlávi Péter ELTE IK szlavip@elte.hu. „A mohóság dicsérete” – bevezetés Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Első példázat a „zenekar”-ról Második példázat a „fényképeszkedés”-ről Harmadik példázat a „ültetés”-ről Konklúzió?
E N D
Mohó algoritmusok Szlávi Péter ELTE IK szlavip@elte.hu
„A mohóság dicsérete” – bevezetés Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Első példázat a „zenekar”-ról Második példázat a „fényképeszkedés”-ről Harmadik példázat a „ültetés”-ről Konklúzió? Komolytalan befejezés, ha még nem lenne elég a jókedv Megpróbáltatások Mohó algoritmusok
„A mohóság dicsérete” – bevezetés • Optimalizációs problémák • A „hagyományos” kereső módsze-rek (sőt: a backtrack és a dinamikus prog-ramozás is) hosszadalmasak • Válasszuk mindig a legjobbnak tetszőt (a lokális optimumot) • Lehet, hogy ez globális optimum? Be kell látni! egy kis kalandozás a Carpe diem! nyomán Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Egy esemény-kiválasztási feladat Bemenet: • E={1..n} esemény egy erőforrásért • Minden esemény ideje: [ki,vi) • i,j kompatibilisek [ki,vi)[kj,vj)= Kimenet: • M={e1,e2…eDb} eiE • M maximális elemszámú • ei-k páronként kompatibilisek Mohó algoritmusok
[ ) [ [ ) [ ) ) [ ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Próbálkozzunk egy példával! S egy kézenfekvő megoldás-ötlettel: a backtrack-kel! Rajzoljunk! Mohó algoritmusok
[ ) [ [ ) [ ) ) [ ) Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Választási lehetőségek: • [1,15) Db=1 • [3,6) [7,12) Db=2 [9,17) Db=2 • [7,12) ilyen már volt Db=1 • [5,11) Db=1 • [9,17) ilyen már volt Db=1 Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Megoldás józanésszel1: • Eseményenként döntsünk arról, hogy bevesszük vagy nem! Bevehető, ha „kompatibilis” az ed-digiekkel. • Válasszunk az események közül úgy, hogy a legkevesebbet mu-lasszuk el! Az az optimális, amelyik leghama-rabb kezdődik. Nem nyert! Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Megoldás józanésszel2: • Eseményenként döntsünk arról, hogy bevesszük vagy nem! Bevehető, ha „kompatibilis” az ed-digiekkel. • Válasszunk az események közül úgy, hogy a legtöbb lehetőség ma-radjon a továbbiak számára! Az az optimális, amelyik leghama-rabb ér véget. Lehetséges? Mohó algoritmusok
[ [ ) ) [ [ [ [ ) ) [ [ ) ) ) ) [ [ ) ) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Próbáljuk ezt ki! A vég-szerinti sorrend: ? Mohó választással a megoldás: Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Jó ez így általában is? Lássuk be! Tegyük föl, hogy M={e1,e2,…,eu}, ei<ei+1megoldás is, optimális is! Rendezés v1vi {1,e2,…,eu} is… az optimális megoldás kezdődhet a mohón választottal. Legyen E’={i | v1ki i=2..n} ésM’ egy optimális megoldása az E’-vel jellemzett redukált problémának, ekkor{1}M’ megoldás is és optimális is. így folytatható is. Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” Mindez nem túl nagy ár (matematika) a hatékonyságért? A hatékonyságot vizsgáljuk meg: • egy „naiv” megoldás • egy backtrack megoldás, és • egy mohó esetében. Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A „naiv” változat („elmélet”): A megvizsgálandó esetek száma: Egy i eseményből álló kompatibilitá-sának vizsgálatához szükséges hasonlítások száma: i2-nel arányos. Összesen: Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A „naiv” változat („elmélet”): A megvizsgálandó esetek száma: Egy i eseményből álló kompatibilitá-sának vizsgálatához szükséges hasonlítások száma: i2-nel arányos. Összesen: (Pl. n=9-re 6912 és 20736 közötti!) 2005. április Mohó algoritmusok 14/70
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A backtrack-es változat (kódja): Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A backtrack-es változat (kódja): Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A backtrack-es változat (kódja): Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A backtrack-es változat („empirikusan”): Próbáljuk ki és következtessünk! Zip, exe. Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A mohó változat (kódja): Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A mohó változat (kódja): Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A mohó változat („empirikusan”): Próbáljuk ki és következtessünk! Zip, exe. Kimond-hatjuk: megéri!!! Mohó algoritmusok
Egy gondolatébresztő példa – a mohó algoritmusok „szókincse” A mohó megoldás sablonja: • Lépésekre bontjuk az eljárásunkat. • Keresünk egy adott lépésnél eldönthető, lokálisan optimális kritériumot (mohó választás). • belátjuk a mohóság működését: • van-e optimális megoldás, ami mohó választással kezdődik? • a mohó választást hozzávéve a redukált probléma optimális megoldásához, az eredeti probléma megoldását kapjuk? • Algoritmizáljuk a mohó megoldást. „mohó választási tulajdonság” „optimális részproblémák tulajdonság” Mohó algoritmusok
Első példázat a „zenekar”-ról A feladat: „Egy népszerű zenekar a következő 100 napra vonatkozó fellépéseit tervezi. Sok meghívása van fellépésre, ezek közül kell a zenekarnak válasz-tani, hogy melyeket fogadja el. Minden fellépés pontosan egy napot foglal el. Minden beérkezett meghívási igény egy (k, v) számpárral adott, ami azt jelenti, hogy az igénylő azt szeretné, hogy a zenekar olyan n sorszámú napon tartson nála koncertet, hogy knv. A zenekarnak az a célja, hogy a lehető legtöbb fellépést elvállaljon (termé-szetesen egy napon csak egyet). Készítsünk programot, amely kiszámítja, hogy mely meghívásokat fogadjunk el, hogy az összes fellépések száma a lehető legnagyobb legyen; a program adjon is meg egy beosztást!” Mohó algoritmusok
Első példázat a „zenekar”-ról A megoldás: • Lépésekre bontás – a fellépési ajánlatok közül egy (alkalmas) választása • Mohó választás – kettős probléma: • ajánlat-intervallum, • intervallumbeli nap; stratégia: a leghamarabb lezáruló, legkorábbi napja… miért? L. példákat. Mohó algoritmusok
Első példázat a „zenekar”-ról A megoldás (folytatás): Belátás: Nap={1,…,NapDb} – a választható napok sor-számai Fl={1,…,FlDb} – a fellépések sorszámai ki,vi iFl – az i. fellépés kezdő, ill. végső nap-sorszáma NF={(n1,f1),…,(nDb,fDb)}, ninj, fifj(ij), ni[kfi,vfi], fiFl i,j=1..Db – a megoldás NF optimális megoldás 2005. április Mohó algoritmusok 27/70
Első példázat a „zenekar”-ról Def. (fellépések rendezése) f,f’Fl, f<ff’ (f „kisebb/előbbi”, mint f’), acsa • vf<vf’ (előbb ér véget) vagy • vf=vf’ és kf<kf’ (ha ugyanakkor végződik, akkor előbb kezdődik) Def. (mohó választás) SzNap „szabad” napok és Fl’ fellépések mellett (n*,f*) mohó választás, ha • f*=Min<f {fFl’ | [kf..vf]Sz} – a „legko-rábbi” fellépés, amely még elvállalható • n*=Min {nSz | n[kf*..vf*]Sz} – a „legko-rábbi” fellépés legkorábbi napján Mohó algoritmusok
Első példázat a „zenekar”-ról Z1. Állítás (mohó választási tulajdonság): Ha NF optimális megoldás és (n*,f*) mohó választás, akkor NF* = {(n*,f*),(n2,f2),..,(nDb,fDb)} is op-timális megoldás. Bizonyítás: NF opt.mo. és (n*,f*) mohó választás, de (_,f*)NF (ni,fi): ni=n*(különben ellentmondásra jutnánk NF optimalitásával) Helyettesítsük NF-ben (ni,fi)-t (n*,f*)-gal: NF’={(n1,f1),…,(ni-1,fi-1),(n*,f*),(ni+1,fi+1),…,(nDb,fDb)} NF’ megoldás is és optimális is Sorszámozzuk újra az NF’-t f-szerinti sorrendben: NF*={(n*,f*),(n2,f2),..,(nDb,fDb)} NF*megoldás; NF optimális és ║NF║=║NF*║ NF*optimális. … kicsit hosszadalmasabban a (_,f*)NF –re is… Mohó algoritmusok
Első példázat a „zenekar”-ról Z2. Állítás (optimális részproblémák tulaj-donság): Ha • SzNap „szabad” napok, • (n*,f*) mohó választás Sz mellett és • NF* optimális megoldás Sz\{n*}-ra, akkor (n*,f*)NF* optimális megoldása az Sz-nek. Bizonyítás: megoldás? NF* (optimális) megoldás Sz\{n*}-ra (ni,fi)NF* : n*ni (n*,f*)NF*megoldása lesz az Sz-nek. Mohó algoritmusok
Első példázat a „zenekar”-ról (Bizonyítás folytatás): optimális? (indirekt) L. Db=║NF*║ Tfh.NF’ = {(n’1,f’1),..,(n’L,f’L)} optimális meg-oldás Sz-re, amelyre L>Db+1. A Z1. állításból következik, hogy NF” = {(n*,f*),(n’2,f’2),..,(n’L,f’L)} is optimális megol-dás. Világos, hogy az NF”-ből az (n*,f*)-t elhagyva egy megoldását kapjuk az Sz\{n*}-nak, ami jobb, mint az NF*, hiszen több (L–1>Db) elemet tartalmaz. Ez ellentmond az állítás 3. feltételének. Mohó algoritmusok
Első példázat a „zenekar”-ról A megvalósítás: • ábrázolás Const MaxFellepes=255; {max. fellépésszám; Ef: <256} NapDb=MaxFellepes; {max. napszám, ami most nem is változik} Type TKeresett=Record igaz:Boolean; nap:Byte End; {lin.kereséshez}TFellepes=Record db:Byte; mely:Array [0..MaxFellepes] ofRecord k,v,s:Byte; end; {fellépés: kezdet/vég/sorsz.}End;TNapok=Setof Byte; {nap: melyik fellépés} TBeoszt=Array [1..MaxFellepes] of Byte; {beosztott fellépés indexek} Var{Globális}Fel:TFellepes; {fellépések}M:Byte; {beosztott fellépések száma} Beoszt:TBeoszt; {beosztott fellépések sorszáma}FoglNapok:TNapok; Mohó algoritmusok
Első példázat a „zenekar”-ról A megvalósítás: • a lényegi rész algoritmusa Procedure FellepestUtemez;Var i:Byte; OK:TKeresett;Begin{FellepestUtemez} Rendezes(Fel); FoglNapok:=[Fel[1].k]; M:=1; Beoszt[1]:=Fel[1].s;For i:=2 to Fel.db doBegin OK:=VallalhatoE(i); If OK.igaz thenBegin FoglNapok:=FoglNapok+[OK.nap]; Inc(M); Beoszt[M]:=Fel[i].s;End{If};End{For i}End;{FellepestUtemez} Function VallahatóE(Const i:Byte): TKeresett;Var j:Word; k:TKeresett;Begin j:=Fel[i].k;While (j<=Fel[i].v) and (j in FoglNap) do Inc(j); k.igaz:=j<=Fel[i].v;If k.igaz then k.nap:=j; VallalhatoE:=kEnd;{VallalhatoE} Mohó algoritmusok
Első példázat a „zenekar”-ról A feladat egy variációja • A feladatot módosítsuk úgy, hogy minden fellépés járjon valamennyi (hi) haszonnal. Természetesen ekkor a célfeladat úgy mó-dosul, hogy a lehető legtöbb haszonra kell törekedni. • Ez az apró módosítás mennyiben érinti a megoldást? Az sejthető, hogy az eddigi törek-vés: minél több fellépést kell elvállalni, nem feltétlenül hozza a legtöbb hasznot. Mohó algoritmusok
[ ] [ ] [ ] [ ] [ ] Első példázat a „zenekar”-ról Egy ellen(?)példa: Az adatok: Mohó algoritmusok
[ ] [ ] [ ] [ ] [ ] Első példázat a „zenekar”-ról Mohón rendezve: S így megoldva: A haszon: 1+2+3+4=10 … a „leghasznosabb” kimaradt!!! Mohó algoritmusok
[ ] [ ] [ ] [ ] [ ] Első példázat a „zenekar”-ról Pedig, ha a 2 helyett az 5-öt tennénk, a haszon: 1+2+3–4+5=11 lenne, sőt, ha az 1 helyett ten-nénk az 5-öt, a haszon: 1+2+3–3+5=12 lenne. Mohó algoritmusok
[ ] [ ] [ ] [ ] [ ] Első példázat a „zenekar”-ról Legyen a mohóság szem-pontja a haszon! Rendez-zük így! S így megoldva: Az előbbiek után becsült optimumot elértük! Igaz más módon. De tényleg optimum? Mohó algoritmusok
[ ] [ ] [ ] [ ] [ ] Első példázat a „zenekar”-ról Sajnos nem!!! Lásd az alábbi javítást: A javítás értéke: 5+4+3+2=14 Nem találtunk eddig jó mohó szempontot! Mohó algoritmusok
Első példázat a „zenekar”-ról Jegyezzük föl az ütközés-számot! Haszonsorrend + napkiválasztás: a legkevésbé ütköző nap… Íme a végrehajtás menete: Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről A feladat: „Egy rendezvényre N vendéget hívtak meg. Minden vendég előre jelezte, hogy mettől meddig lesz jelen. A szervezők fényképeken akarják megörökíteni a rendez-vényen résztvevőket. Azt tervezik, hogy kiválasztanak néhány időpontot és minden kiválasztott időpontban az akkor éppen jelenlevőkről csoportképet készítenek. Az a céljuk, hogy a lehető legkevesebb képet kelljen készíteni, de mindenki rajta legyen legalább egy ké-pen. Írjunk programot, amely kiszámítja, hogy legkevesebb hány fényképet kell készíteni, és megadja azokat az időpontokat is amikor csoportképet kell készíteni!” Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről A megoldás: • Lépésekre bontás – a vendégekközül egy (al-kalmas) választása • Mohó választás – a legkorábban távozó ven-dég, aki a legutóbbi fényképezés óta érkezett • Belátás: • V = {v1,…,vvDb}, ahol vi = (tóli,igi) (i=1..vDb) – a vendégek ott tartózkodása • FT = {ft1,…,ftftDb}, ahol fti<fti+1 (i=1..ftDb-1) – a megoldás • FT optimális megoldás Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről Def. (vendégek rendezése) vi,vjV, viig vj („kisebb/előbbi”), acsa vi.igvj.ig (azaz előbb indul haza) Def. (mohó választás) W V még le nem fényképezettek és ft utolsó fényképezés mellett ft*mohó választás, haft*=v.ig, amelyre v:=Minig {v W | v.tól>ft} – az ft után érkezők közül a „legkorábban” távozó távozási ideje Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről F1. Állítás (mohó választási tulajdonság): Ha FT = {ft1,ft2,…,ftftDb} optimális megoldás és ft*mohó választás, akkor FT* = {ft*,ft2,...,ftftDb} is optimális megoldás. Bizonyítás: Ha ft1ft*, akkor ft*-ig nincs távozás ft1 helyett ft* is jó Így FT megoldás volt FT*megoldás volta FT optimalitása FT*optimalitása. Az ft1>ft* nem lehetséges, mivel ekkor az első vendégről nem készülhetett fotó (ft*=v1.ig<ft1)FT nem lehet megoldás, ami ellentmon-dás. Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről Jelölés:FTW={ft1,…,ftk}, W-ben szereplő ven-dégekre optimális megoldás. F2. Állítás (optimális részproblémák tulaj-donság): Ha • ft* mohó választás és • FTW = {ft2,...,ftftDb} optimális megoldás aW={vi | vi.tól>ft*} esetén, akkor FTV = {ft*,ft2,..,ftftDb} optimális megoldás (azaz a teljes V esetén optimális megoldás). Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről Bizonyítás: FTVmegoldás? • FTW megoldás W-re minden vendégről, aki ft* után érkezett (ft*<vi.tól), készült fénykép • ft* értelmezése ft*-ig érkezetteket ft*-kor fényképezték le 1. & 2. FTVmegoldás Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről (Bizonyítás folytatása) FTVoptimális? (indirekt) Tfh FTV nem optimális megoldás, azaz FT”={ft”1,ft”2,..,ft”k} optimális…, amelyre k<ftDb. F1 FT*=(ft*,ft”2,...,ft”k) is optimális … Hagyjuk el, akik ft*-kor jelen voltak. Ezek alkotják éppen W-t. Mivel FT* megoldás során mindenkiről ké-szült fénykép, és ft*-kor a W-beliekről nem készülhetett, ezért róluk csak a későbbi időpontokban készülhetett. (ft”2,...,ft”k) megoldás W mellett, vagyis jobb az optimális FTW-nél. Ez ellentmondás. Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről A megvalósítás: • ábrázolás Const MaxN=3000; {az intervallumok max. száma}MaxT=1000; {a megoldás időpontok max. száma} Var{Globális}vDb :Word; {az intervallumok száma} Mettol:Array [1..MaxT] of Word; {az intervallumok: [Mettol[i],i), ha Mettol[i]>0}ftDB:Word; {a megoldás időpontok száma} FT:Array [1..MaxN] of Word; {a megoldás időpontok halmaza} A távozás előtt készüljön a fénykép! Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről A megvalósítás: • a lényegi rész algoritmusa Procedure FotoUtemezes; {Globális Input: MaxT, Mettol Globális Output: ftDB, FT}Var i,t:Integer; Utolso:Integer; Begin{FotoUtemezes} Utolso:=0;{az utolsó beválasztott pont} ftDB:=0; {a beválasztott pontok száma}For t:=1 to MaxT DoBeginIf (Mettol[t]>0)and(Utolso<Mettol[t]) ThenBegin Utolso:=t; Inc(ftDB); FT[ftDB]:=Utolso;End;End{for t};End{FotoUtemezes}; van távozó az utolsó fényképezés után jött Mohó algoritmusok
Második példázat a „fényké-peszkedés”-ről • a beolvasás algoritmusa Procedure Beolvas; {Globális Output: vDb, Mettol}Var Bef:Text; i,tol,ig:Word; Begin{Beolvas}For i:=1 to MaxT do Mettol[i]:=0; Assign(Bef,'fenykep.be'); Reset(Bef); ReadLn(Bef,vDb);For i:=1 to vDb doBegin ReadLn(Bef,tol,ig);If tol>Mettol[ig] then Mettol[ig]:=tol;End; Close(Bef);End{Beolvas}; Hatékonyság Hely – nem függ vDb-től; Idő – vDb-től lineárisan (nem négyzetesen, mint a rendezés) Mohó algoritmusok
Harmadik példázat a „ültetés”-ről A feladat: „Egy rendezvényt olyan teremben tartanak, ahol M db ülőhely van. Az ülőhelyek 1-től M-ig sorszámozottak. A rendezvény szervezője megrendeléseket fogad. Minden megrendelés egy (A,B) számpárt tartalmaz, ami azt je-lenti, hogy a megrendelő olyan ülőhelyet szeretne kap-ni, amelynek S sorszáma A és B közé esik (ASB). Írjunk programot, amely kiszámítja, hogy a szervező a megrendelések alapján a legjobb esetben hány meg-rendelést tud kielégíteni és meg is ad egy olyan jegyki-osztást, amely kielégíti a megrendeléseket!” Mohó algoritmusok
Harmadik példázat a „ültetés”-ről A megoldás: Észrevétel: nagyban emlékeztet az első fela-dat megoldására. Itt is, ott is egy interval-lumhalmazból kell minél többet kiválasztani úgy, hogy a belőlük kiválasztott „pont” más intervallumból vettel ne essen egybe. Ezért az elemzéstől most eltekinthetünk. Mohó algoritmusok
Harmadik példázat a „ültetés”-ről A megvalósítás: • adatleírás ConstMaxN=1000; {a megrendelések max. száma}MaxM=10000; {az ülőhelyek max. száma} TypeTMegrendelesek=Array [1..MaxN] ofRecord k,v:Word End; {a szék intervallumok kezdő- és vég-időpontjai} Var{Globális}szekDb:Word; {az ülőhelyek száma}mrDb:Word; {a megrendelések száma} Mr:TMegrendelesek; {a megrendelések}Hany:Integer; {kielégíthető megrendelők száma} Mo:Array [1..MaxM] of 0..MaxN; {a megoldás: az i-edik széket a Mo[i]-számú megrendelő kapja, ha ez nem 0} Mohó algoritmusok