Poglavje 11 LINDO - optimizacija stroškov
Transcription
Poglavje 11 LINDO - optimizacija stroškov
Poglavje 11 LINDO - optimizacija stroškov Linearno in celoštevilsko programiranje Optimizacijski model Primer: optimizacija stroškov izbire transporta 238 LINDO - optimizacija stroškov 11.1 Teoretiˇcno ozadje 11.1.1 Linearno programiranje Linearno programiranje (v nadaljevanju LP) je podroˇcje matematike, ki se ukvarja s problemom optimizacije z omejitvami. Predstavlja specifiˇcen razred optimizacijskih problemov, kjer maksimiziramo (minimiziramo) linearno funkcijo, pri cˇ emer upoštevamo linearne omejitve. Pobudnik razvoja linearnega programiranja (1930) je Leonid Kantorovic, z metodo reševanja problema planiranja proizvodnje. Za zaˇcetnika linearnega programiranja velja George B. Dantzig, ki je leta 1947 razvil metodo simpleksov, pomembno vlogo pa ima tudi John von Neumann, ki je istega leta postavil temelje teorije dualnosti [73]. V Združenih državah Amerike se je linearno programiranje razvilo med drugo svetovno vojno z namenom, da reši zapletene probleme naˇcrtovanja logistike vojaških operacijah. Doprinos k razvoju linearnega programiranja prištevamo ekonomistu Tjalling Koopmansu (rojen na Nizozemskem leta 1940, pozneje preseljen v Združene države Amerike). Matematik Kantorovic in ekonomist Koopmans sta leta 1975 dobila Nobelovo nagrado za ekonomijo za prispevke k teoriji optimalne izrabe sredstev, kjer je linearno programiranje igralo glavno vlogo. Veliko industrijskih podjetij uporablja linearno programiranje kot standardno orodje (npr. za optimalno razporejanje konˇcnih sredstev). Gre torej za zelo pogosto uporabljeno metodo pri reševanju optimizacijskih problemov z omejitvami. V samem postopku loˇcimo tri pomembne korake, in sicer [93]: • formulacija problema (postavitev problema v pravilni obliki); • rešitev (izraˇcun optimalnih možnosti); • senzitivnostna analiza (kaj bi se zgodilo, cˇ e bi se pogoji našega zastavljenega problema malo spremenili). Linearno programiranje je metoda za iskanje optimalne namenske funkcije, ko so omejitve (in namenska funkcija) dane v obliki sistema linearnih neenaˇcb. Rešitev takšnega sistema je mogoˇce dobiti v grafiˇcni obliki, le v primeru, ko imamo zgolj dve odloˇcitveni spremenljivki, sicer pa je potreben raˇcunski postopek. Splošna raˇcunska metoda za reševanje linearnega programiranja je metoda simpleksov, ki jo je leta 1984 razvil matematik George B. Dantzig. 11.2 O programskem orodju 11.1.2 239 Metoda simpleksov Metoda simpleksov je standardna tehnika pri reševanju linearnega programiranja, kjer nastopajo tri ali celo veˇc odloˇcitvenih spremenljivk. Z grafiˇcno metodo ugotovimo le lastnosti problemov linearnega programiranja, ki so osnova za vse analitiˇcne metode: množica možnih rešitev M je konveksna; optimalna rešitev je v eni ali veˇc ekstremnih toˇckah množice M; konveksni polieder M ima konˇcno mnogo ekstremnih toˇck; ekstremne toˇcke M predstavljajo baziˇcne možne rešitve; v rešitvi je najveˇc M pozitivnih komponent; ni potrebno pregledati vseh ekstremnih toˇck, da bi prišli do optimalne rešitve. Da bi lahko rešili probleme LP z veˇc kot tremi spremenljivkami potrebujemo algebraiˇcno interpretacijo postopka iskanja optimalne rešitve. Vse v praksi uporabljane metode so iterativne: zaˇcnemo z neko možno bazno rešitvijo, ki jo postopoma izboljšujemo. Teoretiˇcno možno, a neracionalno bi bilo enostavno poiskati vse možne bazne rešitve ter med njimi izbrati ekstremno vrednost, kar bi pomenilo izraˇcun sistemov m enaˇcb z n neznankami. Linearni program je zapisan v naslednjem modelu: Linearni program Opt z = c1x1+c2x2+...cnxn a11x1+a12x2+...c1nxn >= b1 a12x1+a22x2+...c2nxn >= b2 ........................... am1x1+am2x2+...c1mnxn >= bm x1>=0; x2>=.............xn>=0 Podrobnejša razlaga reševanja programa na podlagi simpleksov sledi v nadaljevanju. 11.2 O programskem orodju Zaradi velikega števila numeriˇcnih operacij konkretne probleme rešujemo z uporabo raˇcunalniškega programa, namenjenega reševanju linearnega programa, delujoˇcega na osnovi simpleksnega algoritma. Lindo je programsko orodje za uˇcinkovito gradnjo in reševanje linearnega programiranja. Je odprtokodno programsko orodje, ki ga enostavno prenesemo iz spleta. Uporabnikom tovrstnih programskih orodij je zagotovo poznano programsko orodje Lingo, ki ga prav tako uporabljamo za reševanje linearnih problemov, 240 LINDO - optimizacija stroškov Slika 11.1: Prenos programa Linda – 1. del vendar ni prosto dostopen, je pa eden izmed najbolj znanih in svetovno razširjenih programov za reševanje problemov linearnega programiranja. Oba programa sta nastala pod okriljem organizacije Lindo Systems. Prenos in namestitev Program Lindo prenesemo s spletnega mesta Lindo [27], kjer iz zgornjega modrega menija izberemo Downloads (glej Sliko 11.1). Ob kliku na dano možnost se pojavi možnost namestitve štirih razliˇcnih verzij - izbiramo med plaˇcljivimi in brezplaˇcnimi. Na dnu seznama se nahaja možnost prenosa klasiˇcnega programa Lindo (Download Classic LINDO), katero izberemo (glej Sliko 11.2). Programsko okno Ob zagonu programa Lindo se odpre osnovno okno (Slika 11.3), ki je sestavljeno iz naslovne vrstice (1), menijske vrstice (2), orodne vrstice (3) in ”okenca” za 11.2 O programskem orodju Slika 11.2: Prenos programa Linda – 2. del 241 242 LINDO - optimizacija stroškov Slika 11.3: Osnovno okno ob zagonu zapis funkcije (4). Menijska vrstica vsebuje 6 razliˇcnih menijev. Meni Datoteka (File) omogoˇca odpiranje novega delovnega lista (New), odpiranje že shranjenega dokumenta na doloˇcenem mestu (Open), zapiranje dokumenta (Close) ipd. Ob koncu menijev se izpišejo možnosti odpiranja predhodnih dokumentov, ne da bi jih bilo potrebno poiskati na že shranjenih mestih. Meni Urejanje (Edit) omogoˇca rezanje (Cut), kopiranje (Copy) in lepljenje (Paste) doloˇcenega besedila oz. modela. Meni Options omogoˇca spreminjanje nastavitev za celoštevilsko programiranje (Integer Programming), splošne nastavitve (General) in izhodne nastavitve (Output) (glej Sliko 11.4). Sledi meni Reševanje (Solve), katerega uporabimo, ko imamo model že zapisan. S klikom na meni se izpišejo rezultati (glej Sliko 11.5). Meni Poroˇcilo (Reports) uporabljamo, ko je model že izdelan. Meni Okno (Windws) omogoˇca ogled in odpiranje posameznih oken. V meniju Pomoˇc (Help) izbiramo med možnostmi izbire pomoˇci (Search for Help On. . . , How to Use Help) in posodabljanjem programa (AutoUpdate) (glej Sliko 11.6). V orodni vrstici se nahajajo bližnjice, potrebne za nadaljnje delo. Prikazana so osnovna orodja za odpiranje novega oz. že shranjenega dokumenta, možnost ponovnega shranjevanja in tiskanja (glej Sliki 11.7 in 11.8). 11.2 O programskem orodju Slika 11.4: Menija Datoteka in Urejanje Slika 11.5: Meni Solve 243 244 LINDO - optimizacija stroškov Slika 11.6: Meni Window in Help Slika 11.7: Bližnjice (pomen) 11.3 Uporaba 245 Slika 11.8: Orodna vrstica Problem V podjetju OpenStorage, potrebujemo, glede na potrebe proizvodnje 15.410 platišˇc, ki jih mora dobavitelj dostaviti v cˇ asu 5 dni. Prvotno je doloˇceno, da se platišˇca dostavljajo zgolj s tovornjakom, vendar preizkusimo tudi možnost dostavljanja z vlakom. Z eno vožnjo bi po železnici (z vlakom) pripeljali maksimalno 800 kosov platišˇc, po cesti (s tovornjakom) pa 390 kosov, pri cˇ emer upoštevamo doloˇcene omejitve. ˇ Cas, ki ga porabimo za eno vožnjo z vlakom, od dobavitelja v tujini do ˇ našega namišljenega podjetja, znaša 6 ur. Cas, ki ga porabimo za vožnjo s tovornjakom po cesti znaša 3 ure, pri cˇ emer transport ne sme trajati veˇc kot 120 ur (torej manj ali enako 5 dni). Enkratni stroški, ki nastanejo pri prevozu z vlakom znašajo 7.200 e, stroški transporta s tovornjakom pa 1.800 e. Omejitve, ki jih je upoštevamo pri danem problemu so naslednje: vrednosti za spremenljivki železnica in cesta morata biti pozitivni in celi števili. 11.3 Uporaba Zapis linearnega modela Izraˇcun transportnega modela z analitiˇcnim izraˇcunom bi bil dolgotrajen, hkrati pa bi se pojavilo veˇcje število možnosti prikaza napak, zato se raje ”poslužimo” izraˇcuna s programskim orodjem. V primeru, da imamo model že zapisan, ga 246 LINDO - optimizacija stroškov Slika 11.9: Primer napaˇcno zapisanega modela enostavno vnesemo v programsko orodje Lindo. Zapišemo dani transportni model. Linearni program Min Z = 7200x1+1800x2 ------------- namenska funkcija 800x1+390x2>=15.410 6x1+3x2<=120 x1>=0 x2>=0 x1,x2 element celega števila - pogoji in omejitve ˇ smo že programirali s pomoˇcjo programskega orodja Lingo je situacija Ce povsem podobna, le z doloˇcenimi manjšimi popravki, kar prikažemo na konkretnem izmišljenem problemu. Programsko orodje Lingo natanˇcno opozori in usmeri na napake, ki so pri modeliranju nastale. Lindo pa sporoˇci zgolj napako brez podrobnejšega opisa. Prednost programskega orodja Lindo je v tem, da model zapišemo skoraj povsem podobno, kakor na list papirja. Ob zapisu namenske funkcije dodamo ukaz SUBJECT TO in na koncu zapisa END, kar pomeni konec. GIN X1 in GIN X2 sta ukaza s pomoˇcjo katerih program izraˇcuna celoštevilsko vrednost spremenljivk. Veˇc o ukazih razložimo proti koncu priroˇcnika. V ”okence” zapišemo dani linearni problem z vsemi pogoji in omejitvami. Pojavi se napaka. Okvirˇcek, ki pove za kakšno napako gre, zgolj opisuje v katerem polju se nahaja doloˇcena napaka. Nahaja se v zapisu namenske funkcije, pa tudi v zapisu pogojev in omejitev (glej Sliko 11.9). 11.3 Uporaba 247 Slika 11.10: Shranjevanje datoteke Ob ponovnem preverjanju in preizkušanju modela ugotovimo, da je ena izmed napak zapis vrednosti = za MIN, kar v programu Lindo ni dovoljeno. Prav tako ni dovoljeno dodajanje * (znak za množenje) med vrednostjo in izbrano spremenljivko. Ko popravimo napake, program ustrezno shranimo. Linearni program MIN 7200X1 + 1800X2 SUBJECT TO 800X1 + 390X2 >= 15410 6X1+3X2<=120 X1>=0 X2>=0 END GIN X1 GIN X2 Zapisan model shranimo na želeno mesto na disku. V meniju File Name se izpiše kratica pred katero zapišemo ime datoteke (Linearni problem). Shranimo jo na poljubno mesto, v formatu LINDO Text (.ltx) (glej Sliko 11.10). Že shranjeno datoteko odpremo tako, da v meniju File - Open, izberemo disk, kjer je datoteka shranjena (Drives). Nato iz seznama glede na ime datoteke (File name) izberemo datoteko (glej Sliko 11.11). Po zapisu programa potrebujemo še rešitve problema. Ob pravilnem zapisu modela v orodni vrstici izberemo možnost Solve. V naslednjem okencu se izpišejo rezultati. 248 LINDO - optimizacija stroškov Slika 11.11: Odpiranje datoteke Izpis rezultatov LP OPTIMUM FOUND AT STEP 1 OBJECTIVE VALUE = 71123.0781 NEW INTEGER SOLUTION OF 72000.0000 AT BRANCH BOUND ON OPTIMUM: 72000.00 ENUMERATION COMPLETE. BRANCHES= 0 PIVOTS= 3 LAST INTEGER SOLUTION IS THE BEST FOUND RE-INSTALLING BEST SOLUTION... OBJECTIVE FUNCTION VALUE 1) VARIABLE X1 X2 ROW 2) 3) 4) 5) 72000.00 VALUE 0.000000 40.000000 SLACK OR SURPLUS 190.000000 0.000000 0.000000 40.000000 NO. ITERATIONS= 3 BRANCHES= 0 DETERM.= 1.000E REDUCED COST 7200.000000 1800.000000 DUAL PRICES 0.000000 0.000000 0.000000 0.000000 0 0 PIVOT 3 11.3 Uporaba 249 Prikazani rezultati povedo naslednje: • Linearni problem programiranja je poiskan v prvem koraku (LP OPTIMUMFOUND AT STEP 1). Zapisane so še druge vrednosti navezujoˇce na dani problem. LP OPTIMUM FOUND AT STEP 1 OBJECTIVE VALUE = 71123.0781 NEW INTEGER SOLUTION OF 72000.0000 AT BRANCH BOUND ON OPTIMUM: 72000.00 ENUMERATION COMPLETE. BRANCHES= 0 PIVOTS= 3 0 PIVOT 3 LAST INTEGER SOLUTION IS THE BEST FOUND RE-INSTALLING BEST SOLUTION... • Vrednost zapisana pod številko 1) 72.000,00 pove, da je minimalni strošek transporta 15.410 kosov platišˇc 72.000,00 e. Z linearnim programiranjem izraˇcunamo, da platišˇc ne bomo transportirali z vlakom (0x), paˇc pa s tovornjakom, in sicer 40x (Value) ob danih pogojih. Spremenljivka X1 torej pomeni transport z vlakom in spremenljivka X2 transport s tovornjakom. Reduced Cost prikazuje stroške posameznega transporta. OBJECTIVE FUNCTION VALUE 1) VARIABLE X1 X2 72000.00 VALUE 0.000000 40.000000 REDUCED COST 7200.000000 1800.000000 250 LINDO - optimizacija stroškov • Dopolnilna spremenljivka Slack or Surplus v rešitvi pove, za koliko bi še bilo potrebno levo stran v omejitvenih neenaˇcbah prvotnega linearnega programa poveˇcati ali zmanjšati, da bi namesto neenaˇcb dobili enaˇcbe. To koliˇcino v primerih neenakosti ”manj ali enako” imenujemo pomanjkanje ˇ (Slack), v neenaˇcbah oblike ”veˇc ali enako” pa presežek (Surplus). Ce je omejitev v linearnem programu podana z enaˇcbo, sta presežek ali pomanjkanje vedno po vrednosti enaka niˇc. Za neenaˇcbo 800x1 + 390x2 >= 15.410 lahko reˇcemo, da ni potrebno dodajanje enot, da dobimo enaˇcbo. Podobno lahko razložimo tudi za ostale vrednosti. • Dualno ceno (Dual Price) razumemo kot tisto vrednost, za katero bi se spremenila namenska funkcija, cˇ e bi se omejitev v konkretni (ne)enaˇcbi poveˇcala za eno enoto. Namesto termina Dual Price uporabljamo tudi pojem senˇcna cena (Shadow Price), ker ta podatek pove, koliko bi bili pripravljeni plaˇcati za poveˇcanje omejitve za eno dodatno enoto. Senˇcna cena je vedno nenegativna (pozitivna ali niˇc) za omejitve tipa ”manjše ali enako” in vedno nepozitivna (negativna ali niˇc) za neenaˇcbe oblike ˇ so omejitve dane v obliki enaˇcb, je senˇcna cena lahko ”veˇcje ali enako”. Ce negativna, pozitivna ali enaka niˇc. V našem primeru so vrednosti dualnih cen enake 0. ROW SLACK OR SURPLUS DUAL PRICES 2) 190.000000 0.000000 3) 0.000000 0.000000 4) 0.000000 0.000000 5) 40.000000 0.000000 NO. ITERATIONS= 3 BRANCHES= 0 DETERM.= 1.000E 0 Kot dodatek je zapisan model v programu Lingo, ki prikazuje le nekaj razlik med zapisom v Lindu. 11.3 Uporaba 251 Zapis linearnega programa v Lindu Zmin=7200* x1+1800*x2; 800*x1+390*x2 >= 15410; 6*x1+3*x2<=120; x1>=0; x2>=0; @gin(x1); @gin(x2); Ob preuˇcevanju literature ugotovimo, da za program Lindo ni popolnega priroˇcnika v eni datoteki. Na spletu je dostopen priroˇcnik za program Lingo in program Lindo Api s katerima si lahko pomagamo. Uporabniku programa predlagamo ogled slednjih spletnih strani povezave, ki so v pomoˇc pri uporabi programskega orodja: Lindo - splet 1 [29], Lindo splet 2 [28], Lindo - splet 3 [40]. Navedene spletne strani omogoˇcajo odpiranje številnih datotek, kjer so opisani posamezni postopki uporabe programa, zapisi modelov ipd. (glej Sliko 11.12). 252 LINDO - optimizacija stroškov Slika 11.12: Spletna stran za prenos datotek, ki so v pomoˇc pri uporabi programa Lindo 11.3 Uporaba 253 Povzetek Programsko orodje Lindo je prosto dostopno orodje za reševanje problemov linearnega programiranja, izdelano pri organizaciji Lindo Systems. Njihova programska orodja uporabljajo številna podjetja po vsem svetu; za poveˇcanje dobiˇcka in zmanjšanje stroškov, za odloˇcitve, ki vkljuˇcujejo naˇcrtovanje proizvodnje, prevoza, financ, portfolio dodeljevanja kapitala proraˇcuna, mešanje, naˇcrtovanje, inventar, dodeljevanje sredstev in veˇc. Predhodno pripravljen model omogoˇca enostaven zapis in pregled rešitve v Lindo. Še posebej je primeren za študente, ki se z dano problematiko sreˇcujejo pri študiju ali v praksi. Ni zahteven, vendar za pravilno delovanje potrebuje predhodno znanje iz podroˇcij optimizacije in linearnega programiranja. Z izbranim programskim orodjem predstavimo problematiko izbire transporta 15.410 platišˇc, ki jih je potrebno dostaviti v cˇ asu 5 dni. Izdelamo model, ki prikazuje, katero prevozno sredstvo, ob izbranih omejitvah, povzroˇca nižje stroške transporta. Z izdelanim modelom dokažemo, da je v cˇ asu maksimalno 120h prevoz možno opraviti s tovornjakom (40x vožnja), s skupnimi stroški v znesku 72.000 e. Ugotovimo, da vožnja z vlakom povzroˇca bistveno veˇcje stroške. Pri opisu programskega orodja Lindo smo uporabili še dodatne vire in literaturo: [99].