Dinamikus programozás - Szerelőszalag ütemezése A dinamikus programozás minden egyes részfeladatot és annak minden részfeladatát pontosan egyszer oldja meg, az eredményt egy táblázatban tárolja, és ezáltal elkerüli az ismételt számítást, ha a részfeladat megint felmerül. A dinamikus programozást optimalizálási feladatok megoldására használjuk. Ilyen feladatoknak sok megengedett megoldása lehet. Egy dinamikus programozási algoritmus kifejlesztése lépésre bontható fel:. Jellemezzük az optimális megoldás szerkezetét.. Rekurzív módon definiáljuk az optimális megoldás értékét.. Kiszámítjuk az optimális megoldás értékét alulról felfelé történő módon.. A kiszámított információk alapján megszerkesztünk egy optimális megoldást. A -. lépések jelentik az alapját annak, ahogy a dinamikus programozás meg tud oldani egy feladatot. Egy autógyár autókat állít elő az egyik gyárában, amelynek két szerelőszalagja van. Mindkét szerelőszalag elején egy alváz jelenik meg, melyhez adott számú állomáson hozzászerelik az alkatrészeket, majd a szalag végén távozik a kész autó. Mindegyik szalagnak n állomása van, melyek indexei j=,,, n. S ij jelöli az i-edik (i= vagy ) szalag j-edik állomását. Az első szalag j-edik állomása (S j ) ugyanazt a funkciót látja el, mint a második szalag j-edik állomása (S j ). A szalagokat különböző időpontokban különböző technológiával építették, ezért előfordulhat, hogy a két szalag azonos állomásán a terméknek különböző időt kell eltöltenie. Az S ij állomáson a műveleti időt a ij jelöli.. szerelőszalag S állomás a S állomás a S,n- állomás a,n- S n állomás a n e t t,n- x az alváz belép t t,n- a kész autó kilép e x. szerelőszalag a a a,n- a n S állomás S állomás S,n- állomás S n állomás Ahhoz is kell egy bizonyos idő, hogy az alváz a szalagra kerüljön, és ahhoz is, hogy az elkészült autó elhagyja a szalagot. Ezeket az i-edik szalag esetén e i, illetve x i jelöli. Ha szeretnénk a megrendeléseket minél gyorsabban teljesíteni, a két szalag munkáját össze kell hangolni. Az i-edik szalag S ij állomása után az alváznak a másik szalagra való átrakása t ij időbe kerül j=,,, n- (mivel n állomás után a kocsi már kész). A feladat az, hogy meghatározzuk, mely állomásokat érintse az egyik és melyeket a másik szalagon, hogy az átfutási idő minimális legyen.
Példa a szerelőszalag feladatára. Feltüntettük a különböző költségeket. A vastagon rajzolt út a legrövidebb.. szerelőszalag S állomás S állomás S állomás S állomás S 5 állomás 7 9 8 az alváz belép a kész autó kilép. szerelőszalag 8 5 6 7 S állomás S állomás S állomás S állomás S 5 állomás A teljes leszámlálás számítási ideje Ω( n ). Ez nagy n mellett elfogadhatatlan.. lépés: a legrövidebb gyártási út szerkezete Tekintsük a lehetséges legrövidebb utat, ahogy egy alváz a kiindulási helyzetből túljut az S j állomáson. Ha j=, akkor csak egy lehetőség van, és így könnyű meghatározni a szükséges időt. j=,,,n esetén két lehetőség van: az alváz érkezhet közvetlenül az S,j- állomásról, amikor ugyanannak a szalagnak a (j-)-edik állomásáról a j-edik állomására való átszállítás ideje elhanyagolható. Az alváz S,j- felől érkezik, az átszállítás ideje t,j-. Tegyük fel, hogy az S j állomáson való túljutás leggyorsabb módja az, hogy oda az S,j- felől érkezünk. Az alváznak a legrövidebb módon kell túljutnia az S,j- állomáson, mert ha volna egy gyorsabb mód, hogy az alváz túljusson a S,j- állomáson, akkor ezt használva magán S,j - n is hamarabb jutna túl, ami ellentmondás. Hasonlóképpen tegyük fel, hogy a leggyorsabb út az, amikor az alváz S,j- felől érkezik. Ekkor a kiindulási ponttól indulva a legrövidebb módon kell túljutnia S,j- -en. Ha volna egy gyorsabb mód, hogy az alváz túljusson az állomáson, akkor ezt használva magán S,j- -n is hamarabb jutna túl, ami ismét ellentmondás. Általánosabban fogalmazva azt mondhatjuk, hogy a szerelőszalag ütemezésének (hogy megtaláljuk a legrövidebb módot az S ij állomáson való túljutásra) optimális megoldása tartalmazza egy részfeladat (vagy az S,j- vagy az S,j- állomáson való leggyorsabb áthaladás) optimális megoldását. Erre a tulajdonságra optimális részstruktúraként fogunk hivatkozni. Azaz részfeladatok optimális megoldásaiból megszerkeszthető a feladat optimális megoldása. Ha a leggyorsabb módon túljutunk az S j állomáson, akkor túl kell jutnunk a (j-)-edik állomáson vagy az első vagy a második szalagon. Ezért a leggyorsabb út az S j állomáson keresztül vagy
a leggyorsabb út az S,j- állomáson keresztül és onnan közvetlenül megyünk az S j állomásra, vagy a leggyorsabb út az S,j- állomáson keresztül, ahonnan az alvázat át kell szállítani az első szalag S j állomására. Mindkét esetben el kell végezni a munkát az S j állomáson. Hasonlóképpen a leggyorsabb út az S j állomáson keresztül vagy a leggyorsabb út az S,j- állomáson keresztül és onnan közvetlenül megyünk az S j állomásra, vagy a leggyorsabb út az S,j- állomáson keresztül, ahonnan az alvázat át kell szállítani a második szalag S j állomására. Ahhoz, hogy bármelyik szalag j-edik állomásán keresztülvezető legrövidebb utat megtaláljuk, mindkét szalag (j-)-edik állomásán keresztüli legrövidebb út megkeresésére van szükség.. lépés: a rekurzív megoldás Az optimális megoldás értékét a részfeladatok optimális értékeiből rekurzívan fejezzük ki. A részfeladatok legyenek mindkét szalag j-edik állomásán való leggyorsabb áthaladás megkeresésének a feladatai j=,,, n mellett. Jelölje f i [j] azt a legrövidebb időt, ami alatt az alváz túl tud jutni az S ij állomáson. Célunk annak a legrövidebb időnek a meghatározása, ami alatt az alváz az egész üzemen keresztül tud haladni. Ezt az időt f* jelöli. Az alváznak át kell haladnia az első vagy a második szalag n-edik állomásán, és utána el kell hagynia a gyárat. Mivel a két lehetőség közül a gyorsabbik az egész üzemen átvezető leggyorsabb lehetőség, azt kapjuk, hogy f* = min{ f [n] +x, f [n] +x } Mindkét szalag esetében az első állomáson való keresztülhaladás azt jelenti, hogy az alváz egyenesen erre az állomásra kerül, azaz f [] = e +a f [] = e +a Hogyan kell kiszámolni az f i [j]-t j=,,,n és i=, esetén? ha j=,,,n. Ehhez hasonlóan ha j=,,,n. A következő rekurzív egyenletet kapjuk: f [j] = min{f [j-]+a j, f [j-]+ t,j- +a j }, f [j] = min{ f [j-]+a j, f [j-]+ t,j- +a j }, f [j] = e +a, ha j=, min{ f [j-]+a j, f [j-]+ t,j- +a j }, ha j
f [j] = e +a, ha j=, min{ f [j-]+a j, f [j-]+ t,j- +a j }, ha j Példánkban: f*= j 5 f [j] 9 8 0 8 f [j] 6 6 Az f i [j] mennyiségek a részfeladatok optimális érékei. Annak érdekében, hogy vissza tudjuk keresni a legrövidebb utat, definiáljuk l i [j]-t mint azt a szerelőszalagot, amelyiknek a j--edik állomását használtuk az S ij -n való leggyorsabb keresztülhaladáskor. Itt i=, és j=,,,n. (Nem definiáljuk l i []-et, mert S i -t egyik szalagon sem előzi meg másik állomás.) Az l* szalag definíció szerint az, amelyiknek az utolsó állomását használjuk az egész üzemen való áthaladáskor. Az l i [j] értékek segítségével lehet nyomon követni a legrövidebb utat. Példánkban: l* = j 5 l [j] l [j] Mivel l* =, ezért az S 5 állomást használjuk. Mivel l [5]=, ezért ide az S állomásról érkeztünk. Így folytatva az l []=az S, l []= az S, l []= az S állomás használatát jelenti.. lépés: a legrövidebb átfutási idő kiszámítása Sokkal jobban járunk, ha az f i [j] értékeket más sorrend szerint számoljuk, mint az a rekurzív módszerből adódik. Vegyük észre, hogy j esetén f i [j] csak f [j-] -től és f [j-] -től függ. Ha az f i [j] értékeket az állomások j indexének növekvő sorrendjében számoljuk, akkor a legrövidebb átfutási idő meghatározása Θ(n) ideig tart. Az eljárás bemenő paraméterei az a ij, t ij, e i és x i értékek, valamint mindkét szalag állomásainak n száma.
ALGORITMUS(a,t,e,x,n). f [] := e +a. f [] := e +a. for j:= to n. do if f [j-]+a j =< f [j-]+ t,j- +a j 5. then f [j]:= f [j-]+a j 6. l [j]:= 7. else f [j]:= f [j-]+ t,j- +a j 8. l [j]:= 9. if f [j-]+a j =< f [j-]+ t,j- +a j 0. then f [j]:= f [j-]+a j. l [j]:=. else f [j]:= f [j-]+ t,j- +a j. l [j]:=. if f [n] +x =< f [n] +x 5. then f*=f [n] +x 6. l*= 7. else f*=f [n] +x 8. l*= f i [j] és l i [j] kiszámítását úgy is tekinthetjük, hogy kitöltjük egy táblázat elemeit. Az f i [j]-t és l i [j]-t tartalmazó táblát balról jobbra és oszloponként felülről lefelé töltjük ki. f i [j] kiszámításához csak f [j-]-re és f [j-]-re van szükségünk. Ezeket már kiszámítottuk, az adott pillanatban a meghatározásuk mindössze abból áll, hogy kiolvassuk azokat a táblázatból.. lépés: a legrövidebb átfutási idejű út megszerkesztése f i [j], f*, l i [j] és l* kiszámítását követően meg kell szerkeszteni az üzemen való legrövidebb áthaladást biztosító utat. Az alábbi eljárás az út állomásait az indexek csökkenő sorrendjében nyomtatja ki. ALGORITMUS(l,n). i:= l*. print i -edik szalag n -edik állomás. for j:= n downto. do i:= l i [j] 5. print i -edik szalag ( j- )-edik állomás Eredmény a példánkban:. szalag 5. állomás. szalag. állomás. szalag. állomás. szalag. állomás. szalag. állomás 5