Bojan Kovačić i Tihana Strmečki, Tehničko
veleučilište, Zagreb
Problemi
razdiobe ulaganja općenito podrazumijevaju određivanje razdiobe određenoga
novčanog iznosa na određeni broj gospodarskih grana tako da ukupna očekivana neto-dobit
nastala tim ulaganjima bude maksimalna. U ovu kategoriju pripada i problem
minimizacije troškova proizvodnje: ako u jednakim vremenskim intervalima treba
proizvesti određenu količinu nekoga proizvoda i ako su poznati troškovi
proizvodnje u svakom pojedinom intervalu, valja napraviti raspored proizvodnje
tako da ukupni troškovi budu minimalni. Navedene probleme, njihovo matematičko
modeliranje i rješavanje metodama dinamičkoga programiranja opisujemo na nizu
primjera, pri čemu uz neke dajemo postupak rjeąavanja s pomoću računalnoga
programa WinQSB.[1]
Radi
boljega razumijevanja navedenih metoda, navodimo objašnjenja njihovih osnovnih pojmova.
Dinamičko programiranje
je metoda rješavanja složenih problema koji imaju određenu pravilnost u
strukturi. Riječ programiranje dolazi iz vremena prije nastanka
računalnog programiranja, a sinonim je riječi optimizacija. Koristi se u
slučajevima u kojima problem ima optimalnu podstrukturu −
mogućnost rastava na manje potprobleme iste vrste i neznatno razlikovanje
potproblema od problema s nivoa iznad (problemi koji se svode na znatno manji
potproblem rješavaju se drugim metodama). Rješavanju se može pristupati
tehnikama „od vrha prema dnu“ ili „od dna prema vrhu“, pri čemu se dobiveni
rezultati spremaju u tablicu za buduće korištenje, čime se izbjegava ponovno
računanje. Traženo rješenje dobije se rekurzivno iz optimalnih rješenja
potproblema, preko Bellmanove jednadžbe (Richard Bellman, 1953.). Ovakva metoda
memoizacije puno je brža od metode u
kojoj se svaki put nanovo rješava svaki manji korak, koji se ne javlja nužno
prvi put.
Kod problema koji imaju
računalnu primjenu, bitan je broj koraka implementacije danog zadatka. Manji
broj koraka omogućuje brže i učinkovitije rješavanje, zbog čega je ocjenjivanje
broja operacija važan kriterij za odabir načina rješavanja.
U primjerima ovoga
članka korišteni su matematički modeli s cjelobrojnim koeficijentima i
cjelobrojnim varijablama[2].
Zbog primijenjene metode dinamičkog programiranja nije moguće računanje s
realnim brojevima. Međutim, u praksi se kao mjerne jedinice varijabli u modelu
vrlo često pojavljuju desetine, stotine, tisuće i milijuni (novčanih jedinica
ili proizvoda), što može znatno usporiti postupak rješavanja. U takvim
slučajevima pogodno je redefinirati mjerne jedinice varijabli tako da se kao
nova mjerna jedinica uzme neki višekratnički oblik polazne mjerne jedinice
(npr. valutna jedinica 1000 kn umjesto valutne jedinice 1 kn). Osnovne
prednosti takvoga redefiniranja su smanjenje ukupnoga broja potrebnih računskih
operacija i povećavanje brzine izračuna optimalnoga rješenja, a osnovni nedostatak je smanjenje mogućnosti dobivanja
preciznijih informacija o optimalnom rješenju. Naime, zbog cjelobrojnosti svih
varijabli u matematičkom modelu, i optimalno rješenje je cjelobrojno, pa ćemo
tako npr. u problemu čije je „stvarno“ optimalno rješenje x*
= 1234.56 [kn] odabirom valutne jedinice 1000 kn umjesto valutne jedinice 1 kn
dobiti optimalno rješenje y* = 1 [000 kn], tj. y*
= 1000 [kn] koje se bitno razlikuje od rješenja x*. Zbog toga prigodom
eventualnoga redefiniranja mjernih jedinica treba odabrati što manje
višekratničke oblike polaznih mjernih jedinica kako se ne bi izgubilo na
preciznosti izračuna optimalnoga rješenja.
Spomenuti program WinQSB
već
pri odabiru numeričkih vrijednosti strogo većih od 500 pokazuje vlastita
ograničenja i zahtijeva bitno dulje trajanje izračuna, pa je u primjeni toga
programa redefiniranje mjernih jedinica pogodno u slučajevima u kojima je
relativna većina svih numeričkih vrijednosti strogo veća od 500.[3] U Primjerima
4. i 6. posebno ćemo analizirati utjecaj takvoga redefiniranja na preciznost
izračuna optimalnoga rješenja.
Radi
kraćeg i jednostavnijeg zapisa, označavamo:
[n]0
:= {0, 1, 2… n} = prvih n + 1 elemenata skupa N0
:= {0, 1, 2…};
[n]
:= {1, 2… n} = skup prvih n prirodnih brojeva.
Primjer 1. Uprava neke tvrtke želi uložiti
najviše 8 n.j.[4]
u tri odjela te tvrtke tako da iznos svakoga pojedinog uloga bude cjelobrojan
te da se u svaki odjel uloži najviše 5 n.j. (dakle, moguće je da se u neki
odjel ne uloži ništa, kao i da se ne uloži sav predviđeni kapital.) Kriterij za
razdiobu ulaganja su ostvarene neto-dobiti u pojedinim odjelima koje linearno
ovise o iznosima uloženoga kapitala. Uloži li se po 1 n.j. u svaki odjel, prvi
odjel ostvarit će neto-dobit od 4 n.j., drugi odjel neto-dobit od 5 n.j., a
treći odjel neto-dobit od 2 n.j. Formirajmo odgovarajući matematički model, pa
odredimo optimalan iznos ulaganja u svaki odjel tako da ukupna neto-dobit bude
maksimalna.
Matematički model: Za svaki \(i\in [3]\) označimo s xi
iznos ulaganja u i–ti odjel. Ukupna neto-dobit D(x1,
x2, x3) nastala tim ulaganjima iznosi
D(x1, x2,
x3) = 4 ×
x1 + 5 × x2
+ 2 × x3.
Stoga
je matematički model promatranoga problema:
maksimizirati D(x1, x2,
x3) = 4 ×
x1 + 5 × x2
+ 2 × x3
pod
uvjetima
x1 + x2
+ x3 ≤ 8
x1, x2,
x3 ∈ [5]0.
Analitičko rješenje: Traženi iznos
možemo izračunati koristeći se tzv. pohlepnim principom: uzmemo
najveći mogući kapital i uložimo najviše što možemo u profitabilniji od dvaju
promatranih odjela, ostatak potom u manje profitabilan odjel itd. U ovom
slučaju to znači da svih 8 n.j. ulažemo tako da maksimalno dopuštenih 5 n.j.
uložimo u drugi (profitabilniji) odjel, a ostatak od 8 – 5 = 3 n.j. uložimo u
prvi odjel, pa će ukupna optimalna neto-dobit iznositi 5 × 5 + 4 × 3 = 37 n.j.
Rješavamo
li problem dinamičkim programiranjem, osnovna je ideja podijeliti problem u tri
faze tako da se za svaki \(i\in [3]\), u i–toj fazi rješavanja promatra
ulaganje kapitala u odjele 1… i pri čemu se u izračunima u dotičnoj fazi
koriste optimalne vrijednosti dobivene u prethodnim fazama. Radi kraćega
zapisa, označimo C := [8]0.
Dakle, u
prvoj fazi određujemo optimalnu neto-dobit kad se kapital ulaže samo u prvi
odjel. Uz ulaganje 1 n.j. u prvi odjel ostvaruje se neto-dobit od 4 n.j., pa će
za ulog od x1 n.j. ostvarena neto-dobit iznositi 4 × x1
n.j. Primijetimo da, zbog uvjeta zadatka, ne znamo točan iznos ukupno uloženoga
kapitala, nego znamo jedino da je taj iznos neki prirodan broj najviše jednak 8
(ekvivalentno, ukupni uloženi kapital je neki element skupa C,
ali ne znamo koji je to točno element). Stoga za svaki \(c \in C\)
računamo vrijednosti realne funkcije \(f:C\to \mathbb{R}\)
definirane s:
\(f_1\)(c) = 4 × c.
Te
su vrijednosti, zapravo, optimalne neto-dobiti u slučaju kad ukupni
kapital od c n.j. ulažemo samo u prvi odjel. Odmah napomenimo da za
vrijednosti \(c \in C\) takve
da je c ≥ 5 stavljamo \(f_1\)(c)
= \(f_1\)(5) jer ukupno ulaganje u prvi odjel ne može biti strogo
veće od 5 n.j. Tako dobivamo sljedeću tablicu:
c
|
\(f_1\)(c)
|
\({x_1}^*\)
|
0
|
0
|
0
|
1
|
4
|
1
|
2
|
8
|
2
|
3
|
12
|
3
|
4
|
16
|
4
|
5
|
20
|
5
|
6
|
20
|
5
|
7
|
20
|
5
|
8
|
20
|
5
|
Tablica 1. Optimalne vrijednosti funkcije \(f_1\)
Vrijednost
\({x_1}^*\) označava optimalno ulaganje u
prvi odjel za koje se postiže pripadna optimalna vrijednost \(f_1\)(c).
U prvoj je fazi ovaj zapis praktički nepotreban, ali će nam poslužiti u
sljedećim dvjema fazama.
U
drugoj fazi razmatramo slučaj ulaganja kapitala samo u prvi i drugi
odjel. Pretpostavimo da ukupno ulažemo c n.j., pri čemu je \(c\in C\). Za
svaki \(i \in [2]\) označimo s xi
iznos koji ulažemo u i–ti odjel. Tada mora vrijediti jednakost
x1 + x2
= c,
iz
koje je
x1 = c – x2.
Neto-dobit
koju će ostvariti drugi odjel iznosi 5 × x2 n.j., a optimalna neto-dobit
koju će ostvariti prvi odjel, prema definiciji funkcije \(f_1\),
iznosi \(f_1\)(x1), tj. \(f_1\)(c
– x2) n.j. Stoga za svaki \(c \in C\)
računamo vrijednosti realne funkcije \(f_2:C\to \mathbb{R}\)
definirane s:
\[f_2(c)=
\max_{\begin{subarray}{l} 0
\leqslant {x_2} \leqslant \min \left\{ {c,5} \right\} \\ {x_2} \in \mathbb{Z}
\end{subarray}} \left[ {5 \cdot {x_2} + {f_1}(c - {x_2})} \right].\]
Te
su vrijednosti, zapravo, optimalne neto-dobiti ako ukupni kapital od c
n.j. uložimo samo u prvi i drugi odjel. Uvjeti pri kojima određujemo maksimum
posljedice su zahtjeva da iznos x2 mora biti cjelobrojan i ne
smije premašiti niti ukupni kapital od c n.j., niti 5. n.j. Radi
ilustracije postupka, prikazujemo izračun vrijednosti f2(4) i
f2(8):
\[ f_2(4)=\max_{\begin{subarray}{l} 0 \leqslant
{x_2} \leqslant \min \left\{ {4,5} \right\} \\ {x_2} \in \mathbb{Z}
\end{subarray}} \left[ {5 \cdot {x_2} + {f_1}(4 - {x_2})} \right] =
\max_{0 \leqslant {x_2} \leqslant 4} \left[ {5 \cdot {x_2} + {f_1}(4
- {x_2})} \right] = \] \( \max \{5 \cdot 0 + f_1(4 – 0), 5 \cdot 1 + f_1(4– 1), 5 \cdot 2 + f_1(4– 2), 5 \cdot 3 + f_1(4– 3), 5 \cdot 4 + f_1(4– 4)\} = \) \( \max \{0 + f_1(4), 5 + f_1(3), 10 + f_1(2),
15 + f_1(1), 20 + f_1(0)\} = \) \( \max \{0 +
16, 5 + 12, 10 + 8, 15 + 4, 20 + 0\} = 20; \)
\[ f_2(8)= \max_{\begin{subarray}{l} 0
\leqslant {x_2} \leqslant \min \left\{ {8,5} \right\} \\ {x_2} \in \mathbb{Z}
\end{subarray}} \left[ {5 \cdot {x_2} + {f_1}(8 - {x_2})} \right] =
\max_{0 \leqslant {x_2} \leqslant 5} \left[ {5 \cdot {x_2} + {f_1}(8
- {x_2})} \right] = \] \( \max \{5 \cdot 0 + f_1(8 – 0), 5 \cdot 1 + f_1(8
– 1), 5 \cdot 2 + f_1(8
– 2), 5 \cdot 3 + f_1(8
– 3), 5 \cdot 4 + f_1(8
– 4), 5 \cdot 5 + f_1(8
– 5)\} = \) \( \max \{0 + f_1(8), 5 + f_1(7),
10 + f_1(6),15 + f_1(5), 20 + f_1(4),
25 + f_1(3)\} = \) \( \max \{0 + 20, 5 + 20, 10 + 20, 15 + 20, 20 + 16,
25 + 12\} = 37.\)
Sve
vrijednosti funkcija \(f_1\) i \(f_2\) navedene su u
sljedećoj tablici:
c
|
\(f_1(c)\)
|
\(x_1^*\)
|
\(f_2(c)\)
|
\(x_2^*\)
|
0
|
0
|
0
|
0
|
0
|
1
|
4
|
1
|
5
|
1
|
2
|
8
|
2
|
10
|
2
|
3
|
12
|
3
|
15
|
3
|
4
|
16
|
4
|
20
|
4
|
5
|
20
|
5
|
25
|
5
|
6
|
20
|
5
|
29
|
5
|
7
|
20
|
5
|
33
|
5
|
8
|
20
|
5
|
37
|
5
|
Tablica 2. Optimalne vrijednosti funkcija \(f_1\)
i \(f_2\)
Vrijednost
\(x_2^*\) označava optimalno ulaganje u
drugi odjel za koje se postiže pripadna optimalna vrijednost f2(c).
Npr. za c = 4 optimalna se vrijednost f2(c) = f2(4)
= 20 postiže ulaganjem \(x_2^*\) = 4 n.j.
u drugi odjel.
U
trećoj fazi razmatramo ulaganje kapitala u sva tri odjela. Analogno kao
u drugoj fazi, pretpostavimo da ulažemo ukupno c n.j. pri čemu je \(c\in C\). Za
svaki \(i\in [3]\) označimo s xi
iznos uložen u i–ti odjel. Tada mora vrijediti jednakost
x1 + x2
+ x3 = c,
iz
koje je
x1 + x2
= c – x3.
Uložimo
li u treći odjel x3 n.j., neto-dobit koju će ostvariti taj
odjel iznosi 2 × x3
n.j., a optimalna neto-dobit koju će ostvariti prvi i drugi odjel
zajedno, prema definiciji funkcije f2, iznosi f2(x1
+ x2) n.j., odnosno f2(c – x3)
n.j. Stoga za svaki \(c\in C\) računamo vrijednosti realne funkcije \(f_3:C\to \mathbb{R}\)
definirane s
\[ f_3(c)= \max_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant \min \left\{ {c,5} \right\} \\ {x_3} \in \mathbb{Z}
\end{subarray}} \left[ {2 \cdot {x_3} + {f_2}(c - {x_3})} \right].\]
Te
su vrijednosti, zapravo, optimalne neto-dobiti ako ukupni kapital od c
n.j. uložimo u sva tri odjela. Uvjeti pri kojima određujemo maksimum posljedica
su zahtjeva da iznos x3 mora biti cjelobrojan i ne smije
premašiti niti ukupni kapital od c n.j., niti 5. n.j. Radi ilustracije
postupka, prikazujemo izračun vrijednosti f2(4) i f2(8):
f3(4) = \[ \max_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant \min \left\{ {4,5} \right\} \\ {x_3} \in \mathbb{Z}
\end{subarray}} \left[ {2 \cdot {x_3} + {f_2}(4 - {x_3})} \right] =
\max_{0 \leqslant {x_3} \leqslant 4} \left[ {2 \cdot {x_3} + {f_2}(4
- {x_3})} \right]\] = max {2 × 0 + f2(4 – 0), 2 × 1 + + f2(4
– 1), 2 × 2 + f2(4
– 2), 2 × 3 + f2(4
– 3), 2 × 4 + f2(4
– 4)} = max {0 + f2(4), 2 + f2(3), 4 + + f2(2),
6 + f2(1), 8 + f2(0)} = max {0 + 20, 2
+ 15, 4 + 10, 6 + 5, 8 + 0} = 20;
f3(8) = \[ \max_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant \min \left\{ {8,5} \right\} \\ {x_3} \in \mathbb{Z}
\end{subarray}} \left[ {2 \cdot {x_3} + {f_2}(8 - {x_3})} \right] =
\max_{0 \leqslant {x_3} \leqslant 5} \left[ {2 \cdot {x_3} + {f_2}(8
- {x_3})} \right]\] = max {2 × 0 + f2(8 – 0), 2 × 1 + + f2(8
– 1), 2 × 2 + f2(8
– 2), 2 × 3 + f2(8
– 3), 2 × 4 + f2(8
– 4), 2 × 5 + f2(8
– 5)} = max {0 + + f2(8), 2 + f2(7), 4
+ f2(6), 6 + f2(5), 8 + f2(4),
10 + f2(3)} = max {0 + 37, 2 + 33, 4 + 29, 6 + + 25, 8 +
20, 10 + 15} = 37.
Svih
9 vrijednosti svake od triju promatranih funkcija pregledno su dane u sljedećoj
tablici.
c
|
\(f_1(c)\)
|
\(
x_1^*\)
|
f2(c)
|
\(
x_2^*\)
|
f3(c)
|
\(
x_3^*\)
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
4
|
1
|
5
|
1
|
5
|
0
|
2
|
8
|
2
|
10
|
2
|
10
|
0
|
3
|
12
|
3
|
15
|
3
|
15
|
0
|
4
|
16
|
4
|
20
|
4
|
20
|
0
|
5
|
20
|
5
|
25
|
5
|
25
|
0
|
6
|
20
|
5
|
29
|
5
|
29
|
0
|
7
|
20
|
5
|
33
|
5
|
33
|
0
|
8
|
20
|
5
|
37
|
5
|
37
|
0
|
Tablica 3. Optimalne vrijednosti funkcija \(f_1\),
\(f_2\) i \(f_3\)
Optimalna
vrijednost funkcije f3 jednaka je 37 i postiže se za c
= 8, što znači da se optimalna ukupna neto-dobit ostvaruje ulaganjem cjelokupnoga
raspoloživog kapitala od 8 n.j. Odredimo pripadne optimalne iznose ulaganja u
svaki odjel.
Vrijednost
f3(8) = 37 postiže se kao zbroj 0 + 37, odnosno kao zbroj 0 +
f2(8), tj. kao zbroj 2 × ×
0 + f2(8 – 0). Odatle ''očitavamo'' da je optimalna
vrijednost varijable x3 jednaka \(x_3^*\) = 0, pa zaključujemo da u treći
odjel ne ulažemo ništa.
Vrijednost
f2(8) = 37 postiže se kao zbroj 25 + 12, odnosno kao zbroj 25
+ f_1(3), tj. kao zbroj 5 × 5 + f_1(8 – 5). Odatle
''očitavamo'' da je optimalna vrijednost varijable x2 jednaka
\(x_2^*\) = 5, pa u drugi odjel ulažemo
ukupno 5 n.j.
Vrijednost
\(f_1(3) = 12\) postiže se kao umnožak 4 × 3, pa je
optimalna vrijednost varijable x1 jednaka \(x_1^*\) = 3, stoga u prvi odjel ulažemo
ukupno 3 n.j.
Dobiveni
optimalan plan ulaganja možemo pregledno prikazati sljedećom tablicom:
odjel
|
optimalan
iznos ulaganja
[n.j.]
|
1
|
3
|
2
|
5
|
3
|
0
|
Tablica 4. Optimalan plan ulaganja – rješenje
Primjera 1
Pripadna
optimalna neto-dobit iznosi 37 n.j.
Rješenje s pomoću programa WinQSB: Program WinQSB
ne sadržava potprogram namijenjen rješavanju problema optimalne razdiobe
ulaganja, ali sadržava potprogram Dynamic Programming (u daljnjem tekstu
DP) namijenjen, među ostalim, rješavanju problema naprtnjače (ruksaka).
Unutar njega ne postoje druge aplikacije pogodne za rješavanje promatranog problema.
Ako je problem linearan, može se primijeniti potprogram Linear and Integer
Programming, ali uz znatne restrikcije ulaznih podataka.
Prije
nego što opišemo rješenje s pomoću programa WinQSB, ukratko ćemo navesti
osnovna obilježja problema naprtnjače.
Problem
naprtnjače
(engl. the knapsack problem) česta je tema na području primijenjene
matematike, financijske alokacije sredstava, kombinatorike i kriptografije.
Naziv problema proizlazi iz narodne predaje: kako lopov s naprtnjačom određenog
obujma može ukrasti predmete što veće vrijednosti[5], a da
pritom obujam ukradenih predmeta ne premaši obujam naprtnjače? Prvi pisani
tragovi o problemu datiraju iz 1897. godine, a u posljednjih nekoliko
desetljeća jednako se intenzivno proučavaju i teorija i praktična primjena.
Razlog tomu je modeliranje mnogih industrijskih, financijskih i kriptografskih
problema preko problema naprtnjače, poput kapitalnog budžetiranja, ukrcavanja
tereta, smanjivanja zaliha, izrade portfolija, kriptosustava itd.
Postoje tri osnovne
podjele problema naprtnjače. Prva razlikuje slučajeve u kojima postoji jedna
naprtnjača (single knapsack problem) od onih u kojima postoji više njih
(multiple knapsack problem). Sljedeća podjela odnosi se na „djeljivost“
predmeta. U cjelobrojnom problemu naprtnjače predmeti su „nedjeljivi“,
tj. ne možemo uzeti manji dio niti jednog predmeta, već samo predmet u cjelini.
U djeljivom problemu naprtnjače predmeti se mogu razdijeliti na manje
dijelove. U trećoj podjeli ograničen problem naprtnjače ograničava količinu
svakog predmeta s nekom cjelobrojnom vrijednosti, dok neograničen problem
naprtnjače ne postavlja nikakvu gornju granicu na broj komada pojedine
vrste predmeta.
S obzirom na vrstu
problema naprtnjače, može se primijeniti nekoliko različitih algoritama za
rješavanje: pohlepni algoritam (engl. greedy algorithm), granice
i grananje (engl. branch-and-bound), linearno programiranje,
dinamičko programiranje i drugi. U programu WinQSB za rješavanje
problema primjenjuje se dinamičko programiranje.
Tipičan
problem naprtnjače je sljedeći:
Problem 1. Putnik ima
naprtnjaču čija je najveća dopuštena nosivost M kg. Na odabir mu je
ponuđeno ukupno n vrsta namirnica: N1… Nn,
pri čemu su sve namirnice međusobno ravnopravne. Za svaki i \in [n] neka su vi
i mi redom vrijednost[6]
i masa namirnice Ni. Kako putnik treba napuniti naprtnjaču
namirnicama tako da ukupna masa svih namirnica stavljenih u naprtnjaču ne bude
veća od M kg i da ukupna vrijednost tih namirnica bude što veća?[7]
Za
svaki \(i \in [n] \)
definiramo varijable \(x_i\) s:
\[{x_i} = \left\{ \begin{gathered}
0,{\text{ ako namirnicu }}{N_i}{\text{ ne stavljamo u naprtnjaču;}} \\
1,{\text{ ako namirnicu }}{N_i}{\text{ stavljamo u naprtnjaču.}} \\
\end{gathered} \right.\]
Promatrani
problem možemo opisati sljedećim matematičkim modelom:
maksimizirati \(f({x_1},...,{x_n})
= \sum\limits_{i = 1}^n {{w_i} \cdot {x_i}} \)
pod
uvjetima
\[\begin{gathered} \sum\limits_{i = 1}^n {{a_i}
\cdot {x_i} \leqslant M,} \\ {x_i} \in \left\{ {0,1} \right\}{\text{,
za svaki }}i \in \left[ n \right] \end{gathered} \]
Ova
najčešća i najpoznatija formulacija ograničenog cjelobrojnog problema
naprtnjače poznata je kao 0 - 1 problem naprtnjače. Izraz „0-1“ potječe
od interpretacije varijabli xi: svaki predmet ili se uzima u
cijelosti ili se uopće ne uzima.
S
obzirom na to da imamo n vrsta namirnica, postoji ukupno \(2^n\) različitih mogućnosti
odabira. Jedan od načina određivanja optimalne mogućnosti je ispitivanje svih
kombinacija. Za to bi nam trebalo \(O({2^n})\) operacija, što najčešće nije najbolje
moguće vrijeme. Uz korištenje dinamičkog programiranja, rješavanje promatranoga
problema može se svesti na pseudopolinomijalno (u ovisnosti o \(C_0\)).
Problem
iz Primjera 1 možemo ''prevesti'' na sljedeći zatvoreni problem
naprtnjače:
Na
raspolaganju nam je po 5 komada svake od triju vrsta namirnica: N1,
N2 i N3 te naprtnjača kapaciteta 8
kg. Podaci o jediničnoj cijeni i jediničnoj masi svake namirnice navedeni su
u donjoj tablici.
namirnica
|
jedinična
cijena
[n.j.]
|
jedinična masa
[kg]
|
N1
|
4
|
1
|
N2
|
5
|
1
|
N3
|
2
|
1
|
Tablica 5. Ulazni podaci za zatvoreni problem
naprtnjače
Treba
odabrati namirnice što veće ukupne vrijednosti tako da njihova ukupna masa ne
bude veća od kapaciteta naprtnjače. Formirajmo odgovarajući matematički model, pa odredimo
optimalan izbor namirnica i pripadnu optimalnu ukupnu vrijednost.
Ovako
definiran problem ima isti matematički model kao i polazni problem, ali
s drugačijim interpretacijama varijabli, funkcije cilja i uvjeta. Takvi
se problemi uobičajeno nazivaju izomorfnima: njihovi matematički modeli
su jednaki do na interpretacije ulaznih i
izlaznih varijabli[8]
te se rješavaju istim metodama/algoritmima.
Pokretanjem
potprograma DP odaberimo tip Knapsack Problem (vidjeti Sliku 1).
Slika 1. Dijaloški okvir potprograma DP
Nazovimo
problem koji ćemo rješavati Primjer 1, tj. upišimo:
Problem
Title:
Primjer 1
Number
of Items:
3
Potom
kliknimo na OK. U sljedećem koraku unosimo ulazne podatke (vidjeti Sliku
2).
Slika 2. Unos ulaznih podataka
U
drugi stupac (Item Identification) upišimo redom O1, O2 i O3 jer će nam
takve oznake na kraju ''otkriti'' svotu uloženu u svaki pojedini odjel.
U
treći stupac (Units Available) upisujemo najveći mogući iznos koji može
biti uložen u svaki pojedini odjel. Ti iznosi su jednaki 5, pa upisujemo: 5, 5,
5.
U
četvrti stupac (Unit Capacity Required) treba upisati koeficijente uz
nepoznanice x1, x2 i x3 u
uvjetu x1 + x2 + x3 £ 8. Oni su
jednaki 1, pa u četvrti stupac upišimo: 1, 1, 1. Istaknimo odmah da su prigodom
modeliranja problema jednostavne razdiobe ulaganja koeficijenti u ovom stupcu uvijek
jednaki 1, dok kod problema složene razdiobe ulaganja (obrađenoga u točki 1.4.)
ti koeficijenti općenito mogu biti i nenegativni realni brojevi različiti od 1.
U
peti stupac (Return Function (X: Item ID)) upišimo redom
komponente funkcije cilja koje se odnose na odjel iz pripadnoga retka. Tako u
prvi redak toga stupca upišimo 4*X, u drugi 5*X, a u treći 2*X.
U
posljednji redak pored natpisa Capacity= upišimo ukupan iznos
kapitala, tj. 8.
Ovime
je unos ulaznih podataka završen. Kliknimo lijevom tipkom miša na izbornik Solve
and Analyze i odaberimo opciju Solve the Problem. Dobivamo izlaznu
tablicu sa svim potrebnim rezultatima (vidjeti Sliku 3).
Slika 3. Izlazna tablica u Primjeru 1
Iz
trećega stupca (Decision Quantity (X)) očitavamo optimalan iznos
ulaganja u svaki pojedini odjel: u prvi odjel (O1) treba
uložiti 3 n.j., u drugi odjel (O2) 5 n.j., dok se u treći
odjel (O3) ne ulaže ništa. Optimalnu neto-dobit očitavamo iz
posljednjega retka (Total Return Value) i ona iznosi 37. n.j.
Na
navedenom primjeru može se vidjeti i razlog naziva jednostavna razdioba
ulaganja. Cjelokupni kapital dijeli se na međusobno ravnopravne
dijelove, tj. na početku nemamo razloga preferirati bilo koji odjel tvrtke.
Zbog toga se u uvjetu koji označava da zbroj svih uloženih iznosa mora biti
najviše jednak predviđenom kapitalu uz nepoznanice koje označavaju uložene
iznose kao koeficijenti pojavljuju jedinice. U gospodarskoj su praksi, međutim,
mogući i slučajevi kad se na početku, prema nekom kriteriju, rangiraju
ulaganja, pa se u takvim slučajevima govori o složenoj razdiobi ulaganja
u kojoj se pojavljuju tzv. težinski koeficijenti. O time se više može
naći npr. u [6].
Primjer 2. Problem optimalnog ulaganja
kapitala u razvoj određene regije ili određene gospodarske grane može se
definirati na sljedeći način: Za ostvarivanje bržega razvoja određene
gospodarske grane predviđen je kapital u iznosu od C0 n.j.
Taj kapital može se uložiti u ukupno n različitih tvrtki iz navedene
gospodarske grane. Ovisno o uloženom kapitalu, svaka pojedina tvrtka ostvarit
će dodatnu neto-dobit (razliku ukupne neto-dobiti i uloženoga kapitala). Treba
naći razdiobu raspoloživoga kapitala na navedene tvrtke tako da ukupna dodatna neto-dobit
(tj. zbroj dodatnih neto-dobiti svih n tvrtki) bude maksimalna.
Konkretno,
za ostvarivanje bržega razvoja određene gospodarske grane predviđen je kapital
u iznosu od C0 = 4.000.000,00 kn. Taj se kapital ulaže u
ukupno tri tvrtke − T1,
T2 i T3 − pri čemu se u svaku tvrtku ili
ne ulaže ništa ili se ulaže iznos koji je višekratnik broja 1.000.000 (nije
nužno uložiti sav predviđeni kapital). Očekivana dodatna neto-dobit koju će
ostvariti svaka tvrtka navedena je u sljedećoj tablici.
iznos ulaganja
(milijuna kn)
|
očekivana
dodatna neto-dobit tvrtke (milijuna kn)
|
T1
|
T2
|
T3
|
0
|
0
|
0
|
0
|
1
|
0.3
|
0.29
|
0.31
|
2
|
0.47
|
0.45
|
0.46
|
3
|
0.7
|
0.67
|
0.74
|
4
|
0.83
|
0.82
|
0.8
|
Tablica 6. Ulazni podaci za Primjer 2
a)
Odredimo
opći matematički model promatranoga problema uz pretpostavku da svi iznosi
ulaganja nužno moraju biti cjelobrojni (moguće je da se u neku tvrtku ne uloži
ništa).
b) Za konkretni
slučaj nađimo optimalnu razdiobu predviđenoga kapitala.
Opći matematički model: Za svaki
\(i\in [n] \)
označimo s xi iznos ulaganja u tvrtku Ti, a
fi(xi) pripadnu očekivanu dodatnu neto-dobit
[9]. Tada je ukupna očekivana dodatna neto-dobit od ulaganja u svih n tvrtki jednaka
f(x1, x2…
xn) = f1(x1) + f2(x2)
+… + fn(xn) = \(\sum\limits_{i = 1}^n {{f_i}({x_i})} \)
pa
zahtijevamo da vrijednost te funkcije bude maksimalna. Pogledajmo pripadne
uvjete uz koje tražimo maksimalnu vrijednost. Zbroj svih ulaganja ne smije biti
strogo veći od ukupnoga iznosa raspoloživoga kapitala C0, pa
mora vrijediti nejednakost
tj.
\( \sum\limits_{i = 1}^n
{{x_i}}\le C_0\).
Iznos
svakog ulaganja nužno mora biti cjelobrojan, a prema prirodi problema on mora
biti i nenegativan i najviše jednak C0. Zbog toga mora
vrijediti:
xi \in [C0]0,
za svaki \(i \in [n]\).
Prema
tome, traženi matematički model je:
maksimizirati f(x1, x2…
xn) = \(\sum\limits_{i = 1}^n
{{f_i}({x_i})} \)
pod
uvjetima
\(\sum\limits_{i = 1}^n {{x_i}} \le C_0\)
\(x_i \in \) [C0]0,
za svaki \(i \in [n]\).
b) U konkretnom su
slučaju n = 3 i C0 = 4.[10]
Odgovarajući matematički model je:
maksimizirati f(x1, x2,
x3) = f1(x1) + f2(x2)
+ f3(x3)
pod
uvjetima
\(x_i \in [4]_0 \),
za svaki \(i \in [3]\).
Stavimo
C := [4]0. Intuitivno možemo naslutiti da će se optimalna
vrijednost postići bude li uloženi iznos jednak C0. Problem
ćemo riješiti u ukupno tri faze.
U
prvoj fazi definirajmo realnu funkciju \(d_1:C\to \mathbb{R}\)
d1(c) = \(f_1\)(c).
d1(c) je
zapravo optimalna očekivana dodatna neto-dobit ako se ukupan iznos od c
milijuna kuna uloži isključivo u tvrtku T1. Ti iznosi već su
zadani u Tablici 6, pa ih pregledno prepišimo u sljedeću tablicu:
c
|
d1(c)
|
\(x_1^*\)
|
0
|
0
|
0
|
1
|
0.3
|
1
|
2
|
0.47
|
2
|
3
|
0.7
|
3
|
4
|
0.83
|
4
|
Tablica 7. Rezultati prve faze rješenja Primjera 2
Vrijednost
\(x_1^*\) označava optimalno ulaganje u
tvrtku T1 uz koju se postiže optimalna očekivana dodatna neto-dobit
d1(c). U ovom slučaju za svaki \(c\in C\)
vrijedi jednakost \(x_1^* = c\), ali, kako
smo vidjeli u Primjeru 1, u prvoj fazi ta jednakost općenito ne mora vrijediti.
U
drugoj fazi definirajmo realnu funkciju \(d_2:C\to \mathbb{R}\) s:
d2(c) =\( \max\limits_{\begin{subarray}{l} 0
\leqslant {x_2} \leqslant c \\ {x_2} \in C \end{subarray}} \left[
{{f_2}({x_2}) + {d_1}(c - {x_2})} \right]\).
d2(c) je
zapravo optimalna očekivana dodatna neto-dobit ako se ukupan iznos od c
milijuna kuna uloži samo u tvrtke T1 i T2.
Uloži li se iznos od x2 milijuna kuna u tvrtku T2,
očekivana dodatna neto-dobit tvrtke T2 iznosit će f2(x2).
Preostali iznos od c – x2 milijuna kuna ulaže se u
tvrtku T1, a prema definiciji funkcije d1, optimalna
očekivana dodatna neto-dobit nastala tim ulaganjem jednaka je d1(c
– x2). Zbroj tih dviju očekivanih dodatnih neto-dobiti treba
maksimizirati, pa odatle slijedi izraz iz definicije funkcije d2.
Detaljno
prikazujemo izračun vrijednosti d2(4):
\[ d_2(4)= \max_{\begin{subarray}{l} 0
\leqslant {x_2} \leqslant 4 \\ x_2 \in C \end{subarray}} \left[
{{f_2}({x_2}) + {d_1}(4 - {x_2})} \right]= \max_{x_2 \in C}
\left[ {{f_2}({x_2}) + {d_1}(4 - {x_2})} \right]=\] max{f2(0)
+ d1(4 – 0), f2(1) + + d1(4
– 1), f2(2) + d1(4 – 2), f2(3)
+ d1(4 – 3), f2(4) + d1(4
– 4)} = max{0 + 0.83, 0.29 + 0.7, 0.45 + 0.47, 0.67 + 0.3, 0.82 + 0} = 0.99.
Radi
potpunosti razmatranja, u sljedećoj tablici navodimo i vrijednosti funkcije d2
za preostale vrijednosti varijable c:
c
|
d1(c)
|
\(x_1^*\)
|
d2(c)
|
\(x_2^*\)
|
0
|
0
|
0
|
0
|
0
|
1
|
0.3
|
1
|
0.3
|
0
|
2
|
0.47
|
2
|
0.59
|
1
|
3
|
0.7
|
3
|
0.76
|
1
|
4
|
0.83
|
4
|
0.99
|
1
|
Tablica 8. Rezultati prvih dviju faza rješenja
Primjera 2
Vrijednost
\(x_2^*\) označava optimalno ulaganje u
tvrtku T2 uz koju se postiže optimalna očekivana dodatna neto-dobit
d2(c). To optimalno ulaganje ''očitava'' se iz
postupka izračuna vrijednosti funkcije d2. Npr. d2(4)
= 0.99 dobiva se kao zbroj 0.29 + 0.7, tj. kao zbroj f2(1) +
d1(4 – 1). Odatle slijedi
\(x_2^* =
1\)
(i, naravno, \(x_1^* = 4 - x_2^* = 4 - 1 = 3\)) .
U
trećoj fazi definirajmo realnu funkciju \(d_3\to \mathbb{R}\) s
d3(c) =\( \max\limits_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant c \\ {x_3} \in C \end{subarray}} \left[
{{f_3}({x_3}) + {d_2}(c - {x_3})} \right]\).
d3(c) je
zapravo optimalna očekivana dodatna neto-dobit ako se ukupan iznos od c
milijuna kuna uloži u sve tri tvrtke. Uloži li se iznos od x3
milijuna kuna u tvrtku T3, očekivana dodatna neto-dobit
tvrtke T3 iznosit će f3(c).
Preostali iznos od c – x3 milijuna kuna ulaže se u
tvrtke T1 i T2, a prema definiciji funkcije
d2, optimalna očekivana dodatna neto-dobit nastala tim
ulaganjem jednaka je d2(c – x3).
Zbroj tih dviju očekivanih dodatnih neto-dobiti treba maksimizirati, pa odatle
slijedi izraz iz definicije funkcije d3.
Detaljno
prikazujemo izračun vrijednosti d3(4):
\[ d_3(4) = \max_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant 4 \\ {x_3} \in C \end{subarray}} \left[
{{f_3}({x_3}) + {d_2}(4 - {x_3})} \right] = \max_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant 4 \\ {x_3} \in C \end{subarray}} \left[
{{f_3}({x_3}) + {d_2}(4 - {x_3})} \right]= \] max{f3(0)
+ d2(4 – 0), f3(1) + d2(4
– 1), f3(2) + d2(4 – 2), f3(3)
+ d2(4 – 3), f3(4) + d2(4
– 4)} = max{0 + 0.99, 0.31 + 0.76, 0.46 + 0.59, 0.74 + 0.3, 0.8 + 0} = 1.07.
Radi
potpunosti razmatranja, u sljedećoj tablici navodimo i vrijednosti funkcije d3
za preostale vrijednosti varijable c:
c
|
d1(c)
|
\(x_1^*\)
|
d2(c)
|
\(x_2^*\)
|
d3(c)
|
\(x_3^*\)
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0.3
|
1
|
0.3
|
0
|
0.31
|
1
|
2
|
0.47
|
2
|
0.59
|
1
|
0.61
|
1
|
3
|
0.7
|
3
|
0.76
|
1
|
0.90
|
1
|
4
|
0.83
|
4
|
0.99
|
1
|
1.07
|
1
|
Tablica 9. Rezultati svih triju faza rješenja
Primjera 2
Iz
Tablice 9 vidimo da se najveća vrijednost funkcije d3, kako
smo i očekivali, postiže za c = 4. Dakle, treba uložiti sav predviđeni
kapital od 4.000.000,00 kn. Pripadni optimalni plan ulaganja ''očitava'' se iz
postupaka izračuna vrijednosti funkcija d1, d2
i d3 na sljedeći način:
Optimalna
vrijednost d3(4) = 1.07 dobiva se kao zbroj 0.31 + 0.76, tj.
kao zbroj f3(1) + d2(4 – 1). Odatle slijedi \(x_3^* = 1\). Optimalna vrijednost d2(4
– 1) = d2(3) = 0.76 dobiva se kao zbroj 0.29 + 0.47, tj. kao
zbroj f2(1) + d1(3 – 1). Odatle slijedi \(x_2^* = 1\) i \(x_1^*
= 3 - 1 = 2\). Tražena optimalna razdioba kapitala navedena je u Tablici
10.
Tvrtka
|
optimalan
iznos ulaganja
(milijuna kn)
|
T1
|
2
|
T2
|
1
|
T3
|
1
|
Tablica 10. Rješenje Primjera 2
Pripadna
optimalna očekivana dodatna neto-dobit iznosi 1.070.000,00 kn.
Kako
je istaknuto u uvodu, na problem optimizacije jednostavne razdiobe ulaganja
mogu se svesti različiti problemi minimizacije ukupnih troškova proizvodnje
nekoga proizvoda. Pokažimo to na primjerima.
Primjer 3. Tijekom tri mjeseca treba
proizvesti točno 12 komada nekoga proizvoda, pri čemu je najveći mogući
kapacitet proizvodnje 6 komada proizvoda mjesečno (moguće je da se u nekom
mjesecu ne proizvede niti jedan proizvod). Troškovi proizvodnje upravno su razmjerni kvadratima broja proizvedenih
proizvoda, te za svaki \( i \in [3]\) vrijedi: ako se u i–tom mjesecu
proizvede xi komada proizvoda, troškovi proizvodnje iznose wi
× \(x_i^2\) n.j., gdje su wi
strogo pozitivni realni parametri. Treba odrediti plan proizvodnje takav da
ukupni troškovi proizvodnje budu minimalni.
a) Odredimo opći
matematički model promatranoga problema.
b) Riješimo
problem za konkretne vrijednosti: w1 = 10, w2
= 24 i w3 = 32.
Matematički model: U postavci problema
već je naznačeno da s xi označavamo količinu (broj komada)
proizvoda proizvedenu u i–tom mjesecu. Ukupan zbroj svih količina mora
biti jednak 12, pa vrijedi jednakost:
x1 + x2
+ x3 = 12.
Troškovi
proizvodnje u prvom mjesecu su \(w_1\cdot x_1^2\), troškovi
proizvodnje u drugom mjesecu \(w_2\cdot x_2^2\), a troškovi
proizvodnje u trećem mjesecu \(w_3\cdot x_3^2\). Stoga ukupni
troškovi proizvodnje u navedena tri mjeseca iznose
f(x1, x2,
x3) = \( w_1\cdot x_1^2 + w_2\cdot x_2^2+ w_3\cdot x_3^2\).
Nadalje,
iz tipa promatranoga problema slijedi da vrijednosti varijabli xi
nužno moraju biti elementi skupa N0. Također, te vrijednosti
ne smiju biti strogo veće od 6 jer je najveći mogući kapacitet proizvodnje
jednak 6. Prema tome, matematički model promatranoga problema
glasi:
minimizirati f(x1, x2,
x3) = \( w_1\cdot x_1^2 + w_2\cdot x_2^2+ w_3\cdot x_3^2\)
pod
uvjetima
x1 + x2
+ x3 = 12,
\( x_1,x_2,x_3 \in [6]_0\).
Analitičko rješenje: Za w1
= 10, w2 = 24 i w3 = 32 dobivamo sljedeći
problem:
minimizirati f(x1, x2,
x3) = \( 10\cdot x_1^2 + 24\cdot x_2^2+ 32\cdot x_3^2\)
pod uvjetima
x1 + x2
+ x3 = 12,
\(x_1,x_2,x_3 \in [6]_0\).
I
ovdje bismo mogli razmišljati ''pohlepno'', tj. da u prvom mjesecu treba
proizvesti točno 6 komada proizvoda (jer su najmanji troškovi proizvodnje
upravo u tom mjesecu), a u drugom preostalih 6 (jer su troškovi proizvodnje u
drugom mjesecu manji nego u trećem). Stoga bi traženi plan mogao biti \(x_1^*\) = \(x_2^*\)
= 6, \(x_3^*\)= 0, a minimalni troškovi f(6,
6, 0) = 10 × 62 +
24 × 62 +
32 × 02 =
1224 n.j. Pokazat ćemo, međutim, da ovakav ''pohlepni'' pristup u ovom slučaju
ne daje optimalno rješenje.
Analogno
prethodnim primjerima, stavimo C := [12]0. Primijetimo da u
ovom primjeru unaprijed znamo točan ukupan broj komada proizvoda koje treba
proizvesti (to je 12), ali, radi ilustriranja tehnike dinamičkoga
programiranja, u svakoj ćemo fazi rješavanja problema izračunavati 13
odgovarajućih vrijednosti.
U
prvoj fazi za svaki \(c\in C\) računamo vrijednosti realne funkcije \(f_1:C\to \mathbb{R}\)
definirane s:
\(f_1(c)=10\cdot c^2 \).
Vrijednosti
funkcije \(f_1\) su optimalni troškovi proizvodnje ako se u
prvom mjesecu proizvede točno c komada proizvoda. Pritom za svaki \(c\in C\) takav
da je \(s\ge 7\) dogovorno
stavljamo da su troškovi proizvodnje beskonačni jer je najveći proizvodni
kapacitet, prema uvjetima zadatka, jednak 6. Tako dobivamo sljedeću tablicu:
c
|
\(f_1(c)\)
|
\(x_1^*\)
|
0
|
0
|
0
|
1
|
10
|
1
|
2
|
40
|
2
|
3
|
90
|
3
|
4
|
160
|
4
|
5
|
250
|
5
|
6
|
360
|
6
|
7
|
\(\infty\)
|
6
|
8
|
\(\infty\)
|
6
|
9
|
\(\infty\)
|
6
|
10
|
\(\infty\)
|
6
|
11
|
\(\infty\)
|
6
|
12
|
\(\infty\)
|
6
|
Tablica 11. Rezultati prve faze rješenja Primjera 3
Vrijednost
\(x_1^*\) označava optimalnu proizvodnju u
prvom mjesecu za koju se postiže pripadna optimalna vrijednost \(f_1(c)\).
Pritom smo u retcima u kojima je \(f_1(c) = \infty\) dogovorno pisali \(x_1^*\) = 6 zbog već istaknute činjenice da je
najveći mjesečni proizvodni kapacitet jednak 6.
U
drugoj fazi računamo vrijednosti realne funkcije \(f_2:C\to\mathbb{R}\)
definirane s:
U
ovoj fazi pretpostavljamo da se ukupno c komada proizvoda mora
proizvesti u prva dva mjeseca. Ako se u drugom mjesecu proizvede x2
proizvoda, u prvom se mora proizvesti ukupno c – x2
proizvoda. Troškovi proizvodnje u drugom mjesecu iznose 24 × \(x_2^2\) n.j., dok optimalni troškovi
proizvodnje u prvom mjesecu, prema definiciji funkcije \(f_1\),
iznose \(f_1(c-x_2)\) n.j. Zbroj tih
troškova jednak je ukupnim troškovima proizvodnje u prva dva mjeseca, pa taj
zbroj treba minimizirati imajući na umu uvjete da vrijednost varijable x2
mora biti cjelobrojna, ne veća od ukupne količine proizvoda koju treba
proizvesti i ne veća od najvećega mjesečnog kapaciteta proizvodnje. Odatle
slijedi izraz iz definicije funkcije f2.
Radi
ilustracije, izračunat ćemo f2(6) i f2(12),
pri čemu koristimo da vrijednosti \(f_1(7), f_1(8),\ldots,
f_1(12)\) ne postoje jer se niti u jednom mjesecu (pa posebno
niti u prvom mjesecu) ne može proizvesti strogo više od 6 komada proizvoda:
\[ f_2(6)= \min_{\begin{subarray}{l} 0
\leqslant x_2 \leqslant \min \left\{ 6,6 \right\} \\ x_2 \in \mathbb{Z}
\end{subarray}} \left[ {24 \cdot x_2^2 + {f_1}(6 - {x_2})} \right] =
\min_{0 \leqslant {x_2} \leqslant 6} \left[ {24 \cdot x_2^2 + {f_1}(6
- {x_2})} \right] = \] min {24 × 02 + f_1(6 – 0), 24 × 12 +
f_1(6 – 1), 24 × 22 + f_1(6 – 2), 24 × 32 +
f_1(6 – 3), 24 × 42 + f_1(6 – 4), 24 × 52 +
f_1(6 – 5), 24 × 62 + f_1(6 – 6)} = min
{0 + 360, 24 + 250, 96 + 160, 216 + 90, 384 + 40, 600 + 10, 864 + + 0} = 256;
\[ f_2(12) = \min_{\begin{subarray}{l} 0
\leqslant {x_2} \leqslant \min \left\{ {12,6} \right\} \\ {x_2} \in
\mathbb{Z} \end{subarray}} \left[ {24 \cdot x_2^2 + {f_1}(12 - {x_2})} \right]
= \min_{0 \leqslant {x_2} \leqslant 6} \left[ {24 \cdot x_2^2
+ {f_1}(12 - {x_2})} \right] = \] min {24 × 02 + f_1(12
– 0), 24 × 12 +
f_1(12 – 1), 24 × 22 + f_1(12 – 2), 24 × 32 +
f_1(12 – 3), 24 × 42 + f_1(12 – 4), 24 × 52 +
+ f_1(12 – 5), 24 × 62 + f_1(12 – 6)} =
min{24 × 62 +
f_1(6)} = 1224.
Izračunom
ostalih vrijednosti dobivamo sljedeću tablicu:
c
|
\(f_1(c)\)
|
\(x_1^*\)
|
f2(c)
|
\(x_2^*\)
|
0
|
0
|
0
|
0
|
0
|
1
|
10
|
1
|
10
|
0
|
2
|
40
|
2
|
34
|
1
|
3
|
90
|
3
|
64
|
1
|
4
|
160
|
4
|
114
|
1
|
5
|
250
|
5
|
184
|
1
|
6
|
360
|
6
|
256
|
2
|
7
|
\(\infty\)
|
6
|
346
|
2
|
8
|
\(\infty\)
|
6
|
456
|
2
|
9
|
\(\infty\)
|
6
|
576
|
3
|
10
|
\(\infty\)
|
6
|
744
|
4
|
11
|
\(\infty\)
|
6
|
960
|
5
|
12
|
\(\infty\)
|
6
|
1224
|
6
|
Tablica 12. Rezultati prve i druge faze rješenja
Primjera 3
Vrijednost
\(x_2^*\) označava optimalnu
proizvodnju u drugom mjesecu za koju se postiže pripadna optimalna vrijednost f2(c),
a može se ''očitati'' iz odgovarajućega izračuna vrijednosti f2(c).
Npr., f2(6) = 256 dobiva se kao zbroj 96 + 160, tj. kao 24 ·
22 + f1(6 – 2). Odatle slijedi \(x_2^*\) = 2 i \(x_1^*\) = 6 – 2 = 4.
U
trećoj fazi računamo vrijednosti realne funkcije \(f_3:C\to \mathbb{R}\)
definirane s :
f3(c) =\( \min\limits_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant \min \left\{ {c,6} \right\} \\ {x_3} \in \mathbb{Z}
\end{subarray}} \left[ {32 \cdot x_3^2 + {f_2}(c - {x_3})} \right]\).
U
ovoj fazi, pretpostavljamo, treba proizvesti ukupno c komada proizvoda u
sva tri mjeseca. Ako se u trećem mjesecu proizvede x3
proizvoda, u prva dva mjeseca treba proizvesti ukupno c – x3
proizvoda. Ukupni troškovi proizvodnje u trećem mjesecu iznose 32 × \(x_3^2\) n.j., dok optimalni troškovi
proizvodnje u prva dva mjeseca, u skladu s definicijom funkcije f2,
iznose f2(c – x3) n.j. Stoga ukupni
troškovi proizvodnje u sva tri mjeseca iznose 32 × \(x_3^2\)
+ f2(c – x3) n.j, pa taj zbroj treba
minimizirati imajući na umu početne uvjete na vrijednost varijable x3
(cijeli broj ne veći od ukupne količine proizvoda koju treba proizvesti i
najvećega mjesečnog kapaciteta proizvodnje). Radi ilustracije postupka
izračuna, detaljno prikazujemo izračun vrijednosti f3(6) i f3(12):
\[ f_3(6)= \min_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant \min \left\{ {6,6} \right\} \\ {x_3} \in \mathbb{Z}
\end{subarray}} \left[ {32 \cdot x_3^2 + {f_2}(6 - {x_3})} \right] =
\min_{\begin{subarray}{l} 0 \leqslant {x_3} \leqslant 6 \\ {x_3}
\in \mathbb{Z} \end{subarray}} \left[ {32 \cdot x_3^2 + {f_2}(6 - {x_3})}
\right] = \] min {32 ×
02 + f2(6 – 0), 32 × 12 + f2(6
– 1), 32 × 22 +
f2(6 – 2), 32 × 32 + f2(6 – 3), 32 × 42 +
f2(6 – 4), 32 × 52 + f2(6 – 5), 32 × 62 +
f2(6 – 6)} = min {256, 216, 242, 352, 546, 810, 1152} = 216;
\[ f_3(12)= \min_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant \min \left\{ {12,6} \right\} \\ {x_3} \in
\mathbb{Z} \end{subarray}} \left[ {32 \cdot x_3^2 + {f_2}(12 - {x_3})} \right]
= \min_{\begin{subarray}{l} 0 \leqslant {x_3} \leqslant 6
\\ {x_3} \in \mathbb{Z} \end{subarray}} \left[ {32 \cdot x_3^2 + {f_2}(12 -
{x_3})} \right] = \] min {32 × 02 + f2(12 – – 0), 32 × 12 +
f2(12 – 1), 32 × 22 + f2(12 – 2), 32 × 32 +
f2(12 – 3), 32 × 42 + f2(12 – 4), 32 × 52 +
+ f2(12 – 5), 32 × 62 + f2(12 – 6)} = min
{1224, 992, 872, 864, 968, 1146, 1408} = 864.
Izračunom
svih vrijednosti funkcije f3 dobivamo sljedeću tablicu:
c
|
\( f_1(c)\)
|
\(x_1^*\)
|
f2(c)
|
\(x_2^*\)
|
f3(c)
|
\(x_3^*\)
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
10
|
1
|
10
|
0
|
10
|
0
|
2
|
40
|
2
|
34
|
1
|
34
|
0
|
3
|
90
|
3
|
64
|
1
|
64
|
0
|
4
|
160
|
4
|
114
|
1
|
96
|
1
|
5
|
250
|
5
|
184
|
1
|
146
|
1
|
6
|
360
|
6
|
256
|
2
|
216
|
1
|
7
|
\(\infty\)
|
6
|
346
|
2
|
288
|
1
|
8
|
\(\infty\)
|
6
|
456
|
2
|
378
|
1
|
9
|
\(\infty\)
|
6
|
576
|
3
|
474
|
2
|
10
|
\(\infty\)
|
6
|
744
|
4
|
584
|
2
|
11
|
\(\infty\)
|
6
|
960
|
5
|
704
|
2
|
12
|
\(\infty\)
|
6
|
1224
|
6
|
864
|
3
|
Tablica 13. Rezultati svih triju faza rješenja
Primjera 3
Vrijednost
\(x_3^*\) označava optimalnu proizvodnju u
trećem mjesecu za koju se postiže pripadna optimalna vrijednost f3(c),
a ''očitava'' se iz odgovarajućeg izračuna vrijednosti funkcije f3.
Konkretno, za c = 12 minimalni ukupni troškovi proizvodnje iznose 864
n.j. Ti se troškovi dobiju kao zbroj 32 · 32 + f2(12
– 3), odnosno postižu se proizvodnjom točno \(x_3^*\)
= 3 komada proizvoda
u trećem mjesecu, te točno 12 – 3 = 9 proizvoda u prva dva mjeseca. Za c
= 9 odgovarajuća optimalna količina proizvodnje u drugom mjesecu je \(x_2^*\) = 3, pa u drugom mjesecu treba
proizvesti točno 3 proizvoda. Stoga u prvom mjesecu treba proizvesti točno \(x_1^*\) = 12 – (3 + 3) = 6 proizvoda.
Dakle,
traženi optimalni plan proizvodnje je:
Mjesec
|
optimalan broj
proizvoda
|
1.
|
6
|
2.
|
3
|
3.
|
3
|
Tablica 14. Rješenje Primjera 3
a
pripadni optimalni troškovi proizvodnje iznose f3(12) = 864
n.j.
Rješenje s pomoću programa WinQSB: U ovome ćemo
primjeru postupiti analogno Primjeru 1, ali uz jednu nužnu modifikaciju. Naime,
problem naprtnjače je maksimizacijski problem, tj. traži se
maksimizacija vrijednosti svih namirnica koje stavljamo u naprtnjaču. Stoga
potprogram DP pri rješavanju problema naprtnjače traži maksimum
funkcije cilja. No problem koji ovdje promatramo je minimizacijski
problem jer zahtijevamo minimizaciju ukupnih troškova. Na temelju standardne
veze između problema minimizacije i problema maksimizacije:
min f(x) = –max(–f(x)),
gdje
je f(x) funkcija cilja, polazni matematički model možemo zapisati
u obliku:
maksimizirati f(x1, x2,
x3) = –10 ×
\(x_1^2\) – 24 × \(x_2^2\) – 32 × \(x_3^2\)
pod
uvjetima
x1 + x2
+ x3 = 12,
\( x_1,x_2,x_3\in [6]_0 \).
Ovaj
problem možemo riješiti potpuno analogno kao i zatvoreni problem naprtnjače,
pri čemu modificiranu funkciju cilja npr. možemo shvatiti kao ukupne troškove
prijevoza svih vrsta namirnica (svaki negativni predznak uobičajeno ekonomski
interpretiramo kao trošak).
Pokrenimo
potprogram DP, odaberimo proceduru Knapsack Problem, nazovimo
problem koji ćemo rješavati Primjer 3 i, kao Number of Items
ponovno upišimo 3. Potom kliknimo na OK.
U
sljedećem koraku unesimo ulazne podatke.
U
drugi stupac (Item Identification) upišimo M1, M2 i M3. Te oznake sugerirat
će nam na koji se mjesec (prvi, drugi ili treći) odnosi odgovarajući rezultat.
U
treći stupac (Units Available) upišimo najveće moguće kapacitete
mjesečne proizvodnje. Sva tri kapaciteta su jednaka 6, pa u stupac unosimo tri
''šestice''.
U
četvrti stupac (Unit Capacity Required), kako smo već istaknuli u
rješenju Primjera 1, upisujemo tri ''jedinice''.
U
peti stupac (Return Function (X: Item ID)) upisujemo
pojedine komponente modificirane funkcije cilja, tj. funkcije cilja koja
se odnosi na odgovarajući problem maksimizacije. Upisujemo redom: –10*X^2,
-24*X^2 i -32*X^2.
U
posljednji redak tablice (Capacity =) upišimo ukupnu količinu proizvoda
koju treba proizvesti, tj. 12.
Time
je unos ulaznih podataka završen. Kliknimo na izbornik Solve and Analyze,
a potom na opciju Solve the Problem. Dobivamo tablicu u kojoj je
navedeno optimalno rješenje promatranoga problema.
To
optimalno rješenje očitavamo u trećem stupcu tablice (Decision Quantity).
Iz tog stupca proizlazi da u prvom mjesecu treba proizvesti 6 proizvoda, a u
drugom i trećem po 3 proizvoda. Ukupne minimalne troškove proizvodnje
''očitamo'' iz posljednjega retka (Total Return Value): ondje je naveden
broj –864. Negativan predznak, kako smo istaknuli, označava da je riječ o
troškovima, pa zaključujemo da su optimalni ukupni troškovi proizvodnje 864
n.j.
Primjer 4. Koristeći se programom WinQSB
analizirajmo što bi se dogodilo s optimalnim rješenjima Primjera 3 kada bi
najveći mjesečni kapacitet proizvodnje bio 6000 komada, a tromjesečna potražnja
12000 komada.[11].
Uzmemo
li kao mjernu jedinicu 1000 komada proizvoda, dobit ćemo sljedeći optimalan
plan:
mjesec
|
1.
|
2.
|
3.
|
optimalna
proizvodnja
[000 kom.]
|
6
|
3
|
3
|
Tablica 15. Prvi optimalan plan proizvodnje u
Primjeru 4
pri
čemu optimalni ukupni troškovi proizvodnje iznose 864 milijuna n.j. Taj se
optimalni plan dobije izravno iz gore navedenoga rješenja Primjera 3 uz nužno
redefiniranje odgovarajućih mjernih jedinica.
Uzmemo
li kao mjernu jedinicu 100 komada proizvoda, tj. da su mjesečni kapacitet
proizvodnje 60 [stotina komada proizvoda] i planirana tromjesečna potražnja 120
[stotina komada proizvoda], dobit ćemo sljedeći optimalan plan:
mjesec
|
1.
|
2.
|
3.
|
optimalna
proizvodnja
[stotina kom.]
|
60
|
34
|
26
|
Tablica 16. Drugi optimalan plan proizvodnje u
Primjeru 4
pri
čemu optimalni ukupni troškovi proizvodnje iznose 853 760 000 n.j. Dobiveni
optimalni plan očito se bitno razlikuje od plana navedenog u tablici 15.
Nadalje,
uzmemo li kao mjernu jedinicu 10 komada proizvoda, tj. da su mjesečni kapacitet
proizvodnje 600 [desetina komada proizvoda] i planirana tromjesečna potražnja
1200 [desetina komada proizvoda], dobit ćemo sljedeći optimalan plan:
mjesec
|
1.
|
2.
|
3.
|
optimalna
proizvodnja
[desetina kom.]
|
600
|
343
|
257
|
Tablica 17. Treći optimalan plan proizvodnje u
Primjeru 4
pri
čemu pripadni optimalni troškovi proizvodnje iznose 853 714 400 n.j. Isti
rezultat dobiva se ako se za mjernu jedinicu uzme 5 komada proizvoda. Izborom 1
komada proizvoda za mjernu jedinicu dobiva se poruka programa Subscript out
of range, tj. nemogućnost rješavanja problema. Stoga možemo zaključiti da
je optimalno rješenje \[(x_1^*,x_2^*,x_3^*) =
(6000,3430,2570)\] i da je u ovom slučaju za mjernu jedinicu proizvodnje
pogodno odabrati 10 komada proizvoda, a ne 1000 komada proizvoda, kako se
isprva čini.
Primjer 5. Tijekom jednoga mjeseca (4
tjedna) treba proizvesti točno 11 komada nekoga proizvoda. Troškovi proizvodnje
xi komada proizvoda u i–tom tjednu zadani su izrazom wi
×\(x_i^2\), gdje su wi
strogo pozitivni realni parametri. Tijekom jednoga tjedna moguće je proizvesti
najviše 5 komada proizvoda (moguće je da u jednom tjednu ne bude proizveden
niti jedan proizvod). Treba izraditi plan proizvodnje tako da ukupni troškovi
budu minimalni.
a)
Odredimo
matematički model promatranoga problema.
b) Riješimo model
za w1 = 12, w2 = 24, w3 =
40 i w4 = 30.
Matematički model: Ukupne
troškove proizvodnje računamo prema formuli
f (x1, x2,
x3, x4) =\(\sum\limits_{i
= 1}^4 {{w_i} \cdot x_i^2} \).
Ukupan
broj proizvedenih komada mora biti jednak 11, što znači da mora vrijediti
jednakost
\( \sum\limits_{i = 1}^4 {{x_i}} = 11\).
Budući
da se tijekom jednoga tjedna može proizvesti najviše 5 komada proizvoda i da
ukupan broj proizvedenih komada nužno mora biti prirodan broj ili nula, za
svaki \(i \in [4]\) vrijedi
uvjet \(x_i \in [5]_0\). Stoga odgovarajući matematički model glasi:
minimizirati f (x1, x2,
x3, x4) = \(\sum\limits_{i
= 1}^4 {{w_i} \cdot x_i^2} \)
pod
uvjetima
\(\sum\limits_{i =
1}^4 {{x_i}} = 11\);
\(x_i\in [5]_0\),
za svaki \(i \in [4]\).
b) U konkretnom je
slučaju matematički model sljedeći:
minimizirati f (x1, x2,
x3, x4) = \(12
\cdot x_1^2 + 24 \cdot x_2^2 + 40 \cdot x_3^2 + 30 \cdot x_4^2\)
pod
uvjetima
\(\sum\limits_{i =
1}^4 {{x_i}} = 11\);
\(x_i\in [5]_0\),
za svaki \(i \in [4]\).
Analitičko rješenje: Stavimo C
:= [11]0, pa za svaki \(c\in C\) računamo vrijednosti četiriju realnih
funkcija \(f_1,f_2,f_3,f_4:C\to \mathbb{R}\):[12]
f1(c) = 12 × c2;
f2(c) =\( \min\limits_{\begin{subarray}{l} 0
\leqslant {x_2} \leqslant \min \left\{ {c,5} \right\} \\ {x_2} \in \mathbb{Z}
\end{subarray}} \left[ {24 \cdot x_2^2 + {f_1}(c - {x_2})} \right]\);
f3(c) =\( \min\limits_{\begin{subarray}{l} 0
\leqslant {x_3} \leqslant \min \left\{ {c,5} \right\} \\ {x_3} \in \mathbb{Z}
\end{subarray}} \left[ {40 \cdot x_3^2 + {f_2}(c - {x_3})} \right]\);
f4(c) =\( \min\limits_{\begin{subarray}{l} 0
\leqslant {x_4} \leqslant \min \left\{ {c,5} \right\} \\ {x_4} \in \mathbb{Z}
\end{subarray}} \left[ {30 \cdot x_4^2 + {f_3}(c - {x_4})} \right]\).
Pri
izračunu vrijednosti ovih funkcija treba imati na umu da zbog polaznih uvjeta ne
postoje sljedeće vrijednosti:
-
\(f_1(6),f_1(7),\ldots,f_1(11) \) jer se u prvom (ali i bilo
kojem!) tjednu može proizvesti najviše 5 proizvoda;
-
f2(11) jer se u
prva (ali i bilo koja!) dva tjedna može proizvesti najviše 2 × 5 = 10
proizvoda.
Izračunom
svih vrijednosti definiranih realnih funkcija dobiva se sljedeća tablica:
c
|
\(f_1(c)\)
|
\(x_1^*\)
|
f2(c)
|
\(x_2^*\)
|
f3(c)
|
\(x_3^*\)
|
f4(c)
|
\(x_1^*\)
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
12
|
1
|
12
|
0
|
12
|
0
|
12
|
0
|
2
|
48
|
2
|
36
|
1
|
36
|
0
|
36
|
0
|
3
|
108
|
3
|
72
|
1
|
72
|
0
|
66
|
1
|
4
|
192
|
4
|
132
|
1
|
112
|
1
|
102
|
1
|
5
|
300
|
5
|
204
|
2
|
172
|
1
|
142
|
1
|
6
|
\(\infty\)
|
5
|
288
|
2
|
244
|
1
|
202
|
1
|
7
|
\(\infty\)
|
5
|
396
|
2
|
328
|
1
|
274
|
1
|
8
|
\(\infty\)
|
5
|
516
|
3
|
436
|
1
|
358
|
1
|
9
|
\(\infty\)
|
5
|
684
|
4
|
556
|
1, 2
|
448
|
2
|
10
|
\(\infty\)
|
5
|
900
|
5
|
676
|
2
|
556
|
2
|
11
|
\(\infty\)
|
5
|
\(\infty\)
|
5
|
844
|
2
|
676
|
2
|
Tablica 18. Rezultati svih četiriju faza rješenja
Primjera 5
(Zapis
1, 2 označava da se optimalna vrijednost odgovarajuće funkcije postiže za \(x_3^*\) = 1 i za \(x_3^*\) = 2).
Preostaje
''očitati'' rješenje postavljenoga problema. Optimalna vrijednost ukupnih
troškova proizvodnje 11 komada proizvoda jednaka je f4(11) =
676 n.j. Ta se vrijednost postiže za \(x_4^*\)
= 2, što znači da u četvrtom tjednu treba proizvesti točno dva proizvoda. Stoga
u prva tri tjedna treba proizvesti ukupno 11 – 2 = 9 proizvoda. Optimalni
troškovi proizvodnje točno 9 proizvoda u prva tri tjedna iznose f3(9)
= 556 n.j. i postižu se za \(x_3^*\) = 1 ili
\(x_3^*\) = 2. Zbog toga razlikujemo dvije
mogućnosti:
1)
U trećem tjednu proizvede se točno jedan proizvod (tj. \(x_3^*\) = 1). Tada u
prva dva tjedna treba proizvesti točno 9 – 1 = 8 proizvoda. Optimalni troškovi
proizvodnje 8 proizvoda u prva dva tjedna iznose f2(8) = 516
n.j. i postižu se za \(x_3^*\) = 3. Zbog toga u drugom tjednu
treba proizvesti točno 3 proizvoda, pa u prvom tjednu preostaje proizvesti
ukupno \(x_1^*\) = 8 – 3 = 5 proizvoda.
2)
U trećem tjednu proizvedu se točno dva proizvoda (tj. \(x_3^*\)= 2). Tada u prva dva tjedna treba
proizvesti točno 9 – 2 = 7 proizvoda. Optimalni troškovi proizvodnje 7
proizvoda u prva dva tjedna iznose f2(7) = 396 n.j. i postižu
se za \(x_2^*\) = 2. Stoga u drugom tjednu treba proizvesti
točno 2 proizvoda, pa u prvom tjednu preostaje proizvesti točno \(x_1^*\) = 7 – 2 = 5 proizvoda.
Tako
smo dobili ukupno dva optimalna plana proizvodnje:
Plan 1:
tjedan
|
1.
|
2.
|
3.
|
4.
|
optimalna
proizvodnja
[kom.]
|
5
|
3
|
1
|
2
|
Tablica 19. Prvi optimalan plan proizvodnje u
Primjeru 5
Plan 2:
tjedan
|
1.
|
2.
|
3.
|
4.
|
optimalna
proizvodnja
[kom.]
|
5
|
2
|
2
|
2
|
Tablica 20. Drugi optimalan plan proizvodnje u
Primjeru 5
Rješenje s pomoću programa WinQSB: Na ovom ćemo
primjeru uočiti jedan od glavnih nedostataka potprograma DP: nemogućnost
ispisa barem dvaju optimalnih rješenja (ako ona postoje, naravno). Naime,
potprogram će – kao izlazni rezultat – ispisati točno jedan optimalni plan i ne
postoji nikakva mogućnost da bilo kojom od implementiranih procedura dobijemo
ispis drugoga optimalnog plana.
Sâm
postupak rješavanja problema s pomoću programa WinQSB potpuno je
analogan onome iz prethodnoga primjera. Najprije problem minimizacije
''pretvorimo'' u problem maksimizacije:
maksimizirati f (x1, x2,
x3, x4) = \(
- 12 \cdot x_1^2 - 24 \cdot x_2^2 - 40 \cdot x_3^2 - 30 \cdot x_4^2\)
pod
uvjetima
x1 + x2
+ x3 + x4 = 11;
\( x_1,x_2,x_3,x_4 \in [5]_0 \).
Potom
pokrenemo potprogram DP, odaberemo proceduru Knapsack Problem,
nazovimo problem koji ćemo rješavati Primjer 5, a u pravokutnik
pored natpisa Number of Items upišimo 4. Potom kliknimo na OK.
Unesimo
ulazne podatke za razmatrani primjer na sljedeći način:
-
u
drugi stupac (Item Identification) upišimo: T1, T2, T3 i T4. Tako ćemo u
izlaznom rezultatu moći ''očitati'' opseg proizvodnje u svakom pojedinom
tjednu;
-
u
treći stupac (Units Available) upišimo maksimalne tjedne kapacitete
proizvodnje: oni su jednaki 5, pa upišimo ukupno četiri ''petice'';
-
u
četvrti stupac (Unit Capacity Required) upišimo onoliko ''jedinica''
koliko imamo tjedana: dakle, upišimo četiri ''jedinice'';
-
u
peti stupac (Return Function (X: Item ID)) upišimo
komponente modificirane funkcije cilja koje se odnose na svaki pojedini tjedan:
dakle, upišimo redom –12*X^2, –24*X^2, –40*X^2 i –30*X^2;
-
u
posljednji redak (Capacity=) upišimo ukupan broj komada proizvoda koje
treba proizvesti, tj. 11.
Ovime
je unos ulaznih podataka završen. Lijevom tipkom miša kliknimo na izbornik Solve
and Analyze i odaberimo opciju Solve the Problem. Kao rješenje
razmatranoga problema dobivamo samo Plan 2 iz analitičkoga rješenja,
tj. u prvom tjednu treba proizvesti 5 komada proizvoda, a u svakom od preostala
tri tjedna po dva komada proizvoda. Vrijednost Total Return Value = –676
znači da pripadni optimalni ukupni troškovi iznose 676 n.j.
Primjer 6. Analogno u Primjeru 4, koristeći
se računalnim programom WinQSB, analizirajmo što bi se dogodilo s optimalnim
rješenjima kada bi najveći tjedni kapacitet proizvodnje bio 5000 komada, a
mjesečna potražnja 11000 komada proizvoda.[13]
Uzmemo
li kao mjernu jedinicu 1000 komada, dobit ćemo sljedeći optimalan plan:
Plan 1*:
tjedan
|
1.
|
2.
|
3.
|
4.
|
optimalna
proizvodnja
[000 kom.]
|
5
|
2
|
2
|
2
|
Tablica 21. Prvi optimalan plan proizvodnje u
Primjeru 6
uz
pripadne optimalne troškove od 676 milijuna kuna. Primijetimo da je i plan
Plan 2*:
tjedan
|
1.
|
2.
|
3.
|
4.
|
optimalna
proizvodnja
[000 kom.]
|
5
|
3
|
1
|
2
|
Tablica 22. Drugi optimalan plan proizvodnje u
Primjeru 6
također
optimalan. Oba navedena plana mogu se dobiti izravno iz analitičkoga rješenja
Primjera 5 uz odgovarajuće redefiniranje mjernih jedinica, a drugi navedeni
plan (ponovno) nije moguće dobiti s pomoću programa WinQSB.
Uzmemo
li kao mjernu jedinicu 100 komada proizvoda, dobit ćemo sljedeći optimalan
plan:
Plan 1**:
tjedan
|
1.
|
2.
|
3.
|
4.
|
optimalna
proizvodnja [stotina
kom.]
|
50
|
25
|
15
|
20
|
Tablica 23. Treći optimalan plan proizvodnje u
Primjeru 6
Dakle,
u prvom tjednu treba proizvesti 5000 komada proizvoda, u drugom 2500 komada
proizvoda, u trećem 1500 komada proizvoda, a u četvrtom 2000 komada proizvoda
uz pripadne optimalne troškove od 660 milijuna n.j. Isti rezultat dobije se ako
se kao mjerne jedinice odaberu 10 komada proizvoda, odnosno 5 komada proizvoda.
Stoga je u ovom slučaju za mjernu jedinicu proizvodnje pogodno odabrati 100
komada proizvoda.
Zanimljivo
je primijetiti da je Plan 1**, grubo govoreći, aritmetička
sredina Planova 1* i 2*. Preciznije, optimalna proizvodnja
u i–tom tjednu prema Planu 1** je aritmetička sredina
optimalnih planova proizvodnje u istom tjednu dobivenih prema Planu 1*
i Planu 2*.
Zaključno
istaknimo da postoje još neki ekonomski problemi koji se mogu svesti na problem
jednostavne razdiobe ulaganja, ali ih zbog opsežnosti članka ovdje nismo
razmatrali. Čitatelje zainteresirane za daljnje primjene upućujemo na
literaturu [1] ili [5].
LITERATURA:
1. M.J. Beckmann: Dynamic
Programming of Economic Decisions, Springer–Verlag, New York, 1968
2. R. Bellman: Dynamic
Programming, Dover Publications, 2003
3. D. Kalpić, V.
Mornar: Operacijska istraživanja, ZEUS, Zagreb, 1996.
4. L. Neralić: Uvod
u matematičko programiranje 1, Element, Zagreb, 2003.
5. J. Petrić: Operaciona
istraživanja, Nauka, Beograd, 1997.
6. J. Petrić
et.al.: Operaciona istraživanja – zbirka rešenih zadataka, Nauka,
Beograd, 1996.
7.
H. Kellerer, U. Pferschy, D. Pisinger: Knapsack
Problems, Springer, 2004
8.
S. Martello, P. Toth: Knapsack Problems,
Wiley, 1990
[2] Iz navedenih razloga
u takvim slučajevima govorimo o cjelobrojnom programiranju.
[3] Navedeno svojstvo
programa WinQSB je, zapravo, njegova osnovna manjkavost jer smo,
prigodom rješavanja problema u kojima je relativna većina svih numeričkih
vrijednosti strogo veća od 500, zapravo prisiljeni na redefiniranje pripadnih
mjernih jedinica.
[4] Skraćenica za: novčanih
jedinica. U danom primjeru, taj iznos može biti višekratnik nekog elementa
iz skupa {1, 100, 1.000, 1.000.000 ... }.
[5] Vrijednost
predmeta obično se definira kao umnožak njegove mase (ili obujma) i jedinične
cijene (tj. cijene po jedinici mase ili obujma).
[6] Vrijednost namirnice
obično se definira kao umnožak njezine mase (ili obujma) i jedinične cijene
(tj. cijene po jedinici mase ili obujma).
[7] Pritom
pretpostavljamo da su sve vrijednosti M, vi i mi
nenegativne (to su tzv. prirodni uvjeti).
[8] Izomorfni
modeli se, dakle, mogu razlikovati u interpretacijama, ali ne i u tipovima
varijabli. Npr. ako su u modelu A varijable nužno cjelobrojne, a u
modelu B nužno realne, onda takvi modeli nisu izomorfni. Analogna
tvrdnja vrijedi i za (ne)jednadžbe koje opisuju uvjete.
[9] Označimo li sa S
skup svih mogućih iznosa ulaganja, onda je za svaki \( i \in [n]\) \(f_i:S\to \mathbb{R}\) realna
funkcija čije su vrijednosti u konkretnom slučaju zadane tablično, a ne
analitički (formulom). Zbog toga ovaj primjer ne rješavamo koristeći se
računalnim programom WinQSB.
[10] C = 4 posljedica je
zahtjeva da svi iznosi ulaganja moraju biti višekratnici broja 1.000.000. Bez
toga zahtjeva, tj. samo uz zahtjev cjelobrojnosti ulaganja, morali bismo uzeti C
= 4.000.000. Radi jednostavnosti i računanja s ''manjim brojevima'', valutna
jedinica kapitala u ovome je slučaju 1.000.000,00 kn.
[11] Svi ostali numerički
podaci ostaju neizmijenjeni.
[12] Preciznije,
problem se rješava u ukupno četiri faze, pri čemu se, za svaki \( i\in [4] \), u i–toj fazi
računaju vrijednosti funkcije fi.
[13] Svi ostali numerički
podaci ponovno ostaju neizmijenjeni.