Predavanje 20

FlipView[{Text[Style[" Branko Urošević, imqfbrankourosevic@gmail.com ",20,"Text",Italic]],Text[Style[" Faculty of Economics, University of Belgrade, NBS and CESIfo Munich",20,"Text", Italic]]}]

Problemi optimizacije u WL

1. Optimizacija funkcije sa jednom promenljivom

Maksimizacija profita

Problemi donošenja optimalnih odluka bitni su u svim aspektima života: od nalaženja najboljeg životnog parnera do pronalaženja posla koji nam najviše odgovara ili kupovine najboljih kola u odnosu na budžet sa kojim raspolažemo. Optimizacija je samom središtu svih ekonomskih analiza. Pođimo, stoga, od jednog prostog problema u ekonomiji. 

Pretpostavimo da firma proizvodi neki proizvod koji se prodaje po 3 evra po komadu. Prihod od prodaje q komada je jednak 3 q. Radi jednostavnosti, pretpostavimo da nas proizvodnja q komada košta (q^2). 

Nađimo optimalni nivo proizvodnje ukoliko je cilj da maksimiziramo profit (prihod minus trošak).

profit=3 q -(q^2);

Najbolje je da prvo grafički predstavimo kako izgleda funkcija profita kao funkcija q.

Plot[profit,{q,0,4},PlotTheme->"Detailed"]

Sa grafika vidimo da zaista postoji optimalni nivo proizvodnje i da je on između 1 i 2.

Uslovi prvog i drugog reda za maksimizaciju profita

Kada god se optimum nalazi u unutrašnjosti oblasti definisanosti problema, tačke optimuma moraju da zadovoljavaju uslov prvog reda. Naime, rešenje mora biti u tački ili tačkama u kojima je prvi izvod funkcije jednak 0. U slučaju funkcije jedne promenljive uslov prvog reda dat je prvim izvodom:

D[profit,{q,1}]==0

Solve[3-2 q==0,{q}]

Uslov prvog reda kaže da marginalni prihod (prvi član) mora biti jednak marginalnom trošku (drugi član). Dakle, prvi izvod je jednak nuli u tački 1.5. Sa grafika vidimo da se u toj tački nalazi maksimum.

Formalno, to ustanovljavamo preko uslova drugog reda. Naime, nađimo drugi izvod:

D[profit,{q,2}]

Pošto je drugi izvod negativan svuda, funkcija profit je globalno konkavna, pa nam uslov prvog reda daje globalni maksimum. To je najbolji proizvodni plan koji je moguće napraviti sa tehnologijom koju posedujemo.

Vidimo da nije dobro ni povećati ni smanjiti proizvodnju u odnosu na nivo na kome je marginalni profit jednak nuli.

Šta se događa sa optimalnim proizvodnim planom ako smanjimo troškove proizvodnje

Pretpostavimo da uspemo da smanjimo nekako marginalni trošak tako da je funkcija profita sada:

profit1=3 q -((q^2)/2);

U tom slučaju istu količinu robe možemo proizvesti jeftinije.

Plot[{profit,profit1},{q,0,4},PlotTheme->"Detailed"]

Vidimo da je sada optimalno proizvesti 3 jedinice umesto 1.5. Naime:

D[profit1,{q,1}]==0

Solve[3-q==0,{q}]

Pošto je drugi izvod funkcije profit1 svuda negativan, funkcija profita je globalno konkavna, pa uslov prvog reda obezbeđuje maksimum.

D[profit1,{q,2}]==0

Nalaženje maksimuma profita korišćenjem funkcije Maximize

U WL, za nalaženje globalnog (kada je to moguće) i lokalnog (kada to nije moguće) maksimuma koristimo Maximize i NMaximize. Sintaksa je Maximize[{ ciljna funkcija, dodatni uslovi}, {nezavisne promenljive}]. Potpuno isto rade funkcije koje traže minimum funkcije, samo što se umesto Maximize koristi Minimize, umesto NMaximize koristi NMinimize itd.

Kao rezultat korišćenja tih funkcija dobijamo složenu listu. Prvi element je vrednost funkcije u maksimumu (u ovom slučaju to je maksimalni profit), a posle ide lista argumenata koji vode ka tom maksimumu.

Maximize[{profit},{q}]

Maximize[{profit1},{q}]

Vidimo da bismo u drugom slučaju ne samo više proizvodili nego i ostvarivali duplo veći profit. Ukoliko imamo samo ciljnu funkciju bez dodatnih uslova problem, kao i ukoliko imamo samo jednu nezavisnu promenljivu, problem možemo uprošćeno napisati i ovako:

Maximize[profit,q]

Maximize[profit1,q]

Nalaženje optimuma komplikovanije funkcije jedne promenljive

Razmotrimo funkciju potencijala datu sledećom jednačinom:

potencijal=(x^2)-((x^4)/3);

Plot[potencijal,{x,-2,2},PlotTheme->"Detailed"]

Vidimo da ova funkcija ima maksimum, i to ne jedan nego dva. Takođe, ima i minimum, ali samo lokalni. Iz uslova prvog reda imamo da je:

D[potencijal,x]==0

resenje1=Solve[2 x-((4 (x^3))/3)==0,{x}]

Uslovi prvog reda imaju 3 rešenja. Sa slike vidimo šta je šta. Prvo rešenje odgovara lokalnom minimumu, dok ostala dva odgovaraju globalnim maksimumima. Kako da to ustanovimo egzaktno? Nađimo uslove 2. reda.

D[potencijal,{x,2}]

Jasno je da ova funkcija nije uvek pozitivna ni uvek negativna. Stoga ciljna funkcija nije globalno konkavna ili konkveksna. Ali jeste lokalno konveksna u okolini minimuma i lokalno konkavna u okolini maksimuma. To je dovoljno za postojanje lokalnih ekstrema.

Nastavak

Naime, da bismo ustanovili da li neka tačka ekstrema odgovara lokalnom minimum (maksimumu) potrebno je da proverimo vrednost drugog izvoda u toj tački. Ukoliko je drugi izvod pozitivan, u pitanju je lokalni minimum a ukoliko je negativan, u pitanju je lokalni maksimum.

D[potencijal,{x,2}]/.resenje1[[1]]

D[potencijal,{x,2}]/.resenje1[[2]]

D[potencijal,{x,2}]/.resenje1[[3]]

Stoga je prva tačka minimum, a ostale dve kritične tačke su maksimumi.

U ovoj tabeli imate sumirane osnovne funkcije koje koristimo za tražеnje ektremnih vrednosti

Grid[{{Style["Metod",Bold],Style["Šta radi",Bold],Style["Metod",Bold],Style["Šta radi",Bold]},{"Maximize",Style["Traži egzakni 
globalni maksimum",20],"Minimize",Style["Traži egzakni 
globalni minimum",20]},{"NMaximize",Style["Traži numerički 
globalni maksimum",20],"NMinimize",Style["Traži numerički 
globalni minimum",20]},{"FindMaximum",Style["Traži numerički 
lokalni maksimum",20],"FindMinimum",Style["Traži numerički 
lokalni minimum",20]}},Frame->All]

Funkcija koja pokušava da nađe globalni maksimum numerički: NMaximize

Šta dobijemo ako probamo da iskoristimo Maximize? Uhvatio je jedno od rešenja ali ne i oba.

Maximize[potencijal,x]

Kada funkcija koju optimizujemo nije globalno konkavna, nema garancije da ćemo uhvatiti sva moguća rešenja pomoću Maximize. Ali, možemo da probamo i neke druge stvari. Funkcija NMaximize pokušava da nađe globalni maksimum numeričkim metodama:

NMaximize[potencijal,x]

Prilikom numeričke optimizacije možemo da vidimo svaki optimizacioni korak koristeći StepMonitor opciju:

NMaximize[potencijal,x,StepMonitor:>Print["Naredni korak x = ",x]]

Ovog puta dobili smo ono drugo rešenje. To pokazuje da Maximize (kao i NMaximize) ne daju obavezno sva moguća rešenja ukoliko rešenje problema optimizacije nije jednoznačno. 

Ako unapred odustanemo od potrage za globalnim rešenjem optimizacije i fokusiramo se na lokalne ekstreme, možemo da konrolišemo kuda će potraga za tačkama ekstrema konvergirati. Za to možemo koristiti FindMaximum koji omogućava da zadamo početnu tačku. 

FindMinimum i FindMaximum su po karakteru veoma slične FindRoot za numeričko rešenje algebarskih jednačina, samo što umesto rešenja jednačine traže tačke maksimuma odnosno minimuma. Pošto moramo da zadamo tačku iz koje počinje potraga, to omogućava da iskontrolišemo kako da uhvatimo sve tačke ekstrema ukoliko znamo otprilike gde da ih tražimo.

Potraga za lokalnim maksimumima pomoću FindMaximum

Ovako nalazimo prvi lokalni maksimum:

FindMaximum[potencijal,{x,0.5}]

Možemo da vidimo kako ova funkcija traži rešenje koristeći StepMonitor opciju. Evo kako to radi:

FindMaximum[potencijal,{x,0.5},StepMonitor:>Print["Naredni korak x = ",x]]

Na sličan način možemo naći i drugi maksimum:

FindMaximum[potencijal,{x,-0.5}]

ili, ako želimo da vidimo korake prilikom optimizacije

FindMaximum[potencijal,{x,-0.5},StepMonitor:>Print["Naredni korak x = ",x]]

Potražimo sada minimum ove funkcije, a naime

FindMinimum[potencijal,{x,0.3}]

ili, korak po korak

FindMinimum[potencijal,{x,0.3},StepMonitor:>Print["Naredni korak x = ",x]]

2. Optimizacija funkcije sa više promenljivih bez dodatnih uslova

Primer optimizacije profita

Ukoliko bismo samo znali da maksimizujemo ili minimizujemo funkcije sa jednom promeljivom, ne bismo daleko dogurali, bar što se tiče primene u ekonomiji i finansijama. Razmotrimo sada slučaj optimizacije profita ukoliko firma proizvodi dva proizvoda. Prvi se prodaje na tržištu po 3 evra a drugi po 5 evra po prodatom komadu. Evo i funkcije profita:

profit=3 q1 +5 q2 -(1/2)((q1^2)+2 (q2^2));

Plot3D[profit,{q1,2.4,3.7},{q2,1.9,3.1}]

Vidimo da je funkcija profita, bar vizualno, globalno konkavna, te stoga mora da postoji globalni maksimum. Prvo potražimo uslove prvog reda. To su uslovi da su prvi izvodi po svim nezavisnim promenljivim istovremeno jednaki nuli. Naime:

D[profit,{{q1,q2},1}]==0

Pošto je profitna funkcija kvadratna, uslovi prvog reda daju sistem linearnih jednačina. Naravno, mi znamo kako da ga rešimo:

Solve[{3-q1,5-2 q2}==0,{q1,q2}]

Hesijan i uslovi drugog reda

Proverimo sada uslove drugog reda. Moramo da prvo izračunamo druge izvode po svim promenljivim. Tako dobijamo matricu drugih izvoda ili hesijan.

D[profit,{{q1,q2},2}]

Ova matrica je negativno definisana. To vidimo iz toga što je dijagonalna sa negativnim vrednostima na dijagonali. Stoga su obe karakteristične vrednosti negativne. A možemo  negativnu definisanost i da proverimo direktno:

NegativeDefiniteMatrixQ[D[profit,{{q1,q2},2}]]

Pošto je matrica drugih izvoda svuda negativno definitna, postoji globalni maksimum profita koji odgovara tački koja zadovoljava uslove prvog reda.

Maksimum možemo da nađemo i mnogo brže koristeći funkciju Maximize:

Maximize[profit,{q1,q2}]

Još jedan primer profitne optimizacije

Pretpostavimo sada da je funkcija troška nešto malo komplikovanija te da imamo sledeći izraz za funkciju profita:

profit1=3 q1 +5 q2 -(1/2)((q1^2)+2 (q2^2)-((q1 q2)/3));

Uslovi prvog reda bi bili

D[profit1,{{q1,q2},1}]==0

Solve[{3+(1/2) (-2 q1+(q2/3)),5+(1/2) ((q1/3)-4 q2)}==0,{q1,q2}]

Proverimo sada uslove drugog reda. Dobijamo ih iz matrice drugih izvoda:

D[profit1,{{q1,q2},2}]

Matrica drugih izvoda nije dijagonalna. Nađimo karakteristične vrednosti i proverimo njihov znak.

%//Eigenvalues

Pošto su oba broja negativna, matrica je negativno definisana, pa je profitna funkcija svuda konkavna. Tačka ekstrema koja zadovoljava uslov prvog reda je, stoga, globalni maksimum. To možemo proveriti i jednostavnije ovako:

Maximize[profit1,{q1,q2}]

Analizirati tačke ekstrema funkcije x y+x -2 y

Nije teško pronaći uslove prvog reda za ovu funkciju:

D[x y +x -2y,{{x,y},1}]==0

Solve[{1+y,-2+x}==0,{x,y}]

Međutim, kakva je ovo funkcija?

Plot3D[x-2 y+x y,{x,-4.6,4.6},{y,-3.`,3.`}]

Ona nije ni konveksna ni konkavna. Da bismo to ustanovili formalno, nađimo uslove drugog reda:

D[x y +x -2y,{{x,y},2}]

Eigenvalues[%]

Matrica nije znakovno definisana, jer su karakteristične vrednost suprotnih znakova. Stoga je tačka ekstrema zapravo prevojna tačka. Ova funkcija nema kako globalni tako ni lokalni minimum niti maksimum.

3. Optimizacija funkcije više promenljivih sa dodatnim uslovima

Prethodno smo se bavili optimizacijom funkcije više promenljivih ukoliko nema dodatnih uslova na nezavisne promenljive po kojima se optimizuje. U ekonomskoj praksi retki su takvi problemi. Naime, najčešće postoje dodatna ograničenja na nezavisne promenljive.

Na primer, ukoliko se radi o maksimizaciji korisnosti potrošača, on je izložen nekom budžetskom ograničenju. Takođe, optimalna potrošnja, tipično, nikad nije negativna negativna.

Ukoliko radimo optimizaciju finansijskih portfolia, imamo pored budžetskih takođe i razna ograničenja koja nameće ili regulator, ili menadžment firme, ili pak klijenti. Primeri takvih ograničenja mogu biti da se investira samo u "zelene" kompanije a ne, na primer, u kompanije koje proizvode cigarete.

U ovod odeljku ćemo raditi, radi jednostavnosti, samo sa konveksnim ili konkavnim ciljnim funkcijama kao i sa dodatnim uslovima koja određuju konveksan skup potencijalnih rešenja. U tom slučaju nije neophodno proveriti uslove drugog reda. Takvi problemi se redovno javljaju u ekonomiji.

Ukoliko vas zanimaju uslovi drugog reda pogledajte, recimo, glave 4 i 5 iz udžbenika Operaciona istraživanja i kvantitativne metode investicija).

Maksimizacija funkcije korisnosti uz budžetsko ograničenje zadato jednakošću

Pretpostavimo da želimo da maksimizujemo svoju funkciju korisnosti. Treba da izaberemo optimalnu potrošačku korpu, odnosno vektor potrošnje prvog i drugog dobra {c1,c2}. Funkcija korisnosti je data sledećim izrazom:

u=(Sqrt[c1])+(Sqrt[c2]);

Nije teško videti da je ova ciljna funkcija konkavna. Naime, matrica drugih izvoda:

D[u,{{c1,c2},2}]

je negativno definitna.

Pretpostavimo da je jedna jedinica prvog dobra dva puta skuplja od jedinice drugog dobra. Ukupno imamo 100 evra. Kako treba da optimalno trošimo?

Na osnovu prethodnog, budžetsko ograničenje je dato izrazom:

2 c1+c2==100

Metod zamene promeljivih

Jedan način da rešimo problem jeste metod zamene promenljivih. Ovaj metod ima smisla koristiti samo ukoliko tim metodom možemo da dobijemo problem koji, efektivno, postaje problem optimizacije bez dodatnih uslova.

U slučaju prethodnog primera, iz budžetskog ograničenja možemo da isključimo, recimo, c2 i da to ubacimo u izraz za u.

u/.{c2->100-2 c1}

Sada možemo da rešimo problem kao i ranije. Na primer, možemo da koristimo Maximize:

Maximize[(Sqrt[100-2 c1])+(Sqrt[c1]),c1]

U tom slučaju je optimalno potrošnja je data vektorom:

{c1,c2}/.c2->100-2 c1/.{c1->(50/3)}

Metod Lagrange-a

Metod Lagrange je opštiji metod od metoda zamene promenljivih. U tabeli navodimo osnovne korake prilikom rada sa ovim metodom.

Grid[{{Style["Koraci",Bold],},{"Korak 1",Style["Uslove predstaviti 
u obliku (Subscript[g, j])==0, j=1,...,J",20]},{"Korak 2",Style["Svakom uslovu odgovara 
Lagrange množitelj λ",20]},{"Korak 3",Style["Formirati funkciju Lagrange
L = f[x]+(Subscript[λ, 1]) (Subscript[g, 1])[x]+...+(Subscript[λ, J]) (Subscript[g, J])[x]",20]},{"Korak 4",Style["Naći uslove prvog reda
za L po x i λ",20]},{"Korak 5",Style["Rešiti sistem jednačina
po x i λ",20]},{"Korak 6",Style["Proveriti linearnu nezavisnost 
(Subscript[g, j]) u kritičnim tačkama",20]},{"Korak 7",Style["Proveriti uslove drugog reda
kada je to potrebno",20]}},Frame-> All]

Ovako formulisan, metod radi u slučaju kada imamo jedan ili više dodatni uslov gde su svi uslovi formulisani pomoću jednakosti. Ovde ćemo na primeru izložiti korake 1-6 pošto smo rekli da će primeri sa kojima radimo automatski zadovoljavati uslove drugog reda.

Kako rešiti prethodni primer koristeći metod Lagrange-a

Kako na našem primeru radi metod Lagrange? U ovom slučaju imamo samo jedan uslov. Formulišimo  funkciju Lagrange:

L=u+λ (2 c1 +c2-100)

i nađimo uslove prvog reda te funkcije po c1, c2, ali i po λ.

D[L,{{c1,c2,λ},1}]==0

Solve[{(1/(2 (Sqrt[c1])))+2 λ,(1/(2 (Sqrt[c2])))+λ,-100+2 c1+c2}==0,{c1,c2,λ}]

Dobijamo isti rezultat kao i u slučaju zamene promenljivih. Da bismo proverili da je uslov linearno nezavisan, potrebno je pokazati da u kritičnoj tački jakobijan ima rang jednak broju uslova, to jest jedinici.

Jakobijan je, po definiciji, matrica čiji je svaki red jednak gradijentu funkcija uslova. U našem slučaju taj gradijent je:

D[-100+2 c1+c2,{{c1,c2},1}]

Pošto je rang ove matrice jednak 1, odnosno jednak je broju uslova, onda je taj uslov za korišćenje metoda Lagrage-a zadovoljen.

Za to da postoji globalni maksimum dovoljno je da uslovi čine konveksan skup (što je u ovom slučaju očigledno jer je uslov prava linija što vidimo dole), kao i da je funkcija koju maksimizujemo konkavna. Onda nam uslovi prvog reda, odnosno gradijent po svim promenljivih x i λ daje tačku globalnog maksimuma. Ukoliko je ciljna funkcija konveksna a sve je ostalo isto, onda dobijamo globalni minimum.

Korišćenje funkcije za optimizaciju

Treći metod je superioran po jednostavnosti u odnosu na ostala dva metoda. Primetimo da je prvi argument lista koja se sastoji od ciljne funkcije i jednog ili više uslova (tim redom!). Druga lista je lista argumenata po kojima se optimizuje.

uopt1=Maximize[{u,2 c1+c2==100},{c1,c2}]

Point[{c1,c2}]/.uopt1[[2]]

Na istom grafiku možemo da predstavimo kako krivu indiferencije (geometrijsko mesto tačaka koje odgovara optimalnom nivou korisnosti, to jest  u==5 (Sqrt[6])) kao i budžetstko ograničenje:

Show[{ContourPlot[{u==uopt1[[1]],2c1+c2==100},{c1,0,100},{c2,0,100}],Graphics[{Red,PointSize[0.015],Point[{(50/3),(200/3)}]}]}]

Kao što je poznato iz teorije cena, tačka tangete krive indiferencije na liniju budžetskog ograničenja jeste tačka optimalne potrošnje. Pokažimo sada kako bismo našli optimum koristeći FindMaximum.

FindMaximum[{u,2 c1+c2==100},{{c1,10.},{c2,30.}}]

Pošto sad imamo numeričku optimizaciju, možemo da koristimo opet StepMonitor

FindMaximum[{u,2 c1+c2==100},{{c1,10.},{c2,30.}},StepMonitor:>Print["Naredni {c1, c2} = ",{c1,c2}]]

Maksimizacija korisnosti kada imamo 3 potrošna dobra

Pretpostavimo da imamo 3 dobra. Treće dobro je 3 puta skuplje od prvog, a drugo 2 puta skuplje od 1. Imamo ukupno 100 evra. Kako optimalno raspodeliti dobra ukoliko je funkcija korisnosti data izrazom:

u=2 (Sqrt[c1])+(Sqrt[c2])+(Sqrt[c3]);

Pošto je u pitanju suma konkavnih funkcija, u je konkavna. To lako proverimo:

D[u,{{c1,c2,c3},2}]

Budžetsko ograničenje je ovog puta:

c1+2 c2+3 c3==100

Razmotrimo dva načina za optimizaciju, Lagrange metod i Maximize. Prvo formulišemo funkciju Lagrange.

L=u+λ (c1+2 c2+3 c3-100)

Uslovi prvog reda su, stoga

D[L,{{c1,c2,c3,λ},1}]==0

Solve[{(1/(Sqrt[c1]))+λ,(1/(2 (Sqrt[c2])))+2 λ,(1/(2 (Sqrt[c3])))+3 λ,-100+c1+2 c2+3 c3}==0,{c1,c2,c3,λ}]

Sada možemo da rešimo isti problem koristeći Maximize

Maximize[{u,c1+2 c2+3 c3==100},{c1,c2,c3}]

Uslovi zadati nejednakošću

U ekonomiji  je čest slučaj da su uslovi zadati ne kao jednakosti nego preko nejednakosti. Na primer, budžetsko ograničenje može biti takvo da ne smemo da potrošimo više od 100 evra, ali u principu možemo manje. 

U tom slučaju, prethodni primer postaje maksimizacija uz dodatni uslov:

c1+2 c2+3 c3<=100

Ekvivalent Lagrange metoda kada radimo sa nejednakostima naziva se Kuhn-Tucker metod (pogledajte, ako vas zanima, g. 5 udžbenika iz OI).

Mi se ovde fokusiramo na rešavanje problema korišćenjem funkcije Maximize:

Maximize[{u,c1+2 c2+3 c3<=100},{c1,c2,c3}]

Pošto potrošač želi da troši maksimalno što može, to jest da ne ostavi ništa nepotrošeno, nikad mu se ne bi isplatilo da ne potroši svih 100 evra.

To znači da ukoliko mu dozvolimo da ne potroši sve (u tom slučaju imali bismo <100) on to nikad ne bi uradio. Vidimo da se problemi optimizacije sa uslovima zadatim nejednakostima lako rešavaju pomoću Maximize i Minimize.

Nastavak

Pretpostavimo da pored uslova koje tu imamo, postoji i ograničenje koje kaže da moramo da kupimo najmanje onoliko prvog dobra koliko i drugog i trećeg zajedno. U tom slučaju:

Maximize[{u,c1+2 c2+3 c3<=100,c1≥ c2+c3},{c1,c2,c3}]

Vidimo da ni u ovom slučaju taj dodatni uslov ništa ne menja. Drugim rečima, kada imamo uslove date nejednakostima one nekada ne utiču na rezulat optimizacije. U tom slučaju na engleskom se kaže da uslovi “are not binding”.

Najzad, možemo da uvedemo i uslove da potrošnja ni jednog dobra ne možemo da bude negativna. U tom slučaju

nenegativna=And@@Thread[{c1,c2,c3}≥ 0]

Maximize[{u,c1+2 c2+3 c3<=100,c1≥ c2+c3,nenegativna},{c1,c2,c3}]

Problem optimizacije kada neko od ograničenja zavisi od parametra

Razmotrimo sada problem koji će se pojaviti u opštijoj formi kasnije kao problem optimizacije finansijskog portfolia. Naime, pretpostavimo da želimo da minimiziramo kvadratnu formu.

f=(x^2)+(y^2)+(z^2);

Ovu funkciju možemo da je interpretiramo kao varijansu portfolia, gde su x, y, i z ponderi odnosno udeli novca uloženi u tri hartije od vrednosti (na primer, akcije).

h=x+2y+3z-μ; g = x+y+z-1;

Imamo dva dodatna uslova (za oba se pretpostavlja da su jednaki nuli). Drugi uslov je obično budžetsko ograničenje koje kaže da je suma svih pondera u portfoliu jednaka 1. To znači da smo negde stavili sav svoj novac i da ništa nismo ostavili neraspoređeno.

Da bismo interpretirali prvi uslov, pretpostavimo da prva akcija ima očekivani prinos jednak 1, druga ima očekivani prinos 2 a treća očekivani prinos jednak 3. Onda prvi uslov kaže da investitor zahteva prinos μ za svoj portfolio. Upravo je zahtevani prinos investitora parametar od koga zavisi problem, odnosno od koga će zavisiti i optimalno rešenje problema.

Problem optimizacije se sastoji u tome da za svaku vrednost parametra μ (razumno je pretpostaviti da je μ>0), nađemo one vrednosti pondera {x, y, z} koji sa jedne strane minimiziraju ciljnu funkciju f, a sa druge zadovoljavaju uslove h==g==0.

Rešenje problema optimizacije

Za početak fiksirajmo vrednost parametra ,μ=2. U tom slučaju investitor zahteva očekivani prinos od 2.

h = x+2y+3z-2;

Kako će onda izgledati funkcija Lagrange? Potrebno nam je da uvedemo 2 Lagrange množitelja, pošto imamo dva dodatna uslova.

L=f+λ1 h+λ2 g;

Vektor po kome ćemo diferencirati da nađemo uslove prvog reda je sledeći:

v={x,y,z,λ1,λ2};D[L,{v,1}]==0

Ukoliko rešimo uslove prvog reda po ovih pet promenljivih:

sol10=Solve[D[L,{v,1}]==0,v]

Vidimo da bi, ukoliko zahtevamo da očekivani prinos bude jednak 2, varijansu minimizirati ukoliko investiramo podjednako (po 1/3) u sve tri akcije. Takav portfolio je potpuno diverzifikovan.

Jakobijan za funkcije uslova ima rang 2, odnosno uslovi su linearno nezavisni. To proveravamo ovako:

D[{h,g},{{x,y,z},1}]//MatrixRank

Isto rešenje ćemo lako dobiti i ako koristimo Minimize funkciju:

Minimize[{(x^2)+(y^2)+(z^2),h==0,g==0},{x,y,z}]

Optimizacija kada jedan od uslova zavisi od parametra

Primetimo da bi rizik (varijansa) bila veća ukoliko bismo sve pare stavili u jednu hartiju (recimo, x->1, y->0,z->0). U tom slučaju, imali bismo da bi vrednost ciljne funkcije bio jednak 1, a ne 1/3.

Uvedimo sada parametar μ u uslovu h. U tom slučaju imali bismo očekivani prinos (prvi uslov) jednak μ umesto 2. To povlači za sobom da će rešenja problema optimizacije sada biti beskonačno mnogo - za svaku vrednost parametra μ po jedno!

h = x+2y+3z-μ; g = x+y+z-1;

L=f+λ1 h+λ2 g;

sol11=Solve[D[L,{v,1}]==0,v]

Vidimo da optimalni portfolio (optimalan izbor x,y, i z) zavisi od prinosa koji investitor očekuje, to jest od parametra μ. Razume se, ukoliko stavimo da je μ->2, treba da dobijemo isto rešenje kao malopre:

sol11[[1,1;;3]]/.{μ-> 2}

Efikasna granica: skup rešenja problema optimizacije za različite vrednosti parametra

Kako možemo da predstavimo grafički rešenje za proizvoljni parametar μ? Prvo ćemo izračunati za svaku μ čemu je jednaka optimalna vrednost ciljne funkcije.

varijansa=(x^2)+(y^2)+(z^2)/.sol11[[1]]

Ovo možemo dalje uprostiti na sledeći način:

varijansa=Simplify[varijansa]

Vidimo da je optimalna vrednost ciljne funkcije kvadratna funkcija parametra μ. Predstavimo seriju optimalnih rešenja pomoću ParametricPlot gde je na y osi parametar μ, a na x osi kvadratni koren od varijanse (to je standardna devijacija koju na grafiku označavamo sa sigma). Ova kriva se zove efikasna granica i govori investitiorima kako mogu optimalno da investiraju u zavisnosti od toga koliki rizik ili očekivani prinos žele.

ParametricPlot[{(Sqrt[varijansa]),μ},{μ,1,3},AspectRatio->1/GoldenRatio,AxesOrigin->{0.4,0},AxesLabel->{"sigma","μ"},PlotLabel->Style["Efikasna granica",14,Blue]]

Konstruisanje efikasne granice i tabele optimalnih pondera pomoću Minimize

Stvari možemo i da pojednostavimo ukoliko koristimo Maximize umesto Lagrange metoda. U tom slučaju

optimizacija=Minimize[{(x^2)+(y^2)+(z^2),h==0,g==0},{x,y,z}]

Efikasna granica dobija se, onda, već u drugom koraku:

ParametricPlot[{(Sqrt[optimizacija[[1]]]),μ},{μ,1,3},AspectRatio->1/GoldenRatio,AxesOrigin->{0.4,0},AxesLabel->{"sigma","μ"},PlotLabel->Style["Efikasna granica",14,Blue]]

Ukoiko nas zanimaju ponderi koji odgovaraju optimalnom rešenju za različite vrednosti μ, možemo da napravimo, recimo, ovakav Manipulate. U prvom redu grida su nazivi promenljivih, dok su u drugom redu same promenljive. Ovde smo x, y, i z zamenili sa optimalnim ponderima .

optimizacija[[2]]

{μ,x,y,z,(Sqrt[optimizacija[[1]]])}/.optimizacija[[2]]

Manipulate[Evaluate[Grid[{{"μ","x","y","z","σ"},{μ,x,y,z,(Sqrt[optimizacija[[1]]])}/.optimizacija[[2]]},Frame->All]],{μ,1,3}]

4. Celobrojno (integer) i mixed-integer programiranje

Celobrojna optimizacija

Pretpostavimo da treba da izaberemo neke projekte i da za to imamo fiksan budzet za to od 1000 evra. Projekte možemo da uradimo ili u celini ili nikako, to jest broj projekata nekog tipa može biti samo 1 ili 0.

U tom slučaju problem se naziva celobrojno ili tačnije, binarno programiranje (pošto optimalna odluka može biti samo ili 0 ili 1). Celobrojno programiranje u širem smislu bio bi problem u kome optimalna odluka može imati samo vrednosti iz skupa celih brojeva.

Pretpostavimo da svaki projekat nosi odredjeni trošak i da nam daje određene beneficije. Problem izbora projekata u koje treba investirati naziva se problem kapitalnog budžetiranja. Pretpostavimo da imamo mogućnost da izaberemo neke od 8 projekata sa sledećim karakteristikama:

beneficije= {950, 780, 440, 215, 630, 490, 560, 600};

troskovi= {400, 350, 200,100,300,250,300,350};

Definišimo vektor varijabli po kojima odlucujemo (decision variables) zajedničkim imenom X:

X=x/@Range[8]

Želimo da definišemo da su variable po kojima odlucujemo uvek između 0 i 1. Kako to mozemo da uradimo?

Thread[0≤  X≤1]

Nastavak primera sa celobrojnim programiranjem

Svaki element iz gornje liste mora biti istovremeno zadovoljen. Stoga:

bds=Apply[And,Thread[0≤ X≤ 1],{0}]

Ovo je može skraćemo predstaviti i kao

And@@Thread[0≤  X≤1]

Prvo rešimo problem optimizacije ukoliko ne pretpostavljamo da projekti moraju da se realizuju u celini. To je običan problem linearnog programiranja:

Maximize[{beneficije.X,troskovi.X≤1000, bds},X ]//N

Vidimo da bismo neke projekte optimalno realizovali samo delimično. Naravno, u praksi je najčešće nemoguće ostvariti benefite od polovično urađenog projekta.

Stoga, sada pretpostavimo da ćemo ili uraditi projekat sasvim ili nećemo uošte. U tom slučaju svi elementi X moraju da budu ili 0 ili 1. To lako možemo da postignemo zahtevajući da su sve varijable u X celobrojne:

Maximize[{beneficije.X,troskovi.X≤1000, bds, X∈Integers},X]

Vidimo da bismo u tom slučaju preduzeli projekte 1, 3, 4 i 5. Projekat 2 koji bismo (u slucaju necelih projekata) u celini preduzeli više nije optimalan! Takođe, vidimo da dodatni uslov celobrojnosti smanjuje ukupne ostvarive beneficije.

Problem mešovitog (mixed-integer) programiranja

Razmotrimo sada sledeći problem optimizacije. Ovde promenljiva x moze uzeti bilo koje nenegativne realne vrednosti, dok je y ograničena samo na negativne cele brojeve (t.j. prirodne brojeve).

NMaximize[{3 x + 2 y,x+y≤ 6,5 x+2 y ≤ 20,x≥0,y≥0,x∈Reals, y∈Integers},{x,y}]

Može se pokazati da je egzaktni globalni optimum problema mešovitog programiranja

{72/5,x-> 14/5,y-> 3}//N

Drugim rečima, NMaximize je konvergirao ka tačnom rešenju. Uporedimo ovaj rezultat sa dva sledeća slična problema. Prvi slučaj je celobrojno programiranje:

NMaximize[{3 x + 2 y,x+y≤ 6,5 x+2 y ≤ 20,x≥0,y≥0,x∈Integers, y∈Integers},{x,y}]

Drugi slučaj je obično linearno programiranje:

NMaximize[{3 x + 2 y,x+y≤ 6,5 x+2 y ≤ 20,x≥0,y≥0,x∈Reals, y∈Reals},{x,y}]

Da sumiramo: u WL možemo sa lakoćom da rešavamo probleme kako standardne tako i celobrojne i mešovite optimizacije

Welcome to the Machine

https://www.youtube.com/watch?v=lt-udg9zQSE