Linearno programiranje

39
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

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)