1 Ütemezési feladatok Az ütemezési feladatok vizsgálata az 50-es évek elején kezdődött, majd tekintettel a feladat gyakorlati fontosságára sok különböző modell tanulmányozására került sor, és a témakör nagyon gyors és nagy fejlődésen ment át. A modellek nagy számára jellemző, hogy 1977-ben A. H. G. Rinnooy Kan egy konferencia szekciójának összefoglalójában 9000-re becsülte a katalogizálható különböző determinisztikus ütemezési problémák számát. Azóta ez a szám még számottevően növekedett. Tekintettel a témakör nagyságára és bonyolultságára a jelen fejezetben csak vázoljuk az ütemezési problémákat és csak néhány egyszerű modellt vizsgálunk részletesebben. Ütemezési modellek Az ütemezési problémákban adottak bizonyos páronként különböző gépek és m számú munka, amelyeket az 1,..., m számokkal fogunk sorszámozni. A feladat az, hogy ütemezzük az egyes munkák végrehajtását a gépeken, úgy, hogy valamely cél szerint optimális ütemezést kapjunk. A munkák végrehajtásának ütemezésén vagy egyszerűbben a munkák ütemezésén azt értjük, hogy a j-edik munkát hozzárendeljük valamely géphez egy S j kezdési és C j befejezési idővel minden j-re. A munkákhoz minden modellben tartozik egy végrehajtási idő, amit p j -vel szokás jelölni. Ez azt adja meg, hogy mennyi ideig tart a munkát elvégezni. Ennek megfelelően a munkához rendelt kezdési és befejezési időkre a C j S j = p j feltételnek kell teljesülni. A különböző modelleket többféle szempontból is osztályozhatjuk. A továbbiakban a legismertebb változatokat igyekszünk összegyűjteni. A munkák meghatározó paraméterei Mint már említettük minden munkához tartozik egy végrehajtási idő, de más modellekben egyéb paraméterei is vannak az egyes munkáknak. A munkákhoz rendelhető érkezési idő is, ezt a paramétert a j-edik munkára általában r j jelöli. Ez az idő azt az időpontot adja meg, amelytől kezdve a munka végrehajtása elkezdhető, tehát a munkára az S j r j feltételnek kell teljesülni. A j-edik munkához tartozhat egy d j határidő. Itt két különböző típusú modellt vizsgálhatunk. Az első esetben csak olyan ütemezéseket fogadunk el, amelyekre C j d j, azaz amelyek betartják a határidőt, a
2 másodikban megszeghetjük a határidőt, de ekkor a célfüggvényben a határidő is szerepel. A j-edik munkához hozzárendelhetünk egy w j súlyt vagy egy f j (t) súlyfüggvényt, amely azt adja meg mennyire fontos a munka, illetve azt, hogy mennyire fontos a munka t időpontra történő befejezése. Egy másik fontos osztályozási szempont az, hogy mi az a függvény, aminek az optimumát keressük. Eszerint a szempont szerint is igen sok lehetséges modell került bevezetésre, a továbbiakban a legfontosabbakat vázoljuk. A célfüggvények két alapvető osztályra bonthatók: a maximum célfüggvényekre és az összeg célfüggvényekre. Talán a legismertebb modellek azok, amelyekben az utolsónak befejezett munka befejezési idejét akarjuk minimalizálni, azaz ahol a célfüggvény min{max{c j : 1 j m}}, amelyet a lehetséges ütemezésekre minimalizálunk. Szintén gyakran használt célfüggvény a befejezési idők összegfüggvénye. Általánosabb esetben, mikor a munkáknak van súlya vagy súlyfüggvénye, akkor a m j=1 w j C j illetve m j=1 f j (C j ) függvényeket minimalizáljuk. Amennyiben a munkákhoz határidő is tartozik, akkor a célfüggvény általában a késések minimalizálása. Itt két értéket szokás vizsgálni. Az első a késési idő (lateness), amely az L j = C j d j érték, a másik pedig a csúszási idő (tardiness), amely az T j = max{0, L j } érték. A két maximum célfüggvény a késési időknek illetve a csúszási időknek a maximuma. Egyéb modellekben ezen értékek összegét illetve súlyozott összegét igyekszünk minimalizálni. Itt érdemes azt a modellt említenünk, ahol a cél az elkésett (T j > 0) munkák számának minimalizálása. Amennyiben érkezési idők is vannak szokás a befejezési idő helyett a folyási időt (flow time) vizsgálni, amely az F j = C j r j érték. Ezekben a modellekben a célfüggvény ezen F j értékek maximuma vagy súlyozott összege. A fenti alapvető osztályozáson kivüli egyéb változatokat, általánosításokat kaphatunk néhány extra feltétellel. Az alábbiakban ezekből gyűjtöttünk össze néhányat.
3 Feltehetjük, hogy bizonyos munkákat csak más munkák után lehet elvégezni. Igen sok gyakorlati problémánál előfordulnak ilyen feltételek. Ekkor az egyes munkákhoz tartozik az a feltétel is, hogy mely munkák előzetes végrehajtását követelik meg. Ezen extra feltételek mellett az összes, a fentiekben említett modell vizsgálható. Megemlítjük, hogy ilyen extra feltétellel kezelhető a tekintett példában, hogy a fiúk egy adott sorrendben olvassák az újságokat. Az eddigiek során végig azzal a feltétellel éltünk, hogy minden egyes munkához pontosan egy végrehajtási idő tartozik és ez független attól, hogy melyik gépen kerül a munka végrehajtásra. Ez általában gyakorlati problémáknál nem így van. Egy általánosabb modellben minden munkához egy végrehajtási vektor tartozik, amely i-edik komponense megadja, hogy az M i gépen mennyi ideig tart a munkát végrehajtani. Itt érdemes két speciálisabb esetre kitérni. Az egyik esetben a j-edik munka végrehajtási vektorának i-edik komponense p j /v i, ahol v i az M i gép sebességének felel meg. A második esetben a korlátozott hozzárendelési esetben a végrehajtási vektor néhány komponense végtelen a többi megegyezik, ez azt jelenti, hogy a gépek azonosak csak a munka néhány gépen nem hajtható végre. Egy másik általánosítás, amelyben megengedjük, hogy a munkák végrehajtása megszakítható legyen. Ekkor a j-edik munkához nem egy darab legalább p j hosszú intervallumot kell hozzárendelnünk valamely gépen, hanem több, egymást nem átfedő intervallumot (akár különböző gépeken), amelyek összhossza legalább p j. Heurisztikus algoritmusok az alapproblémára Ebben a részben az egyik legegyszerűbb változatot vizsgáljuk. A modellben n darab azonos M 1,..., M n gépünk van, a J 1,..., J m munkákhoz pedig csak egyetlen paraméter tartozik, a p j, j = 1,..., m végrehajtási idők. Cél egy olyan ütemezés megkonstruálása, amelyre a befejezési idők maximuma minimális. A probléma egy gép esetén triviális bármely olyan ütemezésre, amelyben a gép folyamatosan dolgozik, (nem várunk a munkák elvégzése közben) a max{c j : 1 j m} érték megegyezik a végrehajtási idők összegével. Továbbá az is nyilvánvaló, hogy amennyiben minden munkát elvégzünk, akkor nem fejezhetjük be a munkákat ezen időpont előtt. Ha a gépek száma több, mint 1, akkor a feladat lényegesen nehezebb. Igazolást nyert,
4 hogy n 2 esetén a probléma NP-nehéz. Másrészt ebben az esetben egy lehetséges ütemezést meghatározhatunk azáltal, hogy az egyes munkákat mely gépekhez rendeljük hozzá. Amennyiben minden gépre megkapjuk, hogy mi a géphez rendelt munkáknak a halmaza, akkor minden egyes gépre, az ott levő munkákat optimálisan úgy ütemezhetjük, hogy a a gép folyamatosan dolgozzon, és minden ilyen ütemezésre ugyanannyi lesz a gépen a maximális befejezési idő, a munkáknak a végrehajtási idejeinek az összege. Ezt az értéket a gép töltésének nevezzük. A fogalmat használjuk általánosabb értelemben is, gépek egy halmazának a töltésén a gépekhez rendelt munkák végrehajtási idejeinek az összegének és a gépek számának a hányadosát értjük. Mivel a feladat NP-nehéz ezért erre a feladatosztályra is fontos heurisztikus algoritmusok kidolgozása. Az alábbiakban két egyszerű heurisztikus algoritmussal ismerkedünk meg. Az első R. L. Graham-től származó algoritmus, amelyet Lista algoritmusnak nevezünk a következőképpen működik. Lista algoritmus Előkészítő rész. A J 1 munkát rendeljük az M 1 géphez, továbbá legyen r := 1. Iterációs rész (r-edik iteráció). Ha r = m, akkor vége az eljárásnak. Ellenkező esetben a J r+1 munkát rendeljük ahhoz a géphez, amely gépen minimális a töltés. Ha több ilyen gép is van válasszuk a legkisebb indexűt. Az algoritmus az optimálishoz közeli eredményt eredményez, amint azt az alábbi tétel mutatja. 11.1 tétel. A lista algoritmus approximációs hányadosa 2 1/n, ahol n a gépek száma. Bizonyítás. Elsőként igazoljuk, hogy az algoritmus 2 1/n-approximációs. Legyen σ = {J 1,..., J m } tetszőleges munkasorozat rendre p 1,..., p m végrehajtási időkkel. Tekintsük a lista algoritmus által kapott ütemezést. Legyen J l az a munka, amely legkésőbb fejeződik be. Vizsgáljuk ezen munka S l kezdési idejét. Mivel egyetlen gép sem kezdte el a munkát ütemezni S l előtt, ezért minden gép szünet nélkül dolgozott az S l időpontig. Ebből azt kapjuk, hogy
5 Következésképp S l 1 n m p j = 1 m n ( p j p l ) = 1 n ( m p j ) 1 n p l. j=1 j=1 j=1 j l Lista(σ) = S l + p l 1 n ( m j=1 p j ) + n 1 n p l. Másrészt az optimális ütemezésben is végre kell hajtani az összes munkát, így OP T (σ) 1 n ( m j=1 p j ). Továbbá a p l munkát is végre kell hajtani valamely gépen, így OP T (σ) p l. Ezen becslések alapján egyből adódik, hogy Lista(σ) (1 + n 1 )OP T (σ), n amivel bizonyítottuk, hogy az algoritmus 2 1/n-approximációs. Most igazoljuk, hogy a tekintett korlát éles. Vegyünk n(n 1) darab munkát 1/n végrehajtási idővel, majd egy munkát 1 végrehajtási idővel. Ekkor a lista algoritmus az első n(n 1) munkát egyenletesen elosztja a gépek között, majd az utolsó munkát az M 1 gépen ütemezi. Tehát a maximális befejezési idő 1+(n 1)/n lesz. Egy optimális ütemezés pedig a rövid munkákat egyenletesen osztja szét az első n 1 gép között, majd az utolsó munkát az n-edik géphez rendeli, és a maximális befejezési ideje 1 lesz. Tehát ebben az esetben az algoritmus által kapott megoldás és az optimális megoldás célfüggvényértékeinek hányadosa 2 1/n, amivel igazoltuk az állításunkat. Amint azt láthattuk a korlát élességének igazolásánál, a lista algoritmus legnagyobb hibája akkor jön elő, amikor sok rövid munka után egy hosszú munkát kell végrehajtani. Ezt a problémát jobban kezeli a következő szintén R. L. Graham-től származó eljárás. LPT Algoritmus 1. lépés. Rendezzük sorba a munkákat csökkenő végrehajtási idő szerint. 2. lépés. A munkák kapott listáján hajtsuk végre a lista algoritmust.
6 Az első rendezési fázis valóban javítja az eljárás hatékonyságát, amint azt a következő állítás mutatja. 11.2. tétel. Az LPT algoritmus approximációs hányadosa 4/3 1/(3n). Shop ütemezés Shop ütemezésről beszélünk abban az esetben, ha a gépeken minden végrehajtandó munka több műveletből áll. Minden egyes művelet egy, a művelethez rendelt gépen hajtható végre, és adott a művelet végrehajtási ideje. Ezen osztályon belül két fő csoportot különböztetünk meg. Amennyiben bármely munkára a hozzátartozó műveletek tetszőleges sorrendben végrehajthatók, akkor open shop ütemezésről beszélünk. Ezt a modellt itt nem tárgyaljuk. A másik esetben ismét megkülönböztetünk két modellt. Ha a munkák műveleteihez tartozó gépek sorrendje nem azonos akkor job shop ütemezésről beszélünk. (A fiúk újságolvasási problémája így egy job shop ütemezési feladat.) Ha a gépek sorrendje azonos minden munkára, akkor flow shop ütemezésről szokásos beszélni. A továbbiakban ezt a problémaosztályt vizsgáljuk. Speciálisabban olyan problémákat tekintünk, amelyekben a gépek száma n és minden J i munka n számú műveletből, az O i1,..., O in műveletekből áll, amelyek közül a k-adik műveletetet a k-adik gépen kell végrehajtanunk. Észrevehetjük, hogy a fenti flow shop ütemezési példa esetén a gépeken a munkák végrehajtása nem azonos sorrendben történik. Amennyiben még az azonos sorrendet is kikötjük, akkor permutációs flow shop problémáról beszélünk. Amint az elnevezés is mutatja ebben az esetben a munkáknak kell azt a sorrendjét meghatározni, amely sorrendre az ütemezés optimális. A probléma általában még ennyi kikötés mellett is NP-nehéz marad, de ebben az esetben két gépre már ismert hatékony eljárás. A továbbiakban bemutatjuk ezt az eljárást és igazoljuk annak helyességét. Jelölje a gépeket M 1 és M 2 a munkákat pedig rendre J 1,..., J m. A J i i = 1,..., m munka két műveletből áll, először az O i1 műveletet kell az M 1 gépen végrehajtani, ami τ i1 ideig tart, majd az O i2 műveletet az M 2 gépen ami τ i2 ideig tart. Johnson algoritmusa 1. lépés. Legyen k := 1 és l := m, és tekintsük a nem ütemezett munkák J = {J 1,..., J m } halmazát.
7 2. lépés. Keressük meg a {τ i1, τ i2 J i J} halmaz egy minimális elemét. Jelölje a hozzátartozó indexet i. Ha i nem egyértelműen meghatározott, akkor a lehetséges indexek közül válasszuk a legkisebbet. 3. lépés. Ha a 2. lépésben választott elem τ i1 akkor helyezzük a J i munkát a listánk k-adik helyére, töröljük a J halmazból, és növeljük k értékét 1-gyel. Majd lépjünk az 5. lépésre. 4. lépés. Ha a 2. lépésben választott elem τ i2 akkor helyezzük a J i munkát a listánk l-adik helyére, töröljük a J halmazból, és csökkentsük l értékét 1-gyel. Majd lépjünk az 5. lépésre. 5. lépés. Amennyiben J üres, akkor vége az eljárásnak. Az optimális ütemezést kapjuk meg, ha az eljárás során meghatározott lista sorrendje szerint hajtjuk végre a munkákat késlekedés nélkül. Ellenkező esetben lépjünk a 2. lépésre. Az eljárás helyessége egyből következik a következő tételből. 11.3. tétel. Ha egy permutációs flow shop probléma egy késleltetést nem tartalmazó S ütemezésében egy J i munkára és az ütemezésben utána közvetlenül következő J l munkára min{τ i1, τ i2, τ l1, τ l2 } = min{τ l1, τ i2 } teljesül, akkor arra az S ütemezésre, amelyet úgy kapunk S -ből, hogy felcseréljük az J i és J l munkákat a maximális befejezési idő legfeljebb akkora lesz, mint az S ütemezésben. A fenti eljárást fejlesztette tovább J. R. Jackson egy speciális job shop ütemezési modell megoldására. A továbbiakban olyan job shop ütemezési problémát tekintünk, amelyben két gép van M 1 és M 2, minden munka legfeljebb két műveletből áll, és amennyiben egy munka két műveletből áll akkor azt a két műveletet különböző gépeken kell végrehajtani, amelyek hozzá vannak rendelve a műveletekhez. Ezt a feladatot oldja meg a következő eljárás.
8 Jackson algoritmus 1. lépés. Képezzük a következő halmazokat: K 12 = { azon két műveletből álló munkák, amelyek műveleteiből az elsőt az M 1 a másodikat az M 2 gépen kell végrehajtani }, K 21 = { azon két műveletből álló munkák, amelyek műveleteiből az elsőt az M 2 a másodikat az M 1 gépen kell végrehajtani }, K 1 = { azon munkák, amelyek egy, az M 1 -en végrehajtandó műveletből állnak }, K 2 = { azon munkák, amelyek egy, az M 2 -en végrehajtandó műveletből állnak }. 2. lépés. Rendezzük a K 12 és a K 21 halmazokat a Johnson eljárás szerint. 3. lépés. Rendezzük a K 12 K 1 K 21 halmaz elemeit úgy, hogy K 1 -ben tetszőleges legyen a rendezés, és K 12 legnagyobb eleme kisebb legyen mint K 1 legkisebb eleme, továbbá K 1 legnagyobb eleme kisebb legyen, mint K 21 legkisebb eleme. Jelölje ezt a rendezést (K 1, ). 4. lépés. Rendezzük a K 21 K 2 K 12 halmaz elemeit úgy, hogy K 2 -ben tetszőleges legyen a rendezés, és K 21 legnagyobb eleme kisebb legyen mint K 2 legkisebb eleme, továbbá K 2 legnagyobb eleme kisebb legyen, mint K 12 legkisebb eleme. Jelölje ezt a rendezést (K 2, ). 5. lépés. Az M 1 gépen ütemezzük a munkákat (K 1, ) szerint, az M 2 -n pedig (K 2, ) szerint. 11.4. tétel Az algoritmus valóban egy optimális megoldását adja meg a job shop problémának két gép esetén.