Metodika i programiranje kineziterapijskih postupaka kod ...
Linearno programiranje
-
Upload
novisaddepartmentofmathematicsandinformatics -
Category
Documents
-
view
0 -
download
0
Transcript of Linearno programiranje
Univerzitet u Novom Sadu Prirodno-Matematički fakultet
Seminarski rad
Strukture podataka i algoritmi III
TEMA: Linearno programiranje
Profesor Student
Đura Paunić Ţeljko Lučić 212m/13
Novi Sad, maj 2014
1
Sadržaj
Sadrţaj........................................................................................................................................ 1
Uvod ........................................................................................................................................... 2
Primer 1 .................................................................................................................................. 2
Rešavanje linearnog programa ............................................................................................... 4
Još proizvoda .......................................................................................................................... 5
Primer 2 .................................................................................................................................. 7
Formalni linearni programi ........................................................................................................ 9
Standardna i slack forma .......................................................................................................... 11
Transformacija linearnog programa u standardnu formu ..................................................... 12
Konvertovanje linearnog programa u slack formu ............................................................... 15
Simplex Algoritam ................................................................................................................... 17
Algoritam za pivotiranje....................................................................................................... 21
Formalni simplex algoritam ................................................................................................. 23
Degeneracija ............................................................................................................................ 27
Dualnost ................................................................................................................................... 30
Inicijalno osnovno rešenje ....................................................................................................... 34
Vreme izvršavanje i neki napredniji algoritmi ......................................................................... 37
2
Uvod
U teoriji algoritama problemi koje pokušavamo da rešimo mogu biti problemi odlučivanja –
algoritam daje odgovor da ili ne i optimizacioni problemi – algoritam treba da da optimalno
rešenje. Većina problema koje pokušavamo da rešimo su optimizacioni problemi: za određenu
instacu problema ţelimo da dobijemo rešenje koje je najpovoljnije u odnosu na neku cost-
funkciju. Neki od primera optimizacionih problema su: cheapest spanning tree, shortest path
problem, the longest increasing subsequence...U ovim situacijama, trebamo rešenje koje
zadovoljava sledeća dva kriterijuma:
ograničenja: rešenje zadovoljava određena ograničenja problema – na primer, put se mora
sadrţavati od grana grafa i mora početi od čvora t i završiti u čvoru v, stablo mora
sadrţavati sve čvorove grafa...
optimizacioni kriterijum: rešenje problema mora biti najbolje moguće rešenje među svim
rešenjima koja zadovoljavaju ograničenja, a u odnosu na neku dobro definisanu funkciju.
Linearno programiranje predstavlja široku klasu optimizacionih problema u kojima su i
ograničenja i optimizacioni kriterijum, linearne funkcije. U daljem tekstu pod optimizacionim
kriterijumom, podrazimevaćemo dobit koja će u zavisnosti od uslova trebati da se maksimizira ili
minimizira. Ispostavlja se da se širok spektar problema mogu interpretirati na ovaj način. Kako
predstaviti dobit i ograničenja kao linearne funkcije? Ilustrujmo to u narednom primeru.
Primer 1
Fabrika čokolade proizvodi dve vrste proizvoda. Prvi, a ujedno i glavni proizvod je
trouglašta čokolada, zvana Piramida, a drugi proizvod je mnogo sloţeniji za napraviti, ali pritom
luksuzniji, a to je Piramida sa lešnicima. Koliko bi se od ova dva proizvoda trebalo proizvesti, a
da se maksimizira profit? Pretpostavimo da fabrika proizvodi kutija Priramida čokolade na
dan, za svaku kutiju profit je $1. Takođe, pretpostavimo da fabrika proizvodi kutija Piramida
čokolade sa lešnikom na dan, i za svaku od kutija ove vrste čokolade profit je $6. I su
nepoznate vrednosti koje mi ţelimo da izračunamo ali tako da profit bude maksimalan. Naravno,
ovo bi bilo veoma trivijalno za rešiti (proizvoditi samo čokoladu sa lešnikom), da ne postoje i
druga ograničenja u problemu. Prvo i osnovno ograničenje je da 0. Drugo, dnevna
potraţnja za ovim vrstama čokolade je ograničena na najviše 200 kutija Piramida čokolade i
najviše 300 kutija Piramida čokolade sa lešnikom. Pored ovoga, radna snaga koja proizvodi
čokoladu u fabrici moţe da proizvede najviše 400 kutija čokolade na dan, s' tim što u tih 400
kutija moţe biti uračunata bilo koja od ove dve vrste čokolade. Koji je optimalni nivo
proizvodnje?
Ovaj problem moţemo prezentovati kao linearan program na sledeći način:
3
Objektivna funkcija max( )
Ograničenja 200
300
+ 400
, 0
Linearna jednačina po i definiše liniju u ravni (2D ravan), a linearna nejednakost definiše
poluravan kojoj pripadaju sve linije koje se nalaze u toj poluravni. Na osnovu toga, skup svih
mogućih rešenja ovog linearnog programa je skup tačaka , koje zadovoljavaju sva
ograničenja, u našem slučaju te tačke treba da se nalaze u preseku pet poluravni. Kao što vidimo
na sledećoj slici, to je jedan konveksan poligon:
Ţelimo da nađemo tačku , koja pripada ovom poligonu, a u kojoj je objektivna funkcija –
profit maksimalan. Kako pronaći tu tačku? Moţemo odmah uvideti da tačke koje donose profit
od c dolara leţe na pravoj , iz aparata matematičke analize znamo da ova prava
ima nagib 1/6 i na sledećoj slici je pokazano ovo za određnu dobit od c dolara. Vidimo da što
se više c povećava. prava na kojoj leţe tačke koje donose profit c pomera se od sebe gore i
udesno.
4
Pošto mi ţelimo da maksimiziramo profit c, moramo pomerati pravu što je vise moguće, ali tako
da ima zajednički presek sa regionom profita. Optimalno rešenje će biti poslednja tačka do koje
moţemo stići pomeranjem prave, stoga zaključujemo da će ova tačka biti teme našeg poligona,
kao što je i prikazano na slici. Da je nagib prave profita bio drugačiji onda bi poslednji presek sa
poligonom moţda bio čitava ivica umešto jedne tačke. U ovakvim slučajevima, optimalno
rešenje je bilo koja tačka na toj ivici.
U generalnom smislu u linearnom programu, optimalno rešenje je postignuto u tački koja se
nalazi u dostiţnom region. Jedini izuzetci su slučajevi u kojima ne poštoji optimum, a to se moţe
desiti u naredna dva slučaja:
1. Linearni program je neizvodljiv, ako su na primer ograničenja toliko tesna da je
nemoguće zadovoljiti svako od njih. Na primer, imamo ograničenja:
2. Ograničenja su toliko slaba tako da je region rešenja neograničen, tj. poštoji
beskonačno mnogo rešenja i moguće je postići neograničeno velike dobitke. Na primer,
max( )
Rešavanje linearnog programa
Linearni programi (LP) mogu biti rešeni simplex metodom, koju je osmislio George
Dantzig 1947. godine. Ovaj metod objasnićemo detaljnije kasnije, a za početak ćemo ga opisati u
najednostavnijim crtama. U terminologiji ovog algoritma, temena poligona nazivaju se čvorovi.
5
U našem slučaju algoritam počinje u čvoru (0, 0), i u više navrata traţi susedan čvor (koji je
incidentan sa ivicom regiona rešenja) koji ima bolju dobit u funkciji dobitka. Na ovaj način,
algoritam radi hill-climbing na čvorovima poligona , šetajući se od suseda do suseda tako da se
postepeno povećava profit. Na sledećoj slici vidimo moguću trajektoriju:
Kada stigne do čvora koji nema optimalnijeg suseda, simplex algoritam deklariše da taj čvor za
optimalni i halt-uje. Zašto ovaj lokalni test implicira globalnu optimalnost? Primenjujući
najednoštavniju geometriju – treba obratiti paţnju na profitnu liniju koja prolazi kroz čvor. Pošto
sve čvorovi susedi leţe ispod te linije, ostatak poligona rešenja mora takođe biti ispod ove linije.
Još proizvoda
Na zahtev potrošača, fabrika čokolade je odlučila da počne proizvodnju treće vrste
čokolade koja je još ekskluzivnija, Luksuzna Piramida. Jedna kutija ove čokolade donosi profit
od $13. Neka , , predstavljaju broj kutija za svaku vrstu čokolade, respektivno, takođe,
radna snaga moţe proizvesti dnevno 400 kutija čokolade. Pored ovoga, ispostavlja se da
Piramida čokolada sa lešnikom i Luksuzna Piramida zajedno imaju istu dnevnu potraţnju, ali
tako da Luksuzna Piramida čokolada koristi tri puta više mašine, tj. teţe ju je napraviti i zahteva
više utrošenog vremena, što implicira još jedno ograničenje:
Koji je najbolji nivo produkcije?
Prepravljamo naš linearni program:
6
Prostor rešenja je sada 3-dimenzionalan. Svaka linearna jednačina definiše ravan i svaka linearna
nejednakost definiše polu-prostor definisan sa jedne strane ravni. Prostor rešenja je presek sedam
polu-prostora, zapravo to je jedan poliedar, kao što smo videli na predhodnoj slici. Profit c
odgovara ravni , koju ćemo nazivati ravan profita. Kako se c povećava,
ravan profita se pomera paralelno u odnosu na prošlu vrednost profita c, sve dalje i dalje do
momenta kad više ne bude dodirivala prostor rešenja. Tačka poslednjeg kontakta je optimalni
čvor, (0, 300, 100), sa totalnnim profitom od $3100.
Kako bi simplex algoritam ponašao u ovom modifikovanom problemu? Kao i pre, kreće se od
čvora do čvora, po ivicama poliedra, povećavajući profit postepeno. Jedna od mogućih
trajektorija prikazana je na prethodnoj slici.
7
Na kraju, kada se dođe u čvor koji nema suseda sa boljom dobiti, zauštavlja se i proglašava ovaj
čvor za optimalno rešenje. Na isti način, primenom jednoštavne geometrije , ako svi susedni
čvorovi leţe sa jedne strane profitne ravni koja prolazi kroz ovaj čvor, iz ovoga zaključujemo da
i ceo poliedar leţi sa te strane polu-ravni.
Ako bi naša fabrika odlučila da proizvodi još jedan proizvod, pod određenim ograničenjima,
dobili bismo geometrijski oblik koji bi se nalazio u četri dimenzije. Povećavanjem broja
proizvoda na n, dobijamo n-dimenzionalni prostor, koji je veoma češto teţak za vizualizaciju, ali
simplex algoritam naštavlja da obavlja svoj posao.
Primer 2
Političar pokušava da pobedi na izvorima. Izbori se odrţavaju u distriktu koji ima tri
različita tipa područja – urbano, poluurbano i ruralno područje. Ova područja imaju respektivno
100,000 , 200,000 , 50,000 registrovanih glasača. Naravno, neće svi registrovani glasači izaći na
glasanje, a političar ţeli da svojom kampanjom ostvari da barem pola registrovanih glasača
glasaju za njega od svih registrovanih glasača koji se nalaze u regionu. Političar je pošten i neće
iznositi plan u kampanji u koji ne veruje, samo da bi se svideo glasačima u nekom od regiona.
Stoga, je političar napravio plan od četiri tačke kojeg se drţi od samog početka kampanje.
Te tačke su: izgradnja infrastrukture, kontrola oruţja, subvencije farmama i povećanje poreza na
benzin. Političar je shvatio da će određene tačke biti popularnije u nekim regionima, a u nekim
regionima manje popularnije. Na osnovu istraţivanja koje je sproveo tim koji vodi političarevu
kampanju, moţe se proceniti koliko će hiljada glasova političar osvojiti ili izgubiti u svakoj
populaciji regiona tako što će biti uloţeno $1,000 na reklamiranje neke tačke u planu. Ovu
informaciju moţemo videti na sledećoj slici:
Elementi tabele predstavljaju broj hiljada glasava koji bi se osvojili ulagajući $1,000 na
reklamiranje određene tačke u planu, za svaki region posebno. Negativne vrednosti predstavljaju
glasove koji će se izgubiti ako se određena tačka reklamira u nekom od regiona. Zadatak je
odrediti minimalnu vrednost novca koju je potrebno uloţiti u političku kampanju da bi se
osvojilo 50,000 urbanih glasova, 100,000 suburbanih glasova i 25,000 ruralnih glasova.
8
Pogađanjem bi se mogla odrediti strategija koja ostvaruje ţeljeni broj glasova, ali za tu strategiju
ne mora vaţiti da je uloţeni novac u kampanju najminimalniji. Na primer, moţe se uloţiti
$20,000 na reklamiranje izgradnje infrastrukture, $0 na kontrolu oruţja, $4,000 na reklamiranje
subvencija farmama i $9,000 na reklamiranje povećanja poreza na benzin. U ovom slučaju,
političar bi osvojio:
hiljada urbanih glasova,
hiljada suburbanih glasova,
hiljada ruralnih glasova.
Političar bi osvojio ţeljeni broj glasova u urbanom i suburbanom području i više nego što mu je
bilo potrebno glasova u ruralnom području. Zapravo, u ruralnom području bi osvojio, prema
planu, više glasova nego što je tamo uopšte registrovano glasača. Da bi se dobio ovaj broj
glasova u kampanju bi se trebalo uloţiti 20 + 0 + 4 + 9 = 33 hiljade dolara.
Kako bismo izbegli nagađanje, opisani problem moţemo preštaviti na matematički način.
Uvodimo četiri nove promenljive:
broj hiljada dolara uloţenih na reklamiranje izgradnje infrastrukture,
broj hiljada dolara uloţenih na reklamiranje kontrole oruţja,
broj hiljada dolara uloţenih na reklamiranje subvencija farmama,
broj hiljada dolara uloţenih na reklamiranje povećanje poreza na benzin.
Uvodeći i uslove da sve ove četiri promenljive moraju uvek biti veće ili jednake od nule,
dobijamo sledeći linearni program:
minimizirati
u odnosu na ograničenja
Rešenje ovog linearnog programa daće nam najoptimalniju strategiju za ulaganje novca u
političku kampanju.
9
Formalni linearni programi
U formalnom problemu linearnog programiranja, ţelimo da optimizujemo linearnu
funkciju u odnosu na skup linearnih nejednakosti. Za dati skup { } i skup
promenljivih { } definišemo linearnu funkciju f nad ovim skupom promenljivih na
sledeći način:
∑
Za b dobijamo linearnu jednačinu:
I linearne nejednačine:
U daljem tekstu ćemo pod terminom linearne jednačine ili nejednačine podrazumevati linearna
ograničenja. Formalno, problem linearnog programiranja je problem minimiziranja ili
maksimiziranja linearne funkcije u odnosu na skup linearnih ograničenja. Ako ţelimo da
maksimiziramo linearnu funkciju, kao u prvom primeru tada linearni program nazivamo
maksimizirajući linearni program. Ako ţelimo da minimiziramo linearnu funkciju kao u ovom
primeru, tada govorimo o minimizirajućem linearnom programu.
U nameri da opišemo osobine algoritma za linearno programiranje, nalazimo za shodno da
linearne programe predštavljamo u kanonskim(slack) formama.
Koristimo dve vrste formi, standardnu formu i slack formu. Kasnije ćemo definisati formalno
ove forme, za sada intuitivno ćemo podrazumevati da je linearni program u standardnoj formi
maksimiziranje linearne funkcije u odnosu na linearne nejednačine, dok je linearan program u
slack formi maksimizranje linearne funkcije u odnosu na linearne jednačine. Obično ćemo
koristiti standardnu formu za definisanje linearnih programa, ali će nam biti zgodnije da kada
budemo opisivali simplex algoritam koristimo slack formu.
Za početak, uzmimo za primer sledeći linearni program koji ima dve promenljive:
10
maksimizirati
u odnosu na
Svaka postavka vrednosti promenljivih i koja zadovoljava ova ograničenja, naziva se
dopustivo rešenje linearnog programa. Kao što smo to videli u prethodnom primeru, ograničenja
moţemo predštaviti na - Kortezijanskom kordinatnom sistemu:
Skup svih dopustivih rešenja je na slici osenčen i formira konveksni poligon u dvo-
dimenzionalnom prostoru. Ovaj prostor se formalno naziva region dopustivih rešenja ili simplex,
a funkcija koju ţelimo da maksimiziramo, objektivna funkcija. Generalno, ako se nalazimo u n-
dimenzionalnom prostoru, region dopustivih rešenja koji je ustvari presek polu-prostora
nazivamo simplex. Objektivna funkcija je nova hiperravan i zbog konveksnosti, optimalno
rešenje se nalazi u čvoru simpleksa, odnosno na njegovom temenu.
Simplex algoritam kao svoj ulaz dobija linearni program i vraća optimalno rešenje za taj linearni
program. Počinje u nekom od čvorova i izvodi niz iteracija. U svakoj iteraciji, pomera se po ivici
11
simpleksa do susednog čvora cija vrednost objektivne funkcije nije manja od trenutnog čvora
(obično je veća). Simpleks algoritam halt-uje kada dođe u čvor koji ima lokalni maksimum, a to
je čvor čiji svi susedi imaju manju vrednost objektivne funkcije. Kao što smo rekli zbog
konveksnosti sledi da je ovo i globalni optimum.
Pošto je ponekad u n-dimenzionalnom prostoru intuitivno teško geometrijski sagledati korake
simplex algoritma, u daljem tekstu ćemo korake posmatrati na algebarski način. Prvo, napišemo
dati linearni program u slack formi, koja je kao što smo rekli skup linearnih jednačina. Iz ovih
linearnih jednačina dobijamo promenljive koje zovemo osnovne promenljive i sloţene čije ćemo
definicije kasnije detaljno izneti. Simplex algoritam napreduje od jednog čvora prema drugom
tako što neke od osnovnih promenljivih poštaju sloţene i neke od sloţenih promenljivih poštaju
osnovne. Ovu operaciju ćemo nazivati pivot i gledano algebarski simplex algoritam je ništa više
do ponavljanje linearnog programa u ekvivalentnoj slack formi.
Standardna i slack forma
Ovde ćemo opisati dve forme koje ćemo koristiti za predstavljanje linearnih programa.
Standardna forma i slack forma. U standardnoj formi, sva ograničenja su linearne nejednačine, a
u slack formi sva ograničenja su linearne jednačine, osim onih ograničenja koja nam sluţe da
ograničimo promenljive tako da one mogu uzeti samo pozitivne vrednosti.
Standardna forma:
U standardnoj formi, imamo n realnih brojeva , m realnih brojeva ,
I realnih brojeva za i
Ţelimo da pronađemo realnih brojeva takvih da maksimiziramo
∑
u odnosu na restrikcije
∑
Generalizujući terminologiju, linearni program ćemo posmatrati kao program koji se sastoji od
dva dela. Prvi deo je funkcija dobitka, a drugi deo je nejednačina koje nazivamo
12
ograničenja. n ograničenja na kraju su nenegativna ograničenja. Običan linearni program ne
zahteva da postoje ova nenegativna ograničenja, ali su za standardnu formu ona potrebna.
Ponekad linearni program predstavljamo u još kompaktnijoj formi.
Koristimo matricu , m-dimenzionalni vector , n-dimenzionalni vector
I n-dimenzionalni vector tako da sada moţemo zapisati linearni program na
sledeći način:
maksimizirati
u odnosu na ograničenja
je skalarni proizvod dva vektora. Vidimo da moţemo specificirati linearni program kao
trojku I usvojićemo predpostavku da uvek imaju dimenzije koje su predhodno date.
Sa ćemo označavati skup vrednosti za vektor . Kao što smo rekli, skup vrednosti koja
zadovoljavaju sva ograničenja nazivamo dopustivo rešenje. Ako ne zadovoljava barem jedno
ograničenje onda to rešenje nazivano nedopustivo rešenje. Kaţemo da rešenje ima dobit .
Dopustivo rešenje čija je dobit maksimalna u poređenju sa svim dopustivim rešenjima,
nazivamo optimalno rešenje i nazivamo tu dobit optimalnom dobiti. Ako linearni program
nema dopustiva rešenja, kaţemo da je linearni program neizvodljiv, u suprotnom je izvodljiv.
Ako linearni program ima dopustiva rešenja, ali nema konačnu optimalnu dobit, kaţemo da je taj
linearni program neograničen.
Transformacija linearnog programa u standardnu formu
Uvek je moguće transformisati linearni program, koji u sebi sadrţi minimizirajuću ili
maksimizirajuću linearnu funkciju u odnosu na linearna ograničenja, u standardnu formu.
Linearni program se ne mora biti u standardnoj formi na osnovu bilo kog od sledećih razloga:
1. Funkciju dobitka, je moţda potrebno minimizirati, a ne maksimizirati.
2. Moţda postoje promenljive bez nenegativnog ograničenja.
3. Mozda postoje linearna ogrničenja, koja su linearne jednačine, koje imaju znak
jednakosti umešto manje ili manje-ili-jednako znaka.
4. Mozda poštoji linearno ograničenje koje je linearna nejednakost, ali umesto znaka manje
ili manje-ili-jednaka poseduje znak veće ili veće-ili-jednako.
13
Kada konvertujemo linearan program L u drugi linearni program , ţeleli bismo da zadrţimo
svojstvo da optimalno rešenje linearnog programa implicira optimalno rešenje linearnog
programa L. Da bismo shvatili ovu ideju, reći ćemo da su dva linearna programa L I
ekvivalentna, ako za svako dopustivo rešenje u programu sa dobiti z, odgovara neko
dopustivo rešenje u programu koje ima dobit z, I za svako dopustivo rešenje
u programu
sa dobiti z, odgovara neko dopustivo rešenje u programu koje ima dobit z. Ova definicija
ne implicira 1-1 preslikavanje skupa dopustivih rešenja u oba programa. Minimizirajući linearni
program I maksimizirajuci linearni program su ekvivalentni ako za svako dopstivo rešenje
u jeziku sa dobiti z, postoji odgovarajuće dopustivo rešenje u program koje ima dobit –z,
I za svako dopustivo rešenje u program sa dobiti z, postoji odgovarajuće dopustivo rešenje
u programu koje ima dobit –z.
Sada ćemo pokazati kako da uklonimo, jedno po jedno, svako od pomenutih problema u
prethodnoj listi. Kada uklonimo sve probleme, moţemo tvrditi da je novodobijeni linearni
program ekvivalentan starom linearnom program.
Da bismo konvertovali minimizirajući linearni program u ekvivalentni maksimizirajući linearni
program , jednostavno ćemo negirati koeficijente u funkciji dobiti. Kako programi I imaju
ekvivalentne skupove dopustivih rešenja i za svako dopustivo rešenje, dobit u je negativan
ekvivalent dobiti u , ova dva linearna programa su ekvivalentna. Na primer, ako imamo
linearni program:
minimizirati
u odnosu na ograničenja
Kada prepravimo koeficijente u funkciji dobitka u negativne dobijamo sledeći lienearni program:
maksimizirati
u odnosu na ograničenja
14
Sada ćemo pokazati kako konvertovati linearni program u kojem neke promenljive nemaju
nenegativna ograničenja u linearni program u kojem sve promenljive imaju nenegativna
ograničenja. Pretpostavimo da promenljiva nema nenegativno ograničenje. Sada svako
pojavljivanje promenljive zamenjujemo sa
I dodajemo nenegativna ograničenja
I
. Sada, ako objektivna funkcija sadrzi izraz zamenjujemo gas a
I ako i-to ograničenje ima izraz , zamenjujemo ga sa
. Svako dopustivo
rešenje u novom linearnom programu odgovara dopustivom resenju u originalnom linearnom
program gde bismo zamenili
I koje ima istu dobit. Takođe, svako dopustivo rešenje
u linearnom programu odgovara dopustivom rešenju u novom linearnom programu sa
I
ako je , ili I
ako je . Ova dva linearna programa
imaju iste dobiti bez obzira na znak od . Sledi da su ova dva linearna programa ekvivalentana.
Ovu tehniku primenjujemo na svaku promenljivu za koju ne postoji nenegativno ograničenje i
tako dobijamo ekvivalentne linearne programe u kojima su specificirana nenegativna
ograničenja. Vraćajuci se na naš primer imamo sledeću situaciju:
maksimizirati
u odnosi na ograničenja
Dalje, konvertujemo linearne jednačine u linearne nejednačine. Pretpostavimo da linearni
program ima linearno ograničenje . Pošto je akko vaţi I ,
linearnu jednačinu moţemo zameniti sa dve linearne nejednačine I
. Ponavljajuci ovaj postupak menjanja jednačina u nejednačine dobijamo
linearan program čija sva linearna ograničenja jesu linearne nejednačine.
Na kraju pretvaramo linearne jednačine koje imaju znak veće ili veće-ili-jednako u ograničenja
sa znakom manje ili manje-ili-jednako tako što ih mnozimo sa .
U našem primeru posle ovih trasnsformacija, situacija je sledeća:
maksimizirati
u odnosi na ograničenja
I posle vršenja transformacije ograničenja koje ima znak veće-ili-jedako:
15
maksimizirati
u odnosi na ograničenja
Ovom transformacijom je smo konačno dobili program koji je u standardnoj formi.
Konvertovanje linearnog programa u slack formu
Da bi efikasno rešavali linearne programe simplex algoritmom, ţelimo da izrazimo
linearni program u slack formi u kojoj su neka od ograničenja linearne jednačine. Preciznije,
konvertovaćemo ih u formu u kojoj si nenegativna ograničenja jedine linearne nejednačine u
linearnom program, ostala ograničenja su linearne jednačine. Neka su:
∑
ograničenja koja su linearne nejednačine. Uvodimo novu promenljivu s i prepisujemo
nejednakost kao dva nova ograničenja:
∑
Promenljivu s nazivamo slack promenljiva, jer termin slack predstavlja izraz za labavost, a ta
labavost je razlika izmedju leve i desne strane prethodne jednačine. Pošto je prva nejednačina
tačna akko su zadovoljene i zadnja jednačina i nejednačina, na ovaj način moţemo
transformisati svako ograničenje koje je linearna nejednačina na dva ograničenja, linearnu
jednačinu i nenegativno ograničenje linearnu nejednačinu. Kada pravimo slack formu od
standardne forme, umesto s ćemo koristiti notaciju da bismo obeleţili slack promenljivu
koja je povezana sa i-tom nejednakošću. I-to ograničenje će tada biti:
∑
I nenegativno ograničenje
16
Ako prošli linearni program konvertujemo u slack formu, dobijamo:
maksimizirati
u odnosu na ograničenja
U ovom linearnom program, sva ograničenja osim nenegativnih ograničenja su linearne
jednačine i za svaku promenljivu postoji nenegativno ograničenje. Svaka od linearnih jednačina
ima jednu promenljivu sa leve strane i vise promenljivih sa desne strane. Zapravo skup
promenljivih sa desne strane je isti za svaku linearnu jednačinu i ovaj skup promenljivih su
jedine promenljive koje se pojavljuju u funkciji dobitka. Promenljive sa leve strane linearnih
jednačina nazivamo osnovne promenljive, a promenljive sa desnih strana linearnih jednačina
nazivamo sloţene promenljive.
U linearnim programima cešto ćemo izostavljati izraze “maksimizirati” ili “minimizirati” kao i
nenegativana ograničenja. Dobit ćemo označavati sa z. Sada formalnije zapisujemo slack formu
iz prethodnog primera:
Kako će nam za rad simplex algoritma biti bitno da znamo koje promenljive su osnovne, a koje
sloţene sa skupom B ćemo označiti indekse promenljivih koje su osnovne, a sa skupom N
indekse promenljivih koje su sloţene. Uvek ćemo podrazumevati da je | | | | I
{ }. Jednačine su indeksirane elementima skupa , a promenljive sa
desne strane tih jednačina su indeksirane elementima skupa . Kao i u standardnoj formi,
koristimo vektore i matricu da označimo ograničenja i koeficijente u funkciji dobiti.
Sada formalno, moţemo definisati slack formu kao uređenu šeštorku koja
označava slack formu:
∑
∑ , za
gde za sve promenljive postoje nenegativna ograničenja.
17
Simplex Algoritam
Simplex algoritam je klasičan metod za rešavanje linearnih programa. Njegovo vreme
izvršavanja u njagorem slučaju nije polinomno vreme. Iako je poprilično spor za rešavanje
linearnih programa, u praksi beleţi znatno brţe vreme izvršavanja. Tok izvršavanja simplex
algoritma je veoma sličan Gausovoj eliminaciji. Gausova eliminacija počinje sa sistemom
linearnih jednačina čije je rešenje nepoznato. U svakoj iteraciji dobijamo novi sistem linearnih
jednačina koji ima neku dodatnu strukturu. Posle nekog broja iteracija, dobijamo sistem iz kojeg
je rešenje lako dobiti. Simplex algoritam odrađuje veoma sličnu stvar i moţemo ga posmatrati
kao Gausovu eliminaciju nad nejednačinama.
Sada ćemo opisati glavnu ideju iza svake iteracije simplex algoritma. U svakoj iteraciji, imaćemo
osnovno rešenje koje lako moţemo dobiti iz slack forme linearnog programa tako što ćemo
postaviti vrednosti svih sloţenih promenljivih na 0 i izračunati vrednosti osnovnih promenljivih
iz linearnih jednačina. Jedna iteracija konvertuje jednu slack formu u njoj ekvivalentnu drugu
slack formu. Dobit koju ostvarujemo od osnovnog rešenja u trenutnoj iteraciji biće veća ili
jednaka od dobiti koju ostvarujemo u prethodnim iteracijama od osnovnih rešenja u tim
iteracijama. Da bismo ostvarili inkrementaciju dobiti u svakoj iteraciji, tako što biramo sloţenu
promenljivu takvu da kada bismo povećali vrednost te promenljive na neku vrednost veću od 0 i
dobit takođe raste. Vrednost za koju moţemo povećati ovu promenljivu limitirana je drugim
ograničenjima. Zapravo, mi povećavamo ovu sloţenu promenljivu sve dok neka od osnovnih
promenljivih ne postane 0. Tada ponovo prepisujemo slack formu, ali tako da sada zamenjujemo
uloge osnovne promenljive koja je poštala 0 i sloţene promenljive koju smo povećavali. Stoga,
algoritam jednostavno prepisuje slack formu razmenjujući uloge promenljivama, sve dok ne
dođe do optimalnog rešenja, tj. kada optimalno rešenje ne bude očigledno.
Primer:
Neka imamo dat program u standardnoj formi:
maksimizirati
u odnosu na
Da bismo koristili simplex algoritam, najpre moramo ovu standardnu formu prevesti u slack
formu. Kroz principe ovog postupka smo već prošli. Reći ćemo da skup ograničenje, tj. linearna
jednačina, tesna za određenu postavku sloţenih promenljivih koje se nalaze u njoj ako one
uzrokuju da neka od osnovnih promenljivih postane 0. Slično, postavka sloţenih promenljivih
koja će osnovnu promenljivu postaviti na negativnu vrednost narušava ograničenje. Na osnovu
ovoga, zakljucujemo da je slack forma zapravo specifikacija toga koliko moţemo povecavati
neke sloţene promenljive, tj. koliko je daleko neko određeno linearno ograničenje od toga da
bude tesno. Kako ovu informaciju sada imamo iz forme, moţemo povećavati neku sloţenu
promenljivu sve do trenutka kada moţemo narušiti ograničenja.
18
Predhodni primer ćemo predstaviti u slack formi:
Ovaj sistem ima 3 jednačine i 6 promenljivih. Svaka postavka promenljivih definiše
vrednosti za promenljive i na osnovu ovoga imamo beskonačno rešenja za ovaj sistem
jednačina. Rešenje je dopustivo ako su sve promenljive nenegativne što
znači da moţe postojati beskonačan broj dopustivih rešenja. Fokusiramo se na osnovno rešenje:
poštavljamo vrednosti svih sloţenih promenljivih sa desne strane na 0, dok vrednosti osnovnih
promenljivih računamo. U ovom primeru, osnovno rešenje je i dobit pri ovom rešenju je . Primetimo da osnovno
rešenje postavlja vrednost promenljive za svako Iteracija simplex algoritma
prepisuje skup jednačina i funkciju dobiti ali tako da postavlja drugačiji skup promenljivih sa
desne strane jednačina. Zbog toga, u svakoj sledećoj iteraciji dobijamo drugačije osnovno
rešenje.
Ako je osnovno rešenje dopustivo, zvaćemo ga osnovno dopustivo rešenje. U prvoj iteraciji
simplex algoritma, osnovno rešenje je skoro uvek dopustivo. Glavna ideja simplex algoritma je
da se iteracijom reformuliše linearni program, tako da novodobijeni linearni program ima
osnovno rešenje koje ima veću dobit. Ovo povećanje dobiti osnovnog rešenja se postiţe tako što
u iteraciji simplex algorima zamenjujemo uloge neke izabrane sloţene promenljive i osnovne
promenljive.
Kako biramo sloţenu promenljivu čiju ćemo ulogu u program promeniti da bude osnovna
promenljiva? Ovo postiţemo tako što iz funkcije dobiti uzimamo promenljivu uz koju je
koeficijent pozitivan. Kako znamo da je funkcija dobiti, funkcija samo od sloţenih promenljivih,
sledi da moţemo napraviti izbor, naravno ako u funkciji postoji promenljiva čiji koeficijent je
pozitivan. Neka je odabrana promenljiva . Sada povecavamo vrednost promenljive ,
maksimalno koliko se moţe povećati tako da sva ograničenja ne budu narušena. Neka je
promenljiva u ograničenju koje je najtesnije za povećavanje vrednosti promenljive . Sada
promenljiva postaje sloţena promenljiva, dok promenljiva postaje osnovna promenljiva.
Kada se izvrsi zamena, vrednosti oštalih osnovnih primenljivih I funkcija dobiti, mogu se
promeniti.
Vratimo se našem primeru. Simuliraćemo jednu iteraciju simplex algoritma. Na početku,
potrebno je da odaberemo jednu sloţenu promenljivu koja će postati osnovna. Pošto sve tri
promenljive u funkciji dobiti imaju pozitivne koeficijente uz sebe, izbor moţemo ostvariti tako
što ćemo odabrati bilo koju od te tri promenljive. Neka smo odabrali promenljivu . Iz
ograničenja zaključujemo da povećavanjem promenljive , vrednosti promenljivih
opadaju. Pošto postoje nenegativan ograničenja za sve promenljive, program će biti narušen ako
neka od promenljivih i predje u negativnu vrednost. Ako se poveca iznad 30, onda
promenljiva dobija negativnu vrednost. Ako se promenljiva poveća na vrednost koja je
veća od 12, tada promenljiva ima negativnu vrednost. Ako se promenljiva poveća iznad 9,
tada promenljiva ima negativnu vrednost. Zakljulujemo da je ograničenje u kojem je sa leve
strane osnovan promenljiva tesno ograničenje za sloţenu promenljivu . Dakle, promenljivu
19
, moţemo povećati najviše na 9, tako da nijedno od ograničenja ne bude narušeno. Sada
zamenjujemo uloge promenljivih. Kao što smo rekli, sloţena promenljiva postaje osnovna, a
osnovna promenljiva iz tesnog ograničenja, , postaje sloţena promenljiva. Kako se postiţe
ova promena uloga promenljivih?
Iz tesnog ograničenja, izrazimo slozenu promenljivu koju smo povećavali, u našem slučaju .
Konkretno, u našem primeru je to:
Sada u ostalim linearnim ograničenjima, sa desne strane izraţavamo promenljivu preko gornje
jednakosti i tako dobijamo nova ograničenja, u kojima će se sa desne strane pojavljivati
promenljiva , u skladu sa njenom novodobijenom ulogom da je sloţena promenljiva. Takođe i
u funkciji dobiti izraţavamo promenljivu preko gornje jednakosti, tako da se u funkciji dobiti
pojavljuju promenljive koje su sloţene (pošto više nije sloţena). Dobijamo novi linearni
program:
Jednu iteraciju, koju smo predhodno demonstrirali, odnosno razmenu uloga dve promenljive i
izraţavanje nove forme na osnovu te razmene, nazivamo pivot. Formalno, pivot bira ulaznu
promenljivu da postane osnovna i izlaznu promenljivu da postane sloţena.
Novodobijeni linearni program je ekvivalentan prethodnom linearnom programu. Ovo
dokazujemo konstatacijom da u iteraciji simplex algoritma izvodimo dve operacije. Prva
operacija je razmena promenljivih u nekom od ograničenja, tako da jedna promenljiva prelazi sa
leve strane jednakosti, dok promenljiva koja je prethodno bila sa leve strane prelazi na desnu. Iz
ove operacije trivijalno sledi da su oba linearna programa ekvivalentna, pošto je reč o
ekvivalentnim ograničenjma, samo sa različitim rasporedom promenljivih sa leve i desne strane.
Druga operacija je izraţavanje promenljive koja je prethodno bila sloţena preko novodobijene
jednakosti iz tesnog ograničenja. Primenom elementarne linearne algebra, moţemo prmetiti i da
ova operacija ne remeti ekvivalentsnost naših sistema.
Ekvivalentnost programa moţemo proveriti i prema definiciji ekvivalentsnosti linearnih
programa. Ako posmatramo osnovno rešenje u linearnom programu pre iteracije
20
, ono zadovoljava ograničenja u novom linearnom programu i ima dobit
=0. Dakle ima istu dobiti kao i u starom linearnom program. Ako
posmatramo osnovno rešenje u novom linearnom program, tj. rešenje kada vrednosti sloţenih
promenljivih postavimo na 0, (9,0,0,21,6,0), ono ima dobit Moţemo primetiti da ovo
osnovno rešenje zadovoljava ograničenja u starom linearnom programu kao i da je njegova dobit
u starom linearnom program takođe . Bitno je primetiti je posle iteracije dobijen
ekvivalentni linarni program koji ima osnovne rešenje čija je dobit veća od dobiti osnovnog
rešenja u starom linearnom program.
Sada ćemo demonstrirati još jednu iteraciju simplex algoritma. Odmah primećujemo da za
ulaznu promenljivu nećemo odabrati promenljivu pošto je koeficijent uz tu promenljivu u
funkciji dobiti negativan. Od preostalih sloţenih promenljivih biramo promenljivu za
ulaznu promenljivu. Posmatramo koliko najviše moţemo povećavati promenljivu tako da
nijedno od ograničenja ne postane narušeno. Ako je povećamo iznad 18, promenljiva postaje
negativna. Ako je povećamo iznad
, promenljiva postaje negativna. Ako je povećamo iznad
, promenljiva postaje negativna. Poslednnje ograničenje, tj. ograničenje u kojem je sa leve
strane je najtesnije ograničenje i odlučujemo da razmenimo uloge promenljivih . Iz
poslednjeg ograničenja dobijamo:
I preko ove jednakosti izraţavamo pojavljivanje promenljive sa desne strane u
ogranicčenjima. Isto ovo radimo i u funkciji dobiti. Dobijamo ekvivalentan linearni program:
Osnovno rešenje novodobijenog linearnog programa je
sa dobiti
.
Prelazimo u sledeću iteraciju. Sada jedino moţemo odabrati sloţenu promenljivu da postane
ulazna promenljiva, pošto su koeficijenti uz sve ostale sloţene promenljive u funkciji dobiti,
negativni. Ograničenja nam odaju maksimalne vrednosti do kojih moţemo povećavati
promenljivu i to su 132, 4 i , respektivno (Primetimo da je ograničenje dobijeno iz
21
poslednje ograničenja, zato što povećcavanjem promenljive povećava se i osnova promenljiva
). povećavamo na 4 i ova promenljiva postaje osnovna, dok promenljiva koja je bila
osnovna u tesnom ograničenju, tj. u drugom ograničenju, , postaje sloţena. Dobijamo
ekvivalentan linearni program:
Posle ove iteracije, koeficijenti uz sve sloţene promenljive u funkciji dobiti su negativni.
Nemamo više izbora za ulaznu promenljivu i algoritam haltujem. Kasnije ćemo videti da kada se
dogodi ova situacija, imamo optimalno rešenje našeg početnog problema. To optimalno rešenje
je osnovno rešenje poslednje iteracije. Dakle, za ovaj program, rešenje je (8,4,0,18,0,0), koje
ostvaruje dobit od 28, što je optimalna dobit. Ako sada uzmemo funkciju dobiti iz početnog
linearnog programa i ubacimo u nju vrednosti promenljivih koje smo dobili u polednoj
iteraciji, tj. , ostvarujemo identičnu dobit .
Primetimo da vrednosti ostalih promenljivih u optimlnom rešenju, tj.
predstavljaju meru toga koliko je ostalo prekoračenja u svakoj od nejednakosti u prvobitnoj
formi, tj. koliko smo puno povećali neku promenljivu iznad ograničenja. U engleskom jeziku
postoji izraz slack za nešto što predstavlja labavost ili nezategnutost, stoga se nasa početna forma
ustvari i zove slack forma, kao i ove promenljive, slack promenljive. Slack promenljiva ima
vrednost 18, a sa desne strane ograničenja u početnom linearnom programu u kojem je ova
promenljiva sa leve strane iamamo vrednost , što je za 18 manje od 30, što znači
da smo za 18 „premašili“ u našem optimalnom rešenju. Obratimo paznju i da su koeficijenti u
prvobitnoj slack formi celi brojevi, a da su koeficijenti u ostalim formama realni brojevi, što
implicira da optimalno rešenje ne mora biti vektor celih brojeva. U nasem slučaju se naštimalo
tako da smo za optimalno rešenje dobili vektor celih brojeva.
Algoritam za pivotiranje
Sada ćemo predstaviti pseoudo-proceduru za izvršavanje jedne iteracije simplex
algoritma, koju smo do sad nazivali pivot. Procedura Pivot prima kao ulazni parametar petorku
, indeks i izlazne promenljive (osnovne promenljive koja će postati slozena) i
indeks e ulazne promenljive (slozena promenljiva koja ce poštati osnovna). Procedura vraća
petorku koja predstavlja novu slack formu. (Obratimo paţnju da da su element
matrica negativne vrednosti koeficijenata koji se nalaze u slack formi)
22
Procedura Pivot radi na sledeći način: Linije 3-6 računaju koeficijente u novoj jednačini za
ulaznu promenljivu tako što transformišu jednačinu koja ima kao osnovnu promenljivu sa
leve strane u jednačinu koja sa leve strane ima . Linije 8-12 aţuriraju ostale jednačine tako što
svako pojavljivanje promenljive sa desne strane zamenjuju prethodno izračunatim izrazom.
Linije 14-17 rade isto aţuriranje ali sada za funkciju dobiti. Linije 19-20 aţuriraju skupove
indeksa sloţenih i osnovnih promenljivih. Na kraju, linija 21 vraća novu slack formu.
Nailazimo na problem, jer ako je imamo deljenje sa nulom, gde moţe nastupiti greška.
Na sreću, u narednim lemama ćemo videti da ovo nije moguće.
Sada moţemo sumirati efekat koji procedura Pivot ima na vrednosti promenljivih u osnovnom
rešenju:
23
Lema 1:
Neka smo izvršili procedure Pivot nad petorkom , gde je i neka je
procedura vratila petorku i neka je osnovno rešenje posle poziva procedure.
Onda vaţi:
1.
2.
3. { }
Dokaz:
Trivijalno, prva tvrdnja je tačna pošto osnovno rešenje poštavlja vrednosti svih sloţenih
promenljivih na 0. Kada postavimo vrednosti svih sloţenih promenljivih na 0 u ograničenjima
∑
dobijamo da je . Pošto i u proceduri linija 3 nam daje
Ovim je i druga stavka dokazana.
Slično, koristeći liniju 9 procedure Pivot { } imamo da je .
Formalni simplex algoritam
Sada ćemo formalno specificirati simplex algoritam kojeg smo demonstrirali u primeru. U
primeru smo imali sreće i nismo uspeli da utvrdimo:
Kako da znamo da li je linearni program izvodljiv?
Šta radimo kada je linearni program izvodljiv, ali osnovno rešenje u prvoj iteraciji nije
dopustivo?
Kako utvrđujemo da li je linearni program ograničen?
Na koji način biramo izlazne i ulazne promenljive?
Za početak pretpostavimo da imamo procedure INITIALIZE-SIMPLEX (A,b,c) koja vraća slack
formu u kojoj je osnovno rešenje dopustivo, a kasnije ćemo objasniti kako ova procedura
funkcioniše i kako naći slack formu u kojoj je osnovno rešenje dopustivo. Takođe, kasnije ćemo
24
pokazati i kako odluciti da li je ceo linearni program izvodljiv. Dakle imamo ( ), m-
dimenzionalni vektor I n dimenzionalni vektor koje procedura INITIALIZE-
SIMPLEX prima i vraća slack formu koja je izvodljiva. Ako je problem od starta neizvodljiv,
procedura INITIALIZE-SIMPLEX vraća obavestenje da je program neizvdljiv i izvršavanje se
prekida.
Sledeća procedura Simplex kao input uzima linearni program u štandardnoj formi. Vraća n-
dimenzionalni vektor ( ) koji je optimalno rešenje za linearni program.
Procedura Simplex radi na sledeći način. U liniji 1 se poziva procedura INITIALIZE-SIMPLEX
koja je predhodno opisana. while petlja 3-12 je srz procedure. Ako su svi koeficijent u funkciji
dobiti negativni, tada ova petlja završava sa radom. U suprotnom, u liniji 4 se bira neka
promenljiva uz koju je koeficijent u funkciji dobiti pozitivan, da bude ulazna promenljiva. Za
sada pretpostavimo da poštoji neko determinističko pravilo po kojem se ova promenljiva bira.
Linije 5-9 proveravaju svako ograničenje i bira se ono koje koje je tesno ograničenje (“najviše”
ograničava vrednost na koju moţemo povecati tako da ograničenja ne budu narušena ).
Osnovna promenljiva koja je povezana sa tim ograničenjem je . Ponovo smo u mogućnosti da
biramo promenljivu koja će biti izlazna promenljiva ali ćemo pretpoštaviti da poštoji neko
determinističko pravilo. Ako nijedno od ograničenje ne ograničava koliko moţemo povećati našu
ulaznu promenljivu (svugde je ograničenje ) tada procedura vraća obaveštenje da je linearni
25
program neograničen, linija 10-11. U suprotnom zamenjujemo uloge promenljivih u liniji
12 tako što pozivamo proceduru PIVOT . Linije 13-16 izračunavaju rešenje
za promenljive u oreginalnom programu tako što poštavljaju vrednosti svih sloţenih
promenljivih na 0 i svake osnovne promenljive na i linija 17 vraća ovaj vektor.
Da bismo pokazali ispravnost simplex algoritma, dokazaćemo sledeću lemu:
Lema 2:
Neka imamo dat linearni program . Pretpostavimo da poziv procedure INITIALIZE-
SIMPLEX u liniji 1 procedure SIMPLEX vraća slack formu iz koje je osnovno rešenje
dopustivo. Tada ako procedura SIMPLEX vrati rešenje u liniji 17, to rešenje je dopustivo rešenje
za linearni program. Ako procedura Simplex vrati “unbounded” u liniji 11, linearni program je
neograničen.
Dokaz:
Lemu ćemo dokazati tako što ćemo dokazati sledeća tvrđenja koja vaţe za početak svake
iteracije. Dokaz izvodimo trostrukom invarijantom petlje. Odnosno, pokazacemo da na
početcima svih iteracija while petlje 3-12, vaţe naredna tri podtvrđenja:
Na početku svake iteracije u while petlji 3-12 vaţi:
1. slack forma je ekvivalentna onoj slack formi koju je vratila procedura INITIALIZE-
SIMPLEX.
2.
3. osnovno rešenje trenutne slack forme je dopustivo.
Inicijalizacija: Posmatramo prvu iteraciju. Ekvivalentnost slack formi je trivijalna pošto lema
pretpoštavlja da je procedura INITIALIZE-SIMPLEX u liniji 1 vratila slack formu u kojoj je
osnovno rešenje dopustivo. Iz ovoga sledi da je treće tvrđenje tačno. Pošto je osnovno rešenje
dopustivo, svaka osnovna promenljiva je nenegativna. Kako znamo da osnovno rešenje
poštavlja vrednosti svih osnovnih promenljivih na , odnosno , sledi da je I
Dakle, sada je i drugo tvrđenje tacno.
Održavanje: Dokazaćemo da za svaku iteraciju while petlje vaţi ekvivalentnost prethodna tri
tvrđenja. Pretpoštavićemo da return naredba u liniji 11 neće izvršiti, o tome ćemo diskutovati
kada budemo u segmentu završetka. Jedna iteracija while petlje razmenjuje uloge osnovne i
sloţene promenljive pozivom procedure PIVOT. Kako primenjujemo samo elementarne
transformacije, trivijalno se zaključuje da je trenutna slack forma ekvivalentna slack formi u
prethodnoj iteraciji, koja je po hipotezi, ekvivalentna inicijalnoj slack formi.
Sada ćemo pokazati da je i drugo tvrđenje tačno. Pretpostavimo da je na početku svake iteracije
while petlje . Pokazaćemo da ove nejednakosti neće biti narušene posle poziva
26
procedure PIVOT u liniji 12. Kako se jedine promene promenljive i skupa dešavaju pri
dodeli vrednosti, dovoljno je pokazati da linija 12 potvrđuje ovo tvrđenje. Neka
predštavljaju vrednosti pre poziva procedure PIVOT I neka predštavlja vrednosti koje je
vratila procedura PIVOT.
Prvo, posmatramo zato što je po tvrđenju koje vaţi za svaku iteraciju , na
osnovu linija 6 I 9 SIMPLEX procedure I
prema liniji 3 u procedure PIVOT.
Za ostale indekse { } imamo:
(na osnovu linije 3 procedure PIVOT)
Moramo razmotriti dva slučaja, u zavisnosti da li je ili je
Ako je , tada pošto smo odabrali takvo da je:
imamo:
I na osnovu ovoga je . Ako je , sledi da iz nenegativnosti gornja
jednačina implicira da I mora biti nenegativno.
Sada tvrdimo da je osnovno rešenje dopustivo, odnosno da sve promenljive imaju nenegativne
vrednosti. Sloţene promenljive su poštavljene na 0 i trivijalno je da su one nenegativne. Svaka
osnovna promenljiva je definisana jednačinom:
∑
Osnovno rešenje poštavlja vrednost osnovne promenljive na , odnosno . Sada
moţemo iskoristiti drugo tvrđenje i zaključiti da su i sve osnovne promenljive pozitivne, pošto
drugo tvrđenje kazţe da su svi
Završetak: While petlja moze da završi rad na jedan od dva različita načina. Ako završi rad
zbog uslova u liniji 3, onda je trenutno osnovno rešenje dopustivo i linija 17 vraća ovo rešenje.
Drugi način da petlja završi svoj rad je da vrati “unbounded” u liniji 11. U ovom slučaju za
svaku iteraciju for petlje u liniji 5-8, ako se linija 6 izvrsila imamo da je Posmatrajmo
rešenje definisano na sledeći način:
27
{
{ }
∑
Tvrđenje implicira da je I imamo da je I Dakle,
Sada pokazujemo da je dobit za rešenje neograničena, imamo da je:
∑
Pošto je (zbog linije 4 SIMPLEX procedure) I dobit je takođe , i zbog ovoga je
linearni program neograničen.
Oštaje da se pokaze da SIMPLEX procedura zavrsava svoj rad I da ako ona vrati rešenje koje je
dopustivo, ono je i optimalno.
Degeneracija
U prethodnom primeru smo videli da svaka iteracija simplex algoritma, tj. SIMPLEX
procedure, vraća osnovno rešenje koje ima veću dobit. Da li je ovo jedino što moţe da se desi?
Na ţalost, nije. Moguće je da iteracija simplex algoritma ostvavlja dobit nepromenjenu, odnosno
osnovno rešenje ima istu dobit kao prethodno osnovno rešenje. Ovaj fenomen se naziva
degeneracija, i sada ćemo ući u detalje ove tematike.
Dodela vrednosti u liniji 14 procedure PIVOT, menja dobit. Pošto procedura
SIMPLEX poziva procedure PIVOT jedino kada je , jedini način da se dobit ne promeni,
odnosno da ostane je da je Ovoj promenljivoj je u liniji 3 PIVOT procedure
dodeljena vrednost . Pošto je uvek kada pozivamo procedure PIVOT,
zaključujemo da je jedini uzrok ovome to da je
Zaista, ova situacija se moţe desiti. Uzmimo u obzir sledeći linearni program:
28
Neka smo izabrali promenljivu za ulaznu, a promenljivu za izlaznu promenljivu. Posle
pivotiranja imamo:
Sada je jedini izbor za ulaznu promenljivu I će biti izlazna promenljiva. Pošto je ,
dobit koja je imala vrednost 8 ostaje nepromenjena posle pivotiranja:
Dobit se nije promenila ali naša slack forma jeste, u sledećoj iteraciji. Na sreću, ako odradimo
pivotiranje još jednom, sa kao ulaznom promenljivom i kao izlaznom promenljivom, dobit
će se povećati na 16 i simplex algoritam moţe naštaviti.
Degeneracija moţe sprečiti simplex algoritam da završi svoj rad, jer moţe dovesti do fenomena
poznatog kao kruţno ponavljanje – slack forme u dve različite iteracije su identične. Zbog
degeneracije, simplex algoritam moţe proizvesti niz iteracija koje ne menjaju slack formu. Na
osnovu ovoga algoritma moţe upasti u krug iteracija iz kojeg se ne moţe izvući pa se nikad ne
moţe završiti. Sada ćemo dokazati leme koje će nam pokazati da je kruţno ponavljanje jedini
razlog da se simplex algoritam ne završi.
Lema:
Neka je skup indeksa. Za svako neka su i realni brojevi i neka je promenljiva koja
prima realnu vrednost. Neka je neki realan broj. Predpostavimo da za bilo koju vrednost
vaţi:
∑ ∑
Tada je za svako i vaţi
Dokaz:
Pošto jednačina 2.78 vaţi za bilo koju vrednost promenljive moţemo koristiti konkretne
vrednosti da bismo dokazali tvrđenje za vrednosti . Ako je , zaključujemo
da je tada . Sada ako odaberemo proizvoljan indeks I postavimo vrednost promenljive
na tom indeksu I onda je sigurno pošto smo birali indeks
proizvoljno, zaključujemo da vaţi da je .
2.78
29
Lema:
Neka je linearni program u standardnoj formi. Za odgovarajuću slack formu I skop
indeksa osnovnih promenljivih , ta slack forma je jednoznačno određena na osnovu skupa
Dokaz:
Predpostavimo suprotno. Neka postoje dve različite slack forme sa istim skupovima indeksa
osnovnih promenljivih . Zaključujemo da ove dve slack forme takođe moraju imati identične I
skupove indeksa sloţenih promenljivih { } Zapisujemo prvu slack
formu:
∑
∑
i drugu slack formu:
∑
∑
Ako sada napravimo novi sistem jednačina od linearnih ograničenja u obe slack forme, tako što
zamenimo sve pojave u prvim ograničenjima, izdrazima za u linearnim ograničenjima
druge slack forme, dobijamo:
∑(
)
što je ekvivalentno sledećem:
∑
∑
Sada, za svako primenjujemo predhodnu lemu sa vrednostima i
i i Pošto je , imamo da je za svako i vaţi da je
onda imamo da je da je . Dakle, za dve slack forme, su identični sa .
Korišćenjem iste tehnike dokazivanja, moţe se dokazati da tada mora biti i i i na
osnovu ovoga dolazimo u kontradikciju sa polaznom predpostavkom da su ove dve slack forme
različite, jer smo upravo dokazali da su one iste.
30
Lema:
Ako Simplex procedura ne završi svoj rad u najviše (
) iteracija, tada je sigurno postojala
jedna slack forma koja se barem dvaput pojavila u dve različite iteracije.
Dokaz:
Dokaz je jednostavan, ako se primeni predhodan lema. Znamo da je slack forma jedinstveno
određena skupom indeksa svojih osnovnih promenljivih. Ako je | | i | | ,
zaključujemo da različitih slack formi ima (
) na osnovu čega je primenom Dirihleovog
principa dokaz trivijalan.
Vrtenje u krug je teoretski moguće, ali se u praksi retko dešava. Ovu anomaliju moţemo sprečiti
tako što ćemo uvesti neka pravila pri izboru promenljive koja će biti ulazna i promenljive koja će
biti izlazna. Jedna opcija je da „promeša“ input tako da do vrtenja u krug posle toga sigurno ne
moţe doći. Druga opcija je da se koristi Bland’s rule, tj. pravilo da pri izboru sloţene
promenljive koja će postati ulazna promenljiva za iteraciju, biramo promenljivu sa njajmanjim
indeksom, tada do anomalije vrtenja u krug sigurno neće doći.
Dualnost
Koncept dualnosti linearnog programiranja umogućava nam da dokaţemo da je rešenje
koje je pronašao simplex algoritam ujedno I optimalno rešenje. Primer dualnosti moţe biti
definisan na sledeći način: dat nam je maksimizirajuci problem, definišemo odgovarajući
minimizirajuci problem takav da oba problema imaju iste dobiti optimalnog rešenja. Za dati
primalni linearni program gde treba maksimizirati dobit, opisaćemo kako formulisati dualni
linearni program gde je zadatak minimizirati dobit I čije je optimalno rešenje identično
primarnom linearnom programu.
Neka imamo dat primarni linearni program u standardnoj formi:
maksimizirati
∑
u odnosu na ograničenja
31
∑
Definišemo dualni linearni program:
minimizirati
∑
U odnosu na ograničenja
∑
Doualni linearni program smo napravili tako što smo:
1. Zamenili maksimiziranje dobiti na minimiziranje dobiti
2. Zamenili uloge koeficijenata sa desnih strana ograničenja sa koeficijentima u
funkciji dobiti.
3. Zamenili svaki znak sa u ograničenjima.
Svako od m ograničenja u primarnom linearnom programu ima odgovarajuću promenljivu u
dualnom linearnom programu.
Svako od n ograničenja u dualnom linearnom programu ima odgovarajuću promenljivu u
primarnom program
Objasnimo ovo malo detaljnije na konkretnom primeru:
32
Maksimizirati
U odnosu na ograničenja:
Minimizirati:
U odnosu na ograničenja:
, , 0
Lema: (Slaba dualnost linearnog programiranja)
Neka je neko dopustivo rešenje primarnog linearnog programa I neka je neko dopustivo
rešenje dualnog linearnog programa. Tada vazi:
∑ ∑
Dokaz:
∑ ∑ ∑
, , 0
33
∑ ∑
∑
Posledica:
Neka je dopustivo rešenje primarnog linearnog programa I neka je dopustivo
rešenje odgovarajuceg dualnog linearnog programa.
Ako je:
∑ ∑
Tada su I I optimalna rešenja primarnog I dualnog linearnog programa, respektivno.
Dokaz:
Na osnovu prošle leme dobit dopustljivog rešenja u primarnom linearnom programu ne moze biti
veća ni od jedne dobiti nekog dopustljivog rešenja dualnog linearnog programa. Primarni
linearni program je maksimizirajući, a dualni linearni program je minimizirajući problem. Te na
osnovu ovoga, ako dopustiva rešenja I imaju istu dobit, sledi da ne postoji bolja dobit ni za
jedno ni za drugo pa su oba optimalna rešenja za svoje linearne programe.
Teorema: (Dualnost linearnog programa)
Neka je Simplex procedura vratila vrednost za primarni linearni program
Neka predstavljaju skupove indeksa sloţenih I osnovnih promenljivih u slack
formi koja se dobija nakon poslednjeg pivotiranja. Neka je definisano na
sledeci nacin:
{
34
Tada je optimalno rešenje primarnogo linearnog programa I je optimalno rešenje dualnog
linearnog program za primarni linearni program I vaţi:
∑ ∑
Na osnovu predhodne teoreme dualnost linearnog programa nam pokazuje da se izračunavanjem
optimalnog resenja primarnog linearnog programa, simultano računa optimalno resenje
odgovarajućeg dualnog programa.
Takođe, na osnovu nje dobijamo kriterijum za proveru otimalnosti rešenja linearnog programa.
Inicijalno osnovno rešenje
U praksi problem predstavlja to što ne znamo kako utvrdjujemo da li je linearni program
izvodljiv, tj. da li postoji neko dopustivo rešenje? Takođe, problem predstavlja to ako je linearni
program izvodljiv, u prvoj iteraciji Simplex procedure, osnovno rešenje ne mora uvek biti
dopustivo. U Simplex procedutri smo predpostavili da imamo proceduru Initialize-Simplex koja
utvrđuje da li je linearni program izvodljiv I ako jeste vraca slack formu čije je osnovno rešenje
dopustivo. Sada ćemo detaljno opisati ovu proceduru. Posmatrajmo sledeci primer:
Neka imamo linearni program u standardnoj formi:
Maksimizirati
U odnosu na ograničenja:
Ako ga konvertujemo u slack formu dobijamo:
, 0
35
Osnovno rešenje ove slack forme je ( ) sto je u koliziji sa prvim ograničenjem u
početnom linearnom programu, pa osnovno rešenje nije dopustivo. Kako bi rešili ovaj problem
formiramo pomoćni linearni program. U ovom linearnom programu, naći ćemo slack formu u
kojoj je osnovno rešenje dopustivo. Pored ovoga, rešenje ovog linearnog programa će
predstavljati pokazatelj da li je inicijalni linearni program izvodljiv ili ne. Ako je inicijalni
linearni program izvodljiv, pomoćni linearni program će obezbediti dopustivo resenje sa kojim
moţemo inicijalizovati proceduru Simplex.
Lema:
Neka je linearni program u standardnoj formi. Neka je nova promenljiva I neka je
pomoćni linearni program koji ima promenljivih:
maksimizirati
u odnosu na ograničenja
∑
Tada je izvodljiv akko je dobit optimalnog rešenja za program jednaka 0.
Dokaz:
(
Neka linearni program ima dopustivo rešenje . Tada je rešenje
, odnosno kombinovano sa dopustivim rešenjem , dopustivo rešenje za
koje ostvaruje dobit 0.
36
Posto je u jedno od ograničenja ,a funkcija dobiti je da se minimizira vrednost
sledi da je rešenje (0), odnosno optimalno rešenje za linearni program koje
ostvaruje dobit 0.
Predpostavimo da optimalno rešenje za ostvaruje dobit 0. Tada je I preostale
vrednosti za ostale promenljive u zadovoljvaju ogranienja u linearnom programu .
U nastavku dajemo procedure za inicijalizaciju slack forme čije je osnovno rešenje dopustivo.
37
Teorema:
Za svaki linearni program koji je u standardnoj formi vaţi da on moţe biti u jednom od
sledećih tri stanja:
1. Linearni program ima optimalno rešenje koje ostvaruje konačnu dobit.
2. Linearni program je neizvodljiv.
3. Linearni program je neograničen.
Ako je neograničen, procedura Simplex vracća “unbounded”. Ako je neizvodljiv, procedura
Simplex vraća “infeasible”. U suprotnom procedura Simplex vraća optimalno rešenje koje
ostvaruje konačnu dobit.
Vreme izvršavanje i neki napredniji algoritmi
Bitno je napomenuti je worst-case vreme izvršavanja simplex algoritma, eksponencijalno
vreme. Međutim, simplex algoritam u praksi pokazuje dobre rezultate. The ellipsoid algorithm
(1979 L. G. Khachian) je prvi algoritma čije je vreme izvršavanja polinomno. U praksi simplex
algoritam daje bolje rezultate od elipsoidnog algoritma. Interior-point algorithm (John von
Neumann) – suprotno od simplex algoritma, kreće se po unutrašnjosti simplex-a I nalazi
optimalno rešenje. Poslednji napredak koji je napravljen u optimizaciji linearnog programiranje
je Randomized simplex algorithm koji radi u polinomnom vremenu.
38
Literatura
Cormen T.H., Leiserson C.E., Rivest R.L., Stein C. Introduction to Algorithms (treće izdanje, MIT, 2009)
Sanjoy Dasgupta, Christos Papadimitriou, Umesh Vazirani Algorithms (McGraw-Hill, New York, 2008)
Michael Sipser Introduction to the Theory of Computation (treće izdanje Cengage Learning, Boston,
2009)