Korlátozás és szétválasztás elve ADAGOLO adattípus Értékhalmaz: E Adagolo : A E Műveletek: A : Adagolo, x : E {Igaz} Letesit(A) {A = /0} {A = A} Megszuntet(A) {Igaz} {A = A} Uresit(A) {A = /0} {A = A} Betesz(A,x) {A = Pre(A) {x}} {A /0} Kivesz(A,x) {x Pre(A) Pre(A) = A {x}} {A = A} Elemszam(A) {Elemszam = A } Közös általánosítása a sornak, veremnek és prioritási sornak. Teszőleges kivételi szabállyal lehet egy speciális adattípust kapni belőle. Korlátozó függvény Egy általános algoritmust adunk meg, ami egy minimalizálási problémán működik, ahol z a célfüggvény. Az algoritmus használ egy AK korlátozó függvényt, amelyre a következő tulajdonság teljesül. Minden X pontjára a megoldástért leíró fának fennáll, hogy AK(X) z(y ) az összes Y megoldásra, amely leszármazottja X-nek a fában. Az AK függvény azért hasznos, mert amennyiben már van egy megoldásunk, aminek a célfüggvényértéke OP- TERT, akkor azokat a részfákat,a melyek X gyökerére AK(X) OPT ERT nem kell bejárnunk, mert biztosan nem tartalmaznak jobb megoldást. KorlatValaszt(F) OPT:=Nil OPTERT:=Inf Letesit(A:Adagolo) If F=Nil Then return //Üres fa If Megoldas(F) Then If z(f)<optert Then OPTERT:=z(F), OPT:=F Betesz(A,F) While(Elemszam(A)!=0) Kivesz(A,F) p:=f.elsofiu While (p!=nil) // a gyerekeken sorbamenve If Megoldas(p) Then If z(p)<optert //ha jobbat talál Then OPTERT:=z(p), OPT:=p If (LehetMego(p) and AK(p)<OPTERT) Then Betesz(A,p) //ha nem zár ki p:=p.testver Return(OPT) 1
A feladatspecifikus algoritmushoz a következő részletek megadása szükséges megoldástér és az azt leíró fa korlátozó függvény (hatékonyan számítható, de elég éles) az adagoló kivételi szabályának megadása Az algoritmus gyorsítása A korlátozó függvény hatékonysága attól is függ mennyire jó az aktuálisan ismert legjobb megoldásunk az OPT változóban. Így az algoritmus gyorsítása érdekében szokás az egész eljárást egy heurisztikus algoritmussal kezdeni, és az általa kapott lehetséges megoldást elhelyezni az OPT változóban. Bizonyos alkalmazásokban előfordulhat, hogy az alsó korlát számítása során egyéb (a vizsgált ponttól különböző) lehetséges megoldást is meghatározunk. Ilyenkor szokás, ezeket a megoldásokat is felhasználni az aktuálisan ismert legjobb megoldás javítására. Szétválasztási függvény A korlátozás és szétválasztás módszerét gyakran egy korlátozó függvény és egy szétválasztó függvény által definiálják. A szétválasztó függvény a megoldástér részhalmazain definiált. Minden részhalmazhoz az adott halmaz egy partícióját rendeli hozzá. A szétválasztási függvény a megoldástér fa reprezentációjának felel meg. A szétválasztási függvényből a következőképpen kapjuk meg a megoldástért leíró fát. A részhalmazok a fa részfáinak felelnek meg, egy adott részhalmaz felbontása a neki megfelelő részfa további részfákra bontását jelenti. Optimális pénzváltás Az optimális pénzváltási problémában adottak p 1,..., p n pénzérmék és egy E összeg, a feladat kiválasztani az érmék egy minimális elemszámú S halmazát, amelyre teljesül, hogy i S p i = E. A megoldástér pontjait (a pénzek részhalmazát) a pénzek indexeinek az S {1,...,n} halmazának X = (i 1,...,i k ) növekvő felsorolásáként reprezentáljuk. Ekkor a bejáráshoz használt függvények Apa(i 1,...,i k 1,i k ) = (i 1,...,i k 1 ), ha k 1 és Nil egyébként. A LehetMego, Megoldás és AK függvényeket a következőképpen kaphatjuk meg. A LehetMego függvény megadja, ha az eddig meghozott döntéseket nem lehet kiegészíteni egy felbontássá, vagy azért mert már nagyobb összeget választottunk, vagy azért mert minden további elemet kiválasztva sem érhetjük el E-t. Tehát LehetMego(i 1,...,i k ) = True akkor és csak akkor, ha k p i j E k p i j + n p j E. j=i k +1 Továbbá Megoldas(i 1,...,i k ) = True akkor és csak akkor, ha k p i j = E Az AK függvény meghatározásához feltesszük, hogy a pénzérmék érték szerint nemnövekvő sorrendbe vannnak rendezve. Ekkor 2
k AK(i 1,...,i k ) = k + (S p i j )/p ik +1. Példa A váltópénzek 5, 4, 4, 2, 1 a felváltandó összeg 8. Az ADAGOLO egy felső korlát szerinti minimumos prioritási sor. A két db 4 forintost megkülönböztetjük, az egyiket, amelyiket a sorban előre vesszünk 4 jelöli. Az ADAGOLO-ba az (5), (4 ) megoldáskezdemények kerülnek be. Ekkor OPT ERT (legjobb ismert megoldás) értéke végtelen. Az ADAGOLO-ban a függvényértékek AK((5)) = 1 + (8 5)/4 = 2, FK((5)) = 1 + (8 5)/1 = 4 AK((4 )) = 1 + (8 4)/4 = 2, FK((4 )) = 1 + (8 4)/1 = 5. Az FK szerinti minimumos sor az (5) kezdeményt adja ki. Az ADAGOLO-ba az (5,2) megoldáskezdemény kerül be. Erre AK((5,2)) = 2+ (8 7)/1 = 3, FK((5,2)) = 1 + (8 7)/1 = 3. Az FK szerinti minimumos sor az (5,2) kezdeményt adja ki. Az ADAGOLO-ba egyetlen megoldáskezdemény kerül be az (5,2,1), erre AK(5,2,1) = FK(5,2,1) = 3, és találtunk egy megoldást. Az aktuális optimális megoldás (5,2,1) a hozzá tartozó GFK érték 3. Az FK szerinti minimumos sor az (5,2,1) kezdeményt adja ki, nem kerül új elem az ADAGOLO-ba. Az FK szerinti minimumos sor a (4 ) kezdeményt adja ki. Az ADAGOLO-ba egyetlen megoldáskezdemény kerül be (4 4), találunk egy megoldást a (4,4) megoldást. Ezt megjegyezzük, és GFK = 2. Az FK szerinti minimumos sor az (4,4) kezdeményt adja ki, nem kerül új elem az ADAGOLO-ba. Az ADAGOLO üres, az eljárás véget ér. Maximum feladatok Ha maximum feladatunk van, akkor lehet a célfüggvény -1-szeresét vizsgálni, de megadható az algoritmus maximum feladatra is. A különbség, hogy egy FK felső korlátot kell számolni a pontokra, és azok az ágak zárhatóak le, ahol a felső korlát kisebb, mint OPTERT. KorlatValaszt(F) OPT:=Nil OPTERT:=-Inf Letesit(A:Adagolo) If F=Nil Then return //Üres fa If Megoldas(F) Then If z(f)>optert Then OPTERT:=z(F), OPT:=F Betesz(A,F) While(Elemszam(A)!=0) Kivesz(A,F) p:=f.elsofiu 3
While (p!=nil) // a gyerekeken sorbamenve If Megoldas(p) Then If z(p)>optert //ha jobbat talál Then OPTERT:=z(p), OPT:=p If (LehetMego(p) and FK(p)>OPTERT) Then Betesz(A,p) //ha nem zár ki p:=p.testver Return(OPT) Profit maximalizáló ütemezés A feladatban munkákat kell ütemezni, minden munkának van egy határideje, egy végrehajtási ideje és egy profitja. A cél a lehető legtöbb összprofitot elérő munkát elvégezni a határidők betartásával. Lemma: Ha egy munkahalmaznak van határidőt tartó ütemezése, akkor az az ütemezés is tartja a határidőt, amely a munkákat növekvő határidő szerint hajtja végre. Bizonyítás Vegyük a halmaznak azt a határidő tartó megoldást, amelynek a leghosszabb kezdőszelete határidő szerint növekvő. Ha nem a teljes halmaz határidő szerinti, akkor az első eltérésnél hozzuk előre azt a j munkát, amelynek a legkorábbi a határideje. Az így kapott sorrend is határidőt tartó, mivel a hátrább kerülő munkák legkésőbb j eredeti befejezési idejében fejeződnek be, ami kisebb, mint j határideje, így kisebb az adott munka határidejénél is. Következésképpen feltehetjük, hogy a kiválasztott munkahalmazt mindig növekvő határidő szerint ütemezzük, és feltesszük azt is, hogy eleve ilyen sorrendben lettek megadva. Ekkor a megoldástérben csak a munkák részhalmazait kell vizsgálni. Így a megoldástér pontjait a munkák indexeinek olyan S {1,...,n} halmazának X = (i 1,...,i k ) növekvő felsorolásáként reprezentáljuk. A bejáráshoz használt függvények Apa(i 1,...,i k 1,i k ) = (i 1,...,i k 1 ), ha k 1 és Nil egyébként. A LehetMego függvény megadja, hogy az eddig kiválasztott munkák határidő szerinti sorrendben tartják- e a határidőket. Azaz LehetMego(i 1,...,i k ) akkor és csak akkor igaz, ha j = 1,...,k esetén j r=1 i r.vegreha jtido i j.hatarido. Az FK korlátozó függvényhez feltesszük, hogy minden még nem eldöntött munkát ütemezünk, így FK(i 1,...,i k ) = ( k r=1 i r.pro f it + n r=i k +1 i r.pro f it). Hátizsák feladat Egy adott hátizsákba tárgyakat akarunk pakolni. Adott n tárgy minden tárgynak van egy fontossági értéke ( f [i]), és egy súlya (s[i]), a hátizsákba maximum összesen S súlyt pakolhatunk. Szeretnénk úgy választani tárgyakat, hogy az összfontosság maximális legyen. Tehát feladatunk, hogy kiválasszuk a tárgyaknak olyan halmazai közül, amelyekre az összsúly nem haladja meg S-t azt, amelyre maximális az összfontosság. A megoldás itt is az elemek egy részhalmaza, így a megoldástér pontjait (a tárgyak részhalmazát) a tárgyak indexeinek az S {1,...,n} halmazának X = (i 1,...,i k ) növekvő felsorolásáként reprezentálhatjuk. Ekkor a bejáráshoz használt függvények 4
Apa(i 1,...,i k 1,i k ) = (i 1,...,i k 1 ), ha k 1 és Nil egyébként. Korlátozó függvény A megoldástér egy adott X = (i 1,...,i k ) pontjában az adott részfában az 1,...,i k tárgyakra már meghoztuk a döntést. Az eddig elért haszon k f i j a felhasznált súly a kapacitásból k s i j, így a hátralevő (i k +1,...,n) tárgyakhoz S k s i j kapacitás marad. Következésképpen ahhoz, hogy a részfában az optimális megoldást megtaláljuk meg kell oldanunk egy kisebb hátizsák feladatot. A hátizsák feladat megoldása helyett egy relaxált változatot oldunk meg a töredékes hátizsák feladatot, amelyben a tárgyaknak részeit is be lehet rakni a hátizsákba, ez nyilvánvalóan felső korlátot ad az eredeti feladat optimális célfüggvényértékére. Másrészt ez a korlátozó függvény hatékonyan számítható, mivel a mohó algoritmus (ami haszon/súly érték alapján veszi be a tárgyakat) optimális megoldást ad rá. Érdemes megjegyezni, hogy ez a függvény speciális esete annak a gyakran használt módszernek, ahol egy egészértékű programozási feladat helyett, azt a lineáris programozási feladatot használjuk korlátnak, ahol nem kötjük ki, hogy a változók egészek. Példa Vegyük a hátizsák problémát, ahol tárgyak (súly, fontosság) párokban A = (4,6) B = (3,5) C = (2,3) D = (2,3) a hátizsák kapacitása 8. Adagolóként felső korlát szerinti maximum prioritási sort használunk. Az ADAGOLO-ba az (A), (B) megoldáskezdemények, akik egyben megoldások kerülnek be. Ekkor a OPT ERT (legjobb ismert megoldás) 6. Amikor a (C) és (D) megoldáskezdeményeket vizsgáltuk OPT ERT FK(C) és OPT ERT FK(D) állt fenn, így nem kerültek be. Az ADAGOLO-ban a korlátozó függvények FK((A)) = 6 + 5 + 3/2 = 25/2, FK((B)) = 5 + 3 + 3 = 11. Az FK szerinti maximumos sor az (A) kezdeményt adja ki. Az (A,B) megoldás, így OPT ERT = 6 + 5 = 11. Az aktuális optimális megoldást felülírjuk. Bekerül az ADAGOLO-ba. A korlát FK((A,B)) = 6 + 5 + 3/2 = 25/2. Az (A,C) megoldás, és FK(A,C) = 6+3+3 OPT ERT, így bekerül az ADAGOLO-ba. A korlátok FK((A,C)) = 12. Az FK szerinti maximumos sor az (A,B) kezdeményt adja ki. A fiúkra (A,B,C) és (A,B,D) nem LEHETMEGO, így nem kerülnek be az ADAGOLO-ba. Az FK szerinti maximumos sor az (A,C) kezdeményt adja ki. A fia (A,C,D) megoldás, így OPT ERT = 6+3+3 = 12. Az aktuális optimális megoldást felülírjuk, a megoldás bekerül az ADAGOLO-ba. Az FK szerinti maximumos sor az (A,C,D) majd a (B) kezdeményeket adja ki, mindkettőre az FK érték nem nagyobb, mint OPT ERT. Az ADAGOLO üres, az eljárás véget ér. 5