From b49b5e3592d25919f541be17d137e121c65e49b4 Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Mon, 21 Apr 2025 15:35:25 +0200 Subject: [PATCH] wip wdwr report --- .../WDWR/projekt/doc/combined_document.md | 771 +++++++++++++++ Programming/WDWR/projekt/doc/main.pdf | Bin 0 -> 90182 bytes Programming/WDWR/projekt/doc/main.tex | 921 ++++++++++++++++++ 3 files changed, 1692 insertions(+) create mode 100644 Programming/WDWR/projekt/doc/combined_document.md create mode 100644 Programming/WDWR/projekt/doc/main.pdf create mode 100644 Programming/WDWR/projekt/doc/main.tex diff --git a/Programming/WDWR/projekt/doc/combined_document.md b/Programming/WDWR/projekt/doc/combined_document.md new file mode 100644 index 00000000..7e5fb9b1 --- /dev/null +++ b/Programming/WDWR/projekt/doc/combined_document.md @@ -0,0 +1,771 @@ +## **Politechnika Warszawska Instytut Automatyki i Informatyki Stosowanej** + +**Sprawozdanie z projektu na przedmiot Wspomaganie Decyzji w Warunkach Ryzyka** + +Krzysztof Rudnicki 307585 + + +## **Spis treści** + +| 1 | Treść zadania | 2 | +|---|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------| +| 2 | Jednokryterialny model wyboru w warunkach ryzyka z wartością oczekiwaną jako miarą
zysku
2.1
Zbiory indeksowe
.
2.2
Parametry
2.3
Zmienne
2.4
Ograniczenia
.
2.5
Funkcja celu | 3
3
3
4
4
4 | +| 3 | Dwukryterialny model zysku i ryzyka z wartoscią oczekiwaną jako miarą zysku i od
chyleniem maksymalnym jako miarą ryzyka
3.1
Zbiory indeksowe
.
3.2
Parametry
3.3
Zmienne
3.4
Ograniczenia
.
3.5
Metoda punktu odniesienia
. | 5
5
5
5
5
6 | +| 4 | Wyznaczenie parametrów zadania z rozkładu t-Studenta | 6 | +| 5 | Model dla programu AMPL
5.1
Plik z modelem (.mod)
5.2
Plik z danymi (.dat)
5.3
Skrypty uruchomieniowe (.run) | 8
8
11
14 | +| 6 | Rozwiązanie zadania optymalizacji
6.1
Wyniki dla modelu jednokryterialnego
.
6.2
Wyniki dla modelu dwukryterialnego
6.2.1
Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk
.
6.2.2
Analiza relacji dominacji stochastycznej dla trzech wybranych rozwiązań efek
tywnych | 16
16
19
19
21 | + + +## **WDWR 18402** + +Rozważamy następujące zagadnienie planowania produkcji: + +• Przedsiębiorstwo wytwarza 4 produkty P1,. . . ,P4 na następujących maszynach: 4 szlifierkach, 2 wiertarkach pionowych, 3 wiertarkach poziomych, 1 frezarce i 1 tokarce. Wymagane czasy produkcji 1 sztuki produktu (w godzinach) w danym procesie obróbki zostały przedstawione w poniższej tabeli: + +| | P1 | P2 | P3 | P4 | +|-------------------|------|------|------|------| +| Szlifowanie | 0,4 | 0,6 | — | — | +| Wiercenie pionowe | 0,2 | 0,1 | — | 0,6 | +| Wiercenie poziome | 0,1 | — | 0,7 | — | +| Frezowanie | 0,06 | 0,04 | — | 0,05 | +| Toczenie | — | 0,05 | 0,02 | — | + +• Dochody ze sprzedaży produktów (w zł/sztukę) określają składowe wektora losowego **R** = (*R*1*, . . . , R*4) *T* . Wektor losowy **R** opisuje 4-wymiarowy rozkład *t*-Studenta z 5 stopniami swobody, którego wartości składowych zostały zawężone do przedziału [5; 12]. Parametry *µ* oraz **Σ** niezawężonego rozkładu *t*-Studenta są następujące: + +$$ +\mu = \begin{pmatrix} 9 \\ 8 \\ 7 \\ 6 \end{pmatrix}, \qquad \Sigma = \begin{pmatrix} 16 & -2 & -1 & -3 \\ -2 & 9 & -4 & -1 \\ -1 & -4 & 4 & 1 \\ -3 & -1 & 1 & 1 \end{pmatrix}. +$$ + +• Istnieją ograniczenia rynkowe na liczbę sprzedawanych produktów w danym miesiącu: + +| | P1 | P2 | P3 | P4 | +|---------|-----|-----|-----|-----| +| Styczeń | 200 | 0 | 100 | 200 | +| Luty | 300 | 100 | 200 | 200 | +| Marzec | 0 | 300 | 100 | 200 | + +- Jeżeli w danym miesiącu jest sprzedawany produkt P1 lub P2, to musi być również sprzedawany produkt P4 w ilości nie mniejszej niż suma sprzedawanych produktów P1 i P2. +- Istnieje możliwość składowania do 200 sztuk każdego produktu w danym czasie w cenie 1 zł/sztukę za miesiąc. Aktualnie firma nie posiada żadnych zapasów, ale jest pożądane mieć po 50 sztuk każdego produktu pod koniec marca. +- Przedsiębiorstwo pracuje 6 dni w tygodniu w systemie dwóch zmian. Każda zmiana trwa 8 godzin. Można założyć, że każdy miesiąc składa się z 24 dni roboczych. +- 1. Zaproponować jednokryterialny model wyboru w warunkach ryzyka z wartością oczekiwaną jako miarą zysku. Wyznaczyć rozwiązanie optymalne. +- 2. Jako rozszerzenie powyższego zaproponować dwukryterialny model zysku i ryzyka z wartością oczekiwaną jako miarą zysku i odchyleniem maksymalnym jako miarą ryzyka. Dla decyzji **x** *∈ Q* odchylenie maksymalne jest definiowane jako *D*(**x**) = max*t*=1*,...,T |µ*(**x**) *− rt*(**x**)*|*, gdzie *µ*(**x**) oznacza wartość oczekiwaną, *rt*(**x**) realizację dla scenariusza *t*. + - a. Wyznaczyć obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko–zysk. + - b. Wskazać rozwiązania efektywne minimalnego ryzyka i maksymalnego zysku. Jakie odpowiadają im wartości w przestrzeni ryzyko–zysk? + - c. Wybrać trzy dowolne rozwiązania efektywne. Sprawdzić czy zachodzi pomiędzy nimi relacja dominacji stochastycznej pierwszego rzędu. Wyniki skomentować, odnieść do ogólnego przypadku. + + +## **2 Jednokryterialny model wyboru w warunkach ryzyka z wartością oczekiwaną jako miarą zysku** + +W celu rozwiązania postawionego zadania dokonano sformułowania modelu programowania liniowego całkowitoliczbowego. Poniżej przedstawiono zapis matematyczny modelu. + +## **2.1 Zbiory indeksowe** + +| Zbiór | Opis | +|-------------------|------------------------------------------------------| +| P =
P1, , P4 | Zbiór wytwarzanych produktów | +| T =
T1, , T5 | Zbiór typów narzędzi wykorzystywanych przy produkcji | +| M =
M1, M2, M3 | Zbiór kolejnych miesięcy produkcji | + +## **2.2 Parametry** + +| Parametr | Opis | +|----------------------------|-----------------------------------------------------------------------| +| tct | Liczba narzędzi typu t [szt] | +| eppup | Oczekiwany zysk ze sprzedaży jednej sztuki produktu
p [zł] | +| ttputp | Czas wykorzystania maszyny typu
t przy produkcji jednej sztuki pro | +| | duktu
p [godz] | +| smlmp | Limit sprzedaży produktu
p w miesiącu
m [szt] | +| stlp | Limit pojemności magazynu na produkt
p [szt] | +| stcpu | Koszt magazynowania jednej sztuki dowolnego produktu [zł] | +| st0p | Początkowy stan magazynowy produktu
p [szt] | +| dstp | Porządany końcowy stan magazynowy produktu
p [szt] | +| dpm | Liczba dni roboczych w każdym miesiącu [d] | +| spd | Liczba zmian w każdym dniu roboczym [j] | +| whps | Liczba godzin roboczych w ciągu każdej zmiany [godz] | +| whpm =
dpm · spd · hps | Liczba godzin roboczych w ciągu każdego miesiąca [godz] | +| =
attt
tct
∗ whpm | Dostępna liczba godzin roboczych maszyn typu
t w ciągu każdego | +| | miesiąca [godz] | + + +## **2.3 Zmienne** + +| Zmienna | Opis | +|----------------------------------------------------|--------------------------------------------------------------------| +| pmp | Liczba sztuk produktu
p wyprodukowanych w miesiącu
m [szt] | +| smp | Liczba sztuk produktu
p sprzedanych w miesiącu
m [szt] | +| X
=
tsp
smp | Całkowita liczba sprzedanych sztuk produktu
p | +| m∈M | | +| =
stdmp
pmp
− smp | Liczba sztuk produktu
p zmagazynowanych w miesiącu
m [szt] | +| Xm
=
st0p
+
stgmp
stdm2p
m2=1 | Stan magazynowy produktu
p na koniec miesiąca
m [szt] | +| X
uttmt
=
pmp
∗ ttputp
p∈P | Wykorzystanie czasu pracy maszyny typu
t w miesiącu
m [godz] | +| X
X
tstc =
stcpu ·
stgmp
m∈M
p∈P | Całkowity koszt wykorzystania magazynów [zł] | +| ep = (X
tsp
· eppup)
− tstc | Wartość zysku całkowitego dla wartości oczekiwanych zysku ze | +| p∈P | sprzedaży produktów [zł] | + +## **2.4 Ograniczenia** + +Ograniczenie rynkowe sprzedawanych produktów: + +*smp* 6 *smlmp, m M, p P* + +Ograniczenie sprzedaży produktów w pierszym miesiącu: + +$$s\_{1p} \leqslant p\_{1p}, \quad \forall p \in P$$ + +Ograniczenie sprzedaży produktów w kolejnych miesiącach: + +$$s\_{mp} \leqslant p\_{mp} + stg\_{mp}, \quad \forall m \in M \backslash \{1\}$$ + +Ograniczenie na powiązanie sprzedaży produktu 4 ze sprzedażą produktów 1 i 2: + +*sm*4 > *sm*1 + *sm*2*, m M* + +Ograniczenie pojemności magazynów: + +$$stg\_{mp} \leqslant stl\_p, \quad \forall p \in P$$ + +Ograniczenie na pożądany stan magazynowy na koniec miesiąca 3: + +$$stg\_{3p} \geqslant dst\_p, \quad \forall p \in P$$ + +Ograniczenie wykorzystania czasu pracy narzędzi w danym miesiącu: + +*uttmt* 6 *attt , ∀t ∈ T, ∀m ∈ M* + +## **2.5 Funkcja celu** + +Jako funkcję celu przyjęto maksymalizację wartości oczekiwanej zysku: *maximize ep* + + +# **3 Dwukryterialny model zysku i ryzyka z wartoscią oczekiwaną jako miarą zysku i odchyleniem maksymalnym jako miarą ryzyka** + +Model ten został zrealizowany jako rozszerzenie modelu jednokryterialnego o dodatkowe zbiory, parametry, zmienne, ograniczenia i nową funkcję celu. + +#### **3.1 Zbiory indeksowe** + +| Zbiór | Opis | +|--------------------|--------------------------------------------------------| +| S =
S1, , S1000 | Zbiór scenariuszy wygenerowanych z rozkładu t-Studenta | + +### **3.2 Parametry** + +| Parametr | Opis | +|----------|-----------------------------------------------------------------------| +| sppups | Zysk ze sprzedaży jednej sztuki produktu
p w scenariuszu
s [zł] | + +### **3.3 Zmienne** + +| Zmienna | Opis | +|-------------------------------------------|------------------------------------------------------------------------| +| = (X
· sppups)
sps
tsp
− tstc | Wartość zysku całkowitego dla scenariusza
s zysku ze sprzedaży | +| p∈P | produktów [zł] | +| devs
=
ep − sps | Odchylenie zysku w danym scenariuszu [zł]. Jako, że funkcja | +| | wartości bezwzględnej jest nieliniowa zmienna została poddana | +| | linearyzacji z użyciem zmiennych
ldevs,
Ps,
Qs | +| =
ldevs
ep − sps | Zmienna pomocnicza wykorzystana w linearyzacji odchylenia | +| | zysku w scenariuszu
s | +| Ps | Zmienna pomocnicza wykorzystana w linearyzacji zmiennejk | +| | devs | +| Qs | Zmienna pomocnicza wykorzystana w linearyzacji zmiennej
devs | +| mdev = maxs∈S
devs | Maksymalne odchylenie zysu [zł]. Jako, że funkcja max jest nie | +| | liniowa, zmienna została poddana linearyzacji z użyciem zmien | +| | nych
M,
Zs | +| M | Zmienna
pomocnicza
wykorzystana
w
linearyzacji
zmiennej | +| | mdev | +| Zs | Zmienna
pomocnicza
binarna
wykorzystana
w
linearyzacji | +| | zmiennej
mdev | +| r =
mdev | Miara ryzyka, równa maksymalnemu odchyleniu zysku | + +## **3.4 Ograniczenia** + +Ograniczenie związane z linearyzacją zmiennej *devs*: + +$$lde v\_{s1} - lde v\_{s2} + P\_{s1} - Q\_{s2} = 0, \quad \forall s\_1, s\_2 \in S$$ + +Ograniczenie związane z linearyzację zmiennej *mdev*: + + +$$mdev \geqslant dev\_s, \quad \forall s \in S$$ + +$$mdev \leqslant dev\_s + M(1 - Z\_s), \quad \forall s \in S$$ + +$$\sum\_{s \in S} Z\_s = 1$$ + +## **3.5 Metoda punktu odniesienia** + +Jako model preferencji dla modelu dwukryterialnego została wybrana metoda punktu odniesienia. Wprowadza ona zestaw dodatkowych parametrów i zmiennych: + +| Parametr | Opis | +|-----------|---------------------------------------------------------------------------------| +| aspep | Poziom aspiracji oczekiwanego zysku | +| aspr | Poziom aspiracji ryzyka | +| λep, λr | Współczynniki normalizujące, odpowiednio dla zysku i ryzyka. Ze względu na ogól | +| | ne sformułowanie metody punktu odniesienia jako problemu maksymalizacji,
λep | +| | przyjmie wartość dodatnią, a
ujemną.
λr | +| β | Współczynnik pomniejszający wartość ocen wykraczających powyżej poziomu aspi | +| | racji | +| ε | Współczynnik składnika regularyzacyjnego | +| Zmienne | Opis | +| ocep, ocr | Wartości indywidualnych funkcji osiągnięć dla zysku i ryzyka | +| v | Zmienna pomocnicza metody punktu odniesienia | + +Ograniczenia zmiennej *v* przez wartości indywidualnych funkcji osiągnięć: + +*v* 6 *ocep* oraz *v* 6 *ocr* + +Ograniczenia indywidualnych funkcji osiągnięć: + +$$oc\_r \leqslant \lambda\_r (r - asp\_r)$$ + +$$oc\_r \leqslant \beta \lambda\_r (r - asp\_r)$$ + +$$oc\_{ep} \leqslant \lambda\_p (ep - asp\_{ep})$$ + +$$oc\_{ep} \leqslant \beta \lambda\_p (ep - asp\_{ep})$$ + +Funkcja celu metody punktu odniesienia w postaci dla programowania liniowego: + +$$\max \quad v + \varepsilon (oc\_{ep} + oc\_r)$$ + +## **4 Wyznaczenie parametrów zadania z rozkładu t-Studenta** + +W celu wyznaczenia wartości oczekiwanej wektora *R* (odpowiadającą parametrowi modelu *eppup*) wykorzystano następującą zależność: + +$$E(R) = \mu + \sigma \cdot \frac{\Gamma(\frac{\nu - 1}{2})((\nu + a^2)^{-\frac{\nu - 1}{2}} - (\nu + b^2)^{\frac{\nu - 1}{2}})\nu^{\frac{\nu}{2}}}{2(F\_{\nu}(b) - F\_{\nu}(a))\Gamma(\frac{\nu}{2})\Gamma(\frac{1}{2})}$$ + +gdzie: + + +- *µ* wartość oczekiwana dla *R*, +- Γ funkcja gamma Eulera, +- *ν* liczba stopni swobody, +- *F* dystrybuanta standardowego rozkładu t-Studenta *t*(0*,* 1; *ν*) z *ν* stopniami swobody, +- *a* = *α−µ σ* , gdzie *α* to lewy kraniec przedziału, +- *b* = *β−µ σ* , gdzie *β*to prawy kraniec przedziału. + +Otrzymano wartości: + +*E*(*R*) *T* = [8*.*5094*,* 8*.*4710*,* 8*.*1319*,* 6*.*3944] + +Do obliczenia wartości oczekiwanej oraz wyznaczenia scenariuszy wykorzystano skrypt napisany w języku *R*. Wygenerowano 1000 scenariuszy testowtych. Użyty skrypt przedstawia Listing 1. + +Listing 1: Skrypt w języku *R* do obliczania wartości oczekiwanej wektora *R* i generowania scenariuszy z rozkładu t-Studenta. + +``` +1 library ( tmvtnorm ) +2 +3 # t- Stutdet parameters +4 Mu = c(9 , 8 , 7 , 6) +5 Sigma = matrix (c(16 , -2 , -1 , -3 , +6 -2 , 9 , -4 , -1 , +7 -1 , -4 , 4 , 1 , +8 -3 , -1 , 1 , 1) , +9 nrow =4 , ncol =4) +10 lower _ bound = 5 +11 upper _ bound = 12 +12 +13 # Generate scenarios +14 data <- rtmvt ( n =10000 , mean = mu , sigma = sigma , df =5 , lower =rep ( lower _←- + bound , 4) , upper =rep ( upper _bound , 4) ) +15 write . table ( format (data , digits =15 , drop0trailing = F ) , " data10000 .txt"←- + , quote =F , sep ="\t", eol ="\n\t", col . names = F , row . names = T ) +16 mean <- colMeans ( data ) +17 +18 E <- function ( idx , Mu , Sigma , v , alfa , beta ) { +19 mu = Mu [ idx ] +20 sigma = Sigma [ idx , idx ] +21 a = ( alfa - mu )/ sigma +22 b = ( beta - mu )/ sigma +23 nom = gamma (( v -1)/2) * +24 (( v + a ^2) ^( -1*(v -1) /2) - +25 ( v + b ^2) ^( -1*(v -1)/2) ) * +26 v ^( v/2) +27 den = 2 * (pt(b , v ) - pt(a , v ) ) * gamma ( v/2) * gamma (1/2) +28 return ( mu + sigma *( nom /den ) ) +29 } +30 +31 ER1 <- E (1 , Mu , Sigma , 5 , 5 , 12) +32 ER2 <- E (2 , Mu , Sigma , 5 , 5 , 12) +33 ER3 <- E (3 , Mu , Sigma , 5 , 5 , 12) +34 ER4 <- E (4 , Mu , Sigma , 5 , 5 , 12) +``` + + +``` +45 +46 # Aktualny stan magazynowy [szt] +47 param startingStorage { PRODUCTS } >= 0; +48 +49 # Pozadany stan magazynowy na koniec symulacji [szt] +50 param desiredEndStorage { PRODUCTS } >= 0; +51 +52 # Liczba dni roboczych w miesiacu [d] +53 param daysPerMonth >= 1; +54 +55 # Liczba zmian w ciagu jednego dnia roboczego +56 param shiftsPerDay >= 1; +57 +58 # Dlugosc zmiany [ godz ] +59 param hoursPerShift >= 1; +60 +61 # Liczba roboczogodzin w miesiacu [ godz ] +62 param workHoursPerMonth = daysPerMonth * shiftsPerDay * hoursPerShift ; +63 +64 # Czas pracy narzedzi w danym miesiacu +65 param availableToolTime { t in TOOLS } = toolCount [ t ]* workHoursPerMonth←- + ; +66 +67 # ########## +68 # Zmienne # +69 # ########## +70 # Produkcja produktow +71 var produced { MONTHS , PRODUCTS } >= 0 integer ; +72 +73 # Sprzedaz produktow w danym miesiacu +74 var sold { MONTHS , PRODUCTS } >= 0 integer ; +75 var totalSold { p in PRODUCTS } = sum { m in MONTHS } sold [m , p ]; +76 +77 # Ilosc produktow przekazanych do magazynu w danym miesiacu +78 var stored { m in MONTHS , p in PRODUCTS } = produced [m , p ] - sold [m , p←- + ]; +79 +80 # Stan magazynowy na koniec danego miesiaca +81 var storage { m in MONTHS , p in PRODUCTS } = +82 startingStorage [ p ] + sum { m2 in MONTHS : ord( m2 ) <= ord( m ) } ←- + stored [ m2 , p ]; +83 +84 # Wykorzystany czas pracy +85 var usedToolTime { m in MONTHS , t in TOOLS } = +86 sum { p in PRODUCTS } produced [m , p ]* toolTimePerUnit [t , p ]; +87 +88 # Koszt magazynowania +89 var monthlyStorageCost { m in MONTHS } = +90 (sum { p in PRODUCTS } storage [m , p ]) * storageUnitCost ; +91 var totalStorageCost = sum { m in MONTHS } monthlyStorageCost [ m ]; +92 +93 # Zysk dla wartosci oczekiwanej +94 var expectedSalesProfit = +95 sum { p in PRODUCTS } totalSold [ p ]* expectedProfitPerUnit [ p ]; +96 var expectedNetProfit = +97 expectedSalesProfit - totalStorageCost ; +``` + + +``` +98 +99 # Zysk w danym scenariuszu +100 var scenarioSalesProfit { s in SCENARIOS } = +101 sum { p in PRODUCTS } totalSold [ p ]* scenarioProfitPerUnit [s , p ]; +102 var scenarioNetProfit { s in SCENARIOS } = +103 scenarioSalesProfit [ s ] - totalStorageCost ; +104 +105 # Odchylenie jako miara ryzyka - zlinearyzowana wartosc bezwzgledna +106 var deviation { s in SCENARIOS } = +107 expectedNetProfit - scenarioNetProfit [ s ]; +108 var P { SCENARIOS } >= 0; +109 var Q { SCENARIOS } >= 0; +110 subject to deviationLimit { s1 in SCENARIOS , s2 in SCENARIOS }: +111 deviation [ s1 ] - deviation [ s2 ]+ P [ s1 ] - Q [ s2 ] = 0; +112 +113 #var maxDeviation = max {s in SCENARIOS } deviation [s]; +114 var maxDeviation ; +115 # Linearyzacja maksymalnego odchylenia jako miary ryzyka +116 param M = 10000; +117 var Z { SCENARIOS } binary ; +118 subject to mdLimit { s in SCENARIOS }: +119 maxDeviation >= deviation [ s ]; +120 subject to mdWhere { s in SCENARIOS }: +121 maxDeviation <= deviation [ s ] + M *(1 - Z [ s ]) ; +122 subject to mdOS : +123 sum { s in SCENARIOS } Z [ s ] = 1; +124 +125 # Aliasy dla ocenianych wartosci +126 var profit = expectedNetProfit ; +127 var risk = maxDeviation ; +128 +129 # ###################### +130 # Ograniczenia modelu # +131 # ###################### +132 +133 # Ograniczenie rynkowe sprzedazy produktow +134 subject to SalesMarketLimit { m in MONTHS , p in PRODUCTS }: +135 sold [m , p ] <= salesMarketLimit [m , p ]; +136 # Ograniczenie magazynowe sprzedazy produktow +137 subject to SalesLimit1 { p in PRODUCTS }: +138 sold [ first ( MONTHS ) , p ] <= produced [ first ( MONTHS ) , p ]; +139 subject to SalesLimit2 { m in MONTHS , p in PRODUCTS : m != first ( MONTHS←- + ) }: +140 sold [m , p ] <= produced [m , p ] + storage [m , p ]; +141 # Powiazanie sprzedazy produktu P4 ze sprzedaza produktow P1 i P2 +142 subject to P4SalesConstraint { m in MONTHS }: +143 sold [m , "P4"] >= sold [m , "P1"] + sold [m , "P2"]; +144 # Ograniczenie pojemnosci magazynowej +145 subject to StorageLimit { m in MONTHS , p in PRODUCTS }: +146 storage [m , p ] <= storageLimit [ p ]; +147 # Ograniczenie na pozadany stan magazynowy na koniec marca +148 subject to DesiredStorage { p in PRODUCTS }: +149 storage [ last ( MONTHS ) , p ] >= desiredEndStorage [ p ]; +150 # Ograniczenie czasu pracy narzedzi w miesiacu +151 subject to ToolWorkTime { m in MONTHS , t in TOOLS }: +152 usedToolTime [m , t ] <= availableToolTime [ t ]; +``` + + +``` +153 +154 # ############################ +155 # Metoda punktu odniesienia # +156 # ############################ +157 # Skladniki wektora oceny +158 set RATED = {" PROFIT ", " RISK "}; +159 # Wektor oceny +160 var value { r in RATED } = +161 if r == " PROFIT " then profit +162 else if r == " RISK " then risk ; +163 # Wektor aspiracji +164 param aspiration { RATED }; +165 # Wartosci utopii i nadiru +166 param utopia { RATED }; +167 param nadir { RATED }; +168 # Wspolczynniki normalizujace +169 param lambda { r in RATED } = +170 1 / ( utopia [r] - nadir [r]); +171 # Wspolczynnik skladnika regularyzacyjnego +172 param epsilon ; +173 # Wspolczynnik pomniejszenia wartosci ocen ponad poziomem aspiracji +174 param beta ; +175 # Indywidualne funkcje osiagniec +176 var individualRating { RATED }; +177 # Zmienna pomocnicza metody punktu odniesienia +178 var v; +179 # Skalaryzujaca funkcja osiagniecia +180 var rating = v + epsilon * (sum {r in RATED } individualRating [r]); +181 # Odleglosc od punktu odniesienia +182 var distance {r in RATED } = value [r] - aspiration [r]; +183 # Znormalizowana odleglosc od punktu odniesienia +184 var normalizedDistance {r in RATED } = lambda [r]* distance [r]; +185 # Ograniczenia zmiennej v przez indywidualne funkcje osiagniec +186 subject to VSubject {r in RATED }: +187 v <= individualRating [r]; +188 # Ograniczenia indywidualnych funkcji osiagniec +189 subject to IndividualRatingSubjectBeta {r in RATED }: +190 individualRating [r] <= beta * normalizedDistance [r]; +191 subject to IndividualRatingSubject {r in RATED }: +192 individualRating [r] <= normalizedDistance [r]; +193 +194 ################ +195 # Funkcje celu # +196 ################ +197 minimize MinimizeProfit : profit ; +198 maximize MaximizeProfit : profit ; +199 minimize MinimizeRisk : risk ; +200 maximize MaximizeRisk : risk ; +201 maximize RPM: rating ; +``` +**5.2 Plik z danymi (**.dat**)** + + +``` +załączniku. +1 # ########################################################## +2 # WDWR 18042 # +3 # Planowanie produkcj w warunkach ryzyka. # +4 # DANE # +5 # Autor : Jan Kumor # +6 # ########################################################## +7 +8 # Narzedzia +9 set TOOLS := GRINDER VDRILL HDRILL MILLER LATHE ; +10 +11 # Miesiace +12 set MONTHS := JAN FEB MAR ; +13 +14 # Liczba narzedzi +15 param toolCount := +16 GRINDER 4 +17 VDRILL 2 +18 HDRILL 3 +19 MILLER 1 +20 LATHE 1 +21 ; +22 +23 # Czasy produkcji h +24 param toolTimePerUnit : +25 P1 P2 P3←- + P4 := +26 GRINDER 0 .4 0 .6 0 ←- + 0 +27 VDRILL 0 .2 0 .1 0 ←- + 0 .6 +28 HDRILL 0 .1 0 0 .7 ←- + 0 +29 MILLER 0 .06 0 .04 0 0 .05 +30 LATHE 0 0 .05 0 .02 0 +31 ; +32 +33 # Ograniczenia rynkowe liczby sprzedawanych produktow pcs +34 param salesMarketLimit : +35 P1 P2 P3 ←- + P4 := +36 JAN 200 0 100 ←- + 200 +37 FEB 300 100 200 ←- + 200 +38 MAR 0 300 100 ←- + 200 +39 ; +40 +41 # Ograniczeine liczby magazynowanych produktow pcs +42 param storageLimit := +43 P1 200 +44 P2 200 +45 P3 200 +46 P4 200 +``` +Listing 3: Dane dla modelu AMPL - pominięto scenariusze, pełny zestaw danych dostępny w + + +``` +47 ; +48 +49 # Koszt magazynowania produktow pln/pcs per month +50 param storageUnitCost := 1; +51 +52 # Aktualny stan magazynowy pcs +53 param startingStorage := +54 P1 0 +55 P2 0 +56 P3 0 +57 P4 0 +58 ; +59 +60 # Pozadany stan magazynowy na koniec marca pcs +61 param desiredEndStorage := +62 P1 50 +63 P2 50 +64 P3 50 +65 P4 50 +66 ; +67 +68 # Liczba dni roboczych w miesiacu d +69 param daysPerMonth := 24; +70 +71 # Liczba zmian w ciagu jednego dnia roboczego +72 param shiftsPerDay := 2; +73 +74 # Dlugosc zmiany h +75 param hoursPerShift := 8; +76 +77 # Zyski wartosc oczekiwana +78 param expectedProfitPerUnit := +79 P1 8 .50944172786882 +80 P2 8 .47100593224391 +81 P3 8 .1319049712769 +82 P4 6 .39446520538826 +83 ; +84 +85 # Metoda punktu odniesienia +86 param epsilon = 0 .000025 ; +87 +88 param beta = 0 .001 ; +89 +90 param utopia := +91 PROFIT 11987 +92 RISK 1000 +93 ; +94 +95 param nadir := +96 PROFIT -2400 +97 RISK 2815 +98 ; +99 +100 param aspiration := +101 PROFIT 10000 +102 RISK 0 +``` + + +*smp* oraz wartość wyznaczonego rozwiązania optymalnego: + +*ep* = 11987*.*42[*z*] + +Listing 7: Wynik działania skryptu wyznaczającego rozwiązanie optymalne modelu jednokryterialnego. + +| 1 | | | # ################################################ | | | | | | | | | | | | | +|----|------------------------------------------------------------------------|------------------------------------|----------------------------------------------------|---------|--|---------|--|------------|--|--|-----------|--------------|--|--|--| +| 2 | ###
Maximize
profit
for
expected
profit
value
### | | | | | | | | | | | | | | | +| 3 | # ################################################ | | | | | | | | | | | | | | | +| 4 | CPLEX | | 12 .8.0.0 : | optimal | | integer | | solution ; | | | objective | 11987 .41899 | | | | +| 5 | | 11
MIP
simplex
iterations | | | | | | | | | | | | | | +| 6 | | 0
branch -and - bound
nodes | | | | | | | | | | | | | | +| 7 | | produced | := | | | | | | | | | | | | | +| 8 | JAN | P1 | 200 | | | | | | | | | | | | | +| 9 | JAN | P2 | 0 | | | | | | | | | | | | | +| 10 | JAN | P3 | 100 | | | | | | | | | | | | | +| 11 | JAN | P4 | 200 | | | | | | | | | | | | | +| 12 | FEB | P1 | 200 | | | | | | | | | | | | | +| 13 | FEB | P2 | 0 | | | | | | | | | | | | | +| 14 | FEB | P3 | 200 | | | | | | | | | | | | | +| 15 | FEB | P4 | 200 | | | | | | | | | | | | | +| 16 | MAR | P1 | 50 | | | | | | | | | | | | | +| 17 | MAR | P2 | 250 | | | | | | | | | | | | | +| 18 | MAR | P3 | 150 | | | | | | | | | | | | | +| 19 | MAR | P4 | 250 | | | | | | | | | | | | | +| 20 | ; | | | | | | | | | | | | | | | +| 21 | | | | | | | | | | | | | | | | +| 22 | sold | := | | | | | | | | | | | | | | +| 23 | JAN | P1 | 200 | | | | | | | | | | | | | +| 24 | JAN | P2 | 0 | | | | | | | | | | | | | +| 25 | JAN | P3 | 100 | | | | | | | | | | | | | +| 26 | JAN | P4 | 200 | | | | | | | | | | | | | +| 27 | FEB | P1 | 200 | | | | | | | | | | | | | +| 28 | FEB | P2 | 0 | | | | | | | | | | | | | +| 29 | FEB | P3 | 200 | | | | | | | | | | | | | +| 30 | FEB | P4 | 200 | | | | | | | | | | | | | +| 31 | MAR | P1 | 0 | | | | | | | | | | | | | +| 32 | MAR | P2 | 200 | | | | | | | | | | | | | +| 33 | MAR | P3 | 100 | | | | | | | | | | | | | +| 34 | MAR | P4 | 200 | | | | | | | | | | | | | +| 35 | ; | | | | | | | | | | | | | | | +| 36 | | | | | | | | | | | | | | | | +| 37 | stored | := | | | | | | | | | | | | | | +| 38 | JAN | P1 | 0 | | | | | | | | | | | | | +| 39 | JAN | P2 | 0 | | | | | | | | | | | | | +| 40 | JAN | P3 | 0 | | | | | | | | | | | | | +| 41 | JAN | P4 | 0 | | | | | | | | | | | | | +| 42 | FEB | P1 | 0 | | | | | | | | | | | | | +| 43 | FEB | P2 | 0 | | | | | | | | | | | | | +| 44 | FEB | P3 | 0 | | | | | | | | | | | | | +| 45 | FEB | P4 | 0 | | | | | | | | | | | | | +| 46 | MAR | P1 | 50 | | | | | | | | | | | | | +| 47 | MAR | P2 | 50 | | | | | | | | | | | | | +| 48 | MAR | P3 | 50 | | | | | | | | | | | | | +| 49 | MAR | P4 | 50 | | | | | | | | | | | | | + + +52 Profit: 11987.418989 + + +![](_page_0_Figure_0.jpeg) + +Rysunek 1: Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk + +## **6.2 Wyniki dla modelu dwukryterialnego** + +## **6.2.1 Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk** + +Obraz zbioru rozwiązań efektywnch w przestrzeni ryzyko-zysk został uzyskany poprzez rozwiązanie zadania metody punktu odniesienia dla różnych wartości aspiracji dla zysku oraz ryzyka. Do wykonania obliczeń posłużono się skryptem przedstawionym na [Listing 7.](#page--1-0) Obliczenia przeprowadzono ustalając poziomy aspiracji w wyznaczonych granicach zmienności zysku i ryzyka (wektory nadiru i utopii wyznaczone w kolejnej sekcji). Dla każdego poziomu aspiracji wykorzystano po 10 równoodległych wartości znajdujących się w przedziałach definiowanych przez wektory nadiru i utopii. + +Ze względu na duży rozmiar zadania, a przez długi czas obliczeń przy 1000 scenariuszach, zdecydowano się ograniczyć ich liczbę do 50. Niestety nie jest to liczba wystarczająca do przeprowadzenia dokładnych obliczeń, jednak uzyskane wyniki powinny być wystarczające do przedstawienia działania metody. + +Fragment wyników działania skryptu obliczeniowego przedstawia [Listing 8.](#page-0-0) Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk pokazuje [Rysunek 1.](#page-0-1) + +Listing 8: Skrypt obliczający wartości do wyznaczenia obrazu zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk. Pełne wyniki dostępne w załączniku. + +``` +1 ### 39: Solving model for aspirations : 2395 .666667 , 312 .777778 +2 CPLEX 12 .8.0.0 : optimal integer solution within mipgap or absmipgap ; ←- + objective 5 .427722957e -07 +3 39 MIP simplex iterations +4 0 branch -and - bound nodes +5 absmipgap = 7 .81092e -07 , relmipgap = 1 .43881 +``` + + +``` +6 Profit : 2417 .827519 +7 Risk : 311 .250020 +8 RPM : 0 .000001 +9 ### 40: Solving model for aspirations : 2395 .666667 , 0 .000000 +10 CPLEX 12 .8.0.0 : +11 < BREAK > ( cplex ) +12 CPLEX solution status 13 with fixed integers : +13 aborted in phase II +14 aborted , integer solution exists ; objective -0 .06697476417 +15 116486 MIP simplex iterations +16 103313 branch -and - bound nodes +17 absmipgap = 6 .93933e -05 , relmipgap = 0 .00103611 +18 Profit : 1432 .148909 +19 Risk : 188 .510726 +20 RPM : -0 .066975 +``` +Rozwiązania efektywne minimalnego ryzyka i maksymalnego zysku + +Rozwiązania efektywne dla minimalnego ryzyka i maksymalnego zysku wyznaczono wykorzystując skrypt przedstawiony na listingu [Listing 4.](#page--1-0) Na podstwaie wyników jego działania, które przedstawia [Listing 9](#page-0-0) można podać następujące rozwiązania: + +- Minimalne ryzyko: *ep* = *−*1000, przy *r* = 0, +- Maksymalny zysk: *ep* = 11987, przy *r* = 2569 + +Dodatkowo poza zakresem zadania wyznaczonon pozostałe elementy potrzebne do wyznaczenia wektorów nadiru i utopii: + +- Maksymalne ryzyko: *ep* = 9193, przy *r* = 2815, +- Minimalny zysk: *ep* = *−*2400*.*00, przy *r* = 0*.*00 + +``` +Wektor nadiru: (−2400, 2815) +``` +Wektor utopii: (0*,* 11987) + +Listing 9: Skrypt wyznaczający rozwiązania optymalne modelu dwukryterialnego. + +``` +1 # ######################## +2 ### Minimizing profit ### +3 # ######################## +4 CPLEX 12 .8.0.0 : optimal integer solution ; objective -2400 +5 7 MIP simplex iterations +6 0 branch -and - bound nodes +7 Profit : -2400 +8 Risk : 0 +9 +10 # ######################## +11 ### Maximizing profit ### +12 # ######################## +13 CPLEX 12 .8.0.0 : optimal integer solution ; objective 11987 .41899 +14 32 MIP simplex iterations +15 0 branch -and - bound nodes +16 Profit : 11987 +17 Risk : 2569 +18 +``` + + +``` +19 # ###################### +20 ### Minimizing risk ### +21 # ###################### +22 CPLEX 12 .8.0.0 : optimal integer solution ; objective 0 +23 0 MIP simplex iterations +24 0 branch -and - bound nodes +25 Profit : -1000 +26 Risk : 0 +27 +28 # ####################### +29 ### Maximizing risk k### +30 # ####################### +31 CPLEX 12 .8.0.0 : optimal integer solution ; objective 2815 .995263 +32 21837 MIP simplex iterations +33 705 branch -and - bound nodes +34 Profit : 9193 +35 Risk : 2815 +``` +## **6.2.2 Analiza relacji dominacji stochastycznej dla trzech wybranych rozwiązań efektywnych** + +Do analizy wybrano następujące scenariusze: + +- 1. Maksymalny zysk *ep* = 11987*.*42, +- 2. Poziomy aspiracji *aspep* = 8789*.*89 oraz *aspr* = 1876*.*67, +- 3. Poziomy aspiracji *aspep* = 10388*.*44 oraz *aspr* = 938*.*33. + +Dane do analizy zostały wygenerowane w trakcie przeprowadzania obliczeń do poprzednich podpunktów i są dostępne w załącznikach. + +Dystrybuanty zysku przedstawia [Rysunek 2.](#page--1-0) + +Na podstawie wykresów możemy stwierdzić, że rozwiązanie dla scenariusza z maksymalnym zyskiem dominuje w sensie FSD pozostałe rozwiązania. Dodatkowo widzimy, że rozwiązanie ze scenariusza 3 dominuje w sensie FSD rozwiązanie scenariusza 2. + + +![](_page_0_Figure_0.jpeg) + +Rysunek 2: Wykres dystrybuant zysku dla poszczególnych rozwiązań + + diff --git a/Programming/WDWR/projekt/doc/main.pdf b/Programming/WDWR/projekt/doc/main.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4d223785ee04974d6bc6576b7249d15db822459c GIT binary patch literal 90182 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%0A6xl1JMuid*H9%qzQ|A+I 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

5KL&* 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 s_{m1} + s_{m2}, \quad \forall m \in M$ + +Ograniczenie pojemności magazynów: + +$$stg_{mp} \leqslant stl_p, \quad \forall p \in P$$ + +Ograniczenie na pożądany stan magazynowy na koniec miesiąca 3: + +$$stg_{3p} \geqslant dst_p, \quad \forall p \in P$$ + +Ograniczenie wykorzystania czasu pracy narzędzi w danym miesiącu: + +$uttm_t \leq att_t, \quad \forall t \in T, \forall m \in M$ + +\subsection{Funkcja celu} + +Jako funkcję celu przyjęto maksymalizację wartości oczekiwanej zysku: $maximize \; ep$ + +\section{Dwukryterialny model zysku i ryzyka z wartoscią oczekiwaną jako miarą zysku i odchyleniem maksymalnym jako miarą ryzyka} + +Model ten został zrealizowany jako rozszerzenie modelu jednokryterialnego o dodatkowe zbiory, parametry, zmienne, ograniczenia i nową funkcję celu. + +\subsection{Zbiory indeksowe} + +\begin{table}[h!] +\centering +\begin{tabular}{|l|l|} +\hline +Zbiór & Opis \\ +\hline +S = S1, \ldots, S1000 & Zbiór scenariuszy wygenerowanych z rozkładu t-Studenta \\ +\hline +\end{tabular} +\end{table} + +\subsection{Parametry} + +\begin{table}[h!] +\centering +\begin{tabular}{|l|l|} +\hline +Parametr & Opis \\ +\hline +$sppu_{ps}$ & Zysk ze sprzedaży jednej sztuki produktu $p$ w scenariuszu $s$ [zł] \\ +\hline +\end{tabular} +\end{table} + +\subsection{Zmienne} + +\begin{table}[h!] +\centering +\begin{tabular}{|l|p{10cm}|} +\hline +Zmienna & Opis \\ +\hline +$sp_s = \sum_{p \in P} (ts_p \cdot sppu_{ps}) - tstc$ & Wartość zysku całkowitego dla scenariusza $s$ zysku ze sprzedaży produktów [zł] \\ +\hline +$dev_s = ep - sp_s$ & Odchylenie zysku w danym scenariuszu [zł]. Jako, że funkcja wartości bezwzględnej jest nieliniowa zmienna została poddana linearyzacji z użyciem zmiennych $ldev_s$, $P_s$, $Q_s$ \\ +\hline +$ldev_s = ep - sp_s$ & Zmienna pomocnicza wykorzystana w linearyzacji odchylenia zysku w scenariuszu $s$ \\ +\hline +$P_s$ & Zmienna pomocnicza wykorzystana w linearyzacji zmiennejk $dev_s$ \\ +\hline +$Q_s$ & Zmienna pomocnicza wykorzystana w linearyzacji zmiennej $dev_s$ \\ +\hline +$mdev = \max_{s \in S} dev_s$ & Maksymalne odchylenie zysu [zł]. Jako, że funkcja max jest nie liniowa, zmienna została poddana linearyzacji z użyciem zmiennych $M$, $Z_s$ \\ +\hline +$M$ & Zmienna pomocnicza wykorzystana w linearyzacji zmiennej $mdev$ \\ +\hline +$Z_s$ & Zmienna pomocnicza binarna wykorzystana w linearyzacji zmiennej $mdev$ \\ +\hline +$r = mdev$ & Miara ryzyka, równa maksymalnemu odchyleniu zysku \\ +\hline +\end{tabular} +\end{table} + +\subsection{Ograniczenia} + +Ograniczenie związane z linearyzacją zmiennej $dev_s$: + +$$lde v_{s1} - lde v_{s2} + P_{s1} - Q_{s2} = 0, \quad \forall s_1, s_2 \in S$$ + +Ograniczenie związane z linearyzację zmiennej $mdev$: + +$$mdev \geqslant dev_s, \quad \forall s \in S$$ + +$$mdev \leqslant dev_s + M(1 - Z_s), \quad \forall s \in S$$ + +$$\sum_{s \in S} Z_s = 1$$ + +\subsection{Metoda punktu odniesienia} + +Jako model preferencji dla modelu dwukryterialnego została wybrana metoda punktu odniesienia. Wprowadza ona zestaw dodatkowych parametrów i zmiennych: + +\begin{table}[h!] +\centering +\begin{tabular}{|l|p{10cm}|} +\hline +Parametr & Opis \\ +\hline +$asp_{ep}$ & Poziom aspiracji oczekiwanego zysku \\ +\hline +$asp_r$ & Poziom aspiracji ryzyka \\ +\hline +$\lambda_{ep}$, $\lambda_r$ & Współczynniki normalizujące, odpowiednio dla zysku i ryzyka. Ze względu na ogólne sformułowanie metody punktu odniesienia jako problemu maksymalizacji, $\lambda_{ep}$ przyjmie wartość dodatnią, a $\lambda_r$ ujemną. \\ +\hline +$\beta$ & Współczynnik pomniejszający wartość ocen wykraczających powyżej poziomu aspiracji \\ +\hline +$\varepsilon$ & Współczynnik składnika regularyzacyjnego \\ +\hline +\end{tabular} + +\begin{tabular}{|l|l|} +\hline +Zmienne & Opis \\ +\hline +$oc_{ep}$, $oc_r$ & Wartości indywidualnych funkcji osiągnięć dla zysku i ryzyka \\ +\hline +$v$ & Zmienna pomocnicza metody punktu odniesienia \\ +\hline +\end{tabular} +\end{table} + +Ograniczenia zmiennej $v$ przez wartości indywidualnych funkcji osiągnięć: + +$v \leq oc_{ep}$ oraz $v \leq oc_r$ + +Ograniczenia indywidualnych funkcji osiągnięć: + +$$oc_r \leqslant \lambda_r (r - asp_r)$$ + +$$oc_r \leqslant \beta \lambda_r (r - asp_r)$$ + +$$oc_{ep} \leqslant \lambda_p (ep - asp_{ep})$$ + +$$oc_{ep} \leqslant \beta \lambda_p (ep - asp_{ep})$$ + +Funkcja celu metody punktu odniesienia w postaci dla programowania liniowego: + +$$\max \quad v + \varepsilon (oc_{ep} + oc_r)$$ + +\section{Wyznaczenie parametrów zadania z rozkładu t-Studenta} + +W celu wyznaczenia wartości oczekiwanej wektora $R$ (odpowiadającą parametrowi modelu $eppu_p$) wykorzystano następującą zależność: + +$$E(R) = \mu + \sigma \cdot \frac{\Gamma(\frac{\nu - 1}{2})((\nu + a^2)^{-\frac{\nu - 1}{2}} - (\nu + b^2)^{\frac{\nu - 1}{2}})\nu^{\frac{\nu}{2}}}{2(F_{\nu}(b) - F_{\nu}(a))\Gamma(\frac{\nu}{2})\Gamma(\frac{1}{2})}$$ + +gdzie: + +\begin{itemize} +\item $\mu$ wartość oczekiwana dla $R$, +\item $\Gamma$ funkcja gamma Eulera, +\item $\nu$ liczba stopni swobody, +\item $F$ dystrybuanta standardowego rozkładu t-Studenta $t(0, 1; \nu)$ z $\nu$ stopniami swobody, +\item $a = \frac{\alpha-\mu}{\sigma}$, gdzie $\alpha$ to lewy kraniec przedziału, +\item $b = \frac{\beta-\mu}{\sigma}$, gdzie $\beta$ to prawy kraniec przedziału. +\end{itemize} + +Otrzymano wartości: + +$E(R)^T = [8.5094, 8.4710, 8.1319, 6.3944]$ + +Do obliczenia wartości oczekiwanej oraz wyznaczenia scenariuszy wykorzystano skrypt napisany w języku $R$. Wygenerowano 1000 scenariuszy testowtych. Użyty skrypt przedstawia Listing 1. + +Listing 1: Skrypt w języku $R$ do obliczania wartości oczekiwanej wektora $R$ i generowania scenariuszy z rozkładu t-Studenta. + +\begin{verbatim} +1 library ( tmvtnorm ) +2 +3 # t- Stutdet parameters +4 Mu = c(9 , 8 , 7 , 6) +5 Sigma = matrix (c(16 , -2 , -1 , -3 , +6 -2 , 9 , -4 , -1 , +7 -1 , -4 , 4 , 1 , +8 -3 , -1 , 1 , 1) , +9 nrow =4 , ncol =4) +10 lower _ bound = 5 +11 upper _ bound = 12 +12 +13 # Generate scenarios +14 data <- rtmvt ( n =10000 , mean = mu , sigma = sigma , df =5 , lower =rep ( lower _←- + bound , 4) , upper =rep ( upper _bound , 4) ) +15 write . table ( format (data , digits =15 , drop0trailing = F ) , " data10000 .txt"←- + , quote =F , sep ="\t", eol ="\n\t", col . names = F , row . names = T ) +16 mean <- colMeans ( data ) +17 +18 E <- function ( idx , Mu , Sigma , v , alfa , beta ) { +19 mu = Mu [ idx ] +20 sigma = Sigma [ idx , idx ] +21 a = ( alfa - mu )/ sigma +22 b = ( beta - mu )/ sigma +23 nom = gamma (( v -1)/2) * +24 (( v + a ^2) ^( -1*(v -1) /2) - +25 ( v + b ^2) ^( -1*(v -1)/2) ) * +26 v ^( v/2) +27 den = 2 * (pt(b , v ) - pt(a , v ) ) * gamma ( v/2) * gamma (1/2) +28 return ( mu + sigma *( nom /den ) ) +29 } +30 +31 ER1 <- E (1 , Mu , Sigma , 5 , 5 , 12) +32 ER2 <- E (2 , Mu , Sigma , 5 , 5 , 12) +33 ER3 <- E (3 , Mu , Sigma , 5 , 5 , 12) +34 ER4 <- E (4 , Mu , Sigma , 5 , 5 , 12) +\end{verbatim} + +\begin{verbatim} +45 +46 # Aktualny stan magazynowy [szt] +47 param startingStorage { PRODUCTS } >= 0; +48 +49 # Pozadany stan magazynowy na koniec symulacji [szt] +50 param desiredEndStorage { PRODUCTS } >= 0; +51 +52 # Liczba dni roboczych w miesiacu [d] +53 param daysPerMonth >= 1; +54 +55 # Liczba zmian w ciagu jednego dnia roboczego +56 param shiftsPerDay >= 1; +57 +58 # Dlugosc zmiany [ godz ] +59 param hoursPerShift >= 1; +60 +61 # Liczba roboczogodzin w miesiacu [ godz ] +62 param workHoursPerMonth = daysPerMonth * shiftsPerDay * hoursPerShift ; +63 +64 # Czas pracy narzedzi w danym miesiacu +65 param availableToolTime { t in TOOLS } = toolCount [ t ]* workHoursPerMonth←- + ; +66 +67 # ########## +68 # Zmienne # +69 # ########## +70 # Produkcja produktow +71 var produced { MONTHS , PRODUCTS } >= 0 integer ; +72 +73 # Sprzedaz produktow w danym miesiacu +74 var sold { MONTHS , PRODUCTS } >= 0 integer ; +75 var totalSold { p in PRODUCTS } = sum { m in MONTHS } sold [m , p ]; +76 +77 # Ilosc produktow przekazanych do magazynu w danym miesiacu +78 var stored { m in MONTHS , p in PRODUCTS } = produced [m , p ] - sold [m , p←- + ]; +79 +80 # Stan magazynowy na koniec danego miesiaca +81 var storage { m in MONTHS , p in PRODUCTS } = +82 startingStorage [ p ] + sum { m2 in MONTHS : ord( m2 ) <= ord( m ) } ←- + stored [ m2 , p ]; +83 +84 # Wykorzystany czas pracy +85 var usedToolTime { m in MONTHS , t in TOOLS } = +86 sum { p in PRODUCTS } produced [m , p ]* toolTimePerUnit [t , p ]; +87 +88 # Koszt magazynowania +89 var monthlyStorageCost { m in MONTHS } = +90 (sum { p in PRODUCTS } storage [m , p ]) * storageUnitCost ; +91 var totalStorageCost = sum { m in MONTHS } monthlyStorageCost [ m ]; +92 +93 # Zysk dla wartosci oczekiwanej +94 var expectedSalesProfit = +95 sum { p in PRODUCTS } totalSold [ p ]* expectedProfitPerUnit [ p ]; +96 var expectedNetProfit = +97 expectedSalesProfit - totalStorageCost ; +\end{verbatim} + +\begin{verbatim} +98 +99 # Zysk w danym scenariuszu +100 var scenarioSalesProfit { s in SCENARIOS } = +101 sum { p in PRODUCTS } totalSold [ p ]* scenarioProfitPerUnit [s , p ]; +102 var scenarioNetProfit { s in SCENARIOS } = +103 scenarioSalesProfit [ s ] - totalStorageCost ; +104 +105 # Odchylenie jako miara ryzyka - zlinearyzowana wartosc bezwzgledna +106 var deviation { s in SCENARIOS } = +107 expectedNetProfit - scenarioNetProfit [ s ]; +108 var P { SCENARIOS } >= 0; +109 var Q { SCENARIOS } >= 0; +110 subject to deviationLimit { s1 in SCENARIOS , s2 in SCENARIOS }: +111 deviation [ s1 ] - deviation [ s2 ]+ P [ s1 ] - Q [ s2 ] = 0; +112 +113 #var maxDeviation = max {s in SCENARIOS } deviation [s]; +114 var maxDeviation ; +115 # Linearyzacja maksymalnego odchylenia jako miary ryzyka +116 param M = 10000; +117 var Z { SCENARIOS } binary ; +118 subject to mdLimit { s in SCENARIOS }: +119 maxDeviation >= deviation [ s ]; +120 subject to mdWhere { s in SCENARIOS }: +121 maxDeviation <= deviation [ s ] + M *(1 - Z [ s ]) ; +122 subject to mdOS : +123 sum { s in SCENARIOS } Z [ s ] = 1; +124 +125 # Aliasy dla ocenianych wartosci +126 var profit = expectedNetProfit ; +127 var risk = maxDeviation ; +128 +129 # ###################### +130 # Ograniczenia modelu # +131 # ###################### +132 +133 # Ograniczenie rynkowe sprzedazy produktow +134 subject to SalesMarketLimit { m in MONTHS , p in PRODUCTS }: +135 sold [m , p ] <= salesMarketLimit [m , p ]; +136 # Ograniczenie magazynowe sprzedazy produktow +137 subject to SalesLimit1 { p in PRODUCTS }: +138 sold [ first ( MONTHS ) , p ] <= produced [ first ( MONTHS ) , p ]; +139 subject to SalesLimit2 { m in MONTHS , p in PRODUCTS : m != first ( MONTHS←- + ) }: +140 sold [m , p ] <= produced [m , p ] + storage [m , p ]; +141 # Powiazanie sprzedazy produktu P4 ze sprzedaza produktow P1 i P2 +142 subject to P4SalesConstraint { m in MONTHS }: +143 sold [m , "P4"] >= sold [m , "P1"] + sold [m , "P2"]; +144 # Ograniczenie pojemnosci magazynowej +145 subject to StorageLimit { m in MONTHS , p in PRODUCTS }: +146 storage [m , p ] <= storageLimit [ p ]; +147 # Ograniczenie na pozadany stan magazynowy na koniec marca +148 subject to DesiredStorage { p in PRODUCTS }: +149 storage [ last ( MONTHS ) , p ] >= desiredEndStorage [ p ]; +150 # Ograniczenie czasu pracy narzedzi w miesiacu +151 subject to ToolWorkTime { m in MONTHS , t in TOOLS }: +152 usedToolTime [m , t ] <= availableToolTime [ t ]; +\end{verbatim} + +\begin{verbatim} +153 +154 # ############################ +155 # Metoda punktu odniesienia # +156 # ############################ +157 # Skladniki wektora oceny +158 set RATED = {" PROFIT ", " RISK "}; +159 # Wektor oceny +160 var value { r in RATED } = +161 if r == " PROFIT " then profit +162 else if r == " RISK " then risk ; +163 # Wektor aspiracji +164 param aspiration { RATED }; +165 # Wartosci utopii i nadiru +166 param utopia { RATED }; +167 param nadir { RATED }; +168 # Wspolczynniki normalizujace +169 param lambda { r in RATED } = +170 1 / ( utopia [r] - nadir [r]); +171 # Wspolczynnik skladnika regularyzacyjnego +172 param epsilon ; +173 # Wspolczynnik pomniejszenia wartosci ocen ponad poziomem aspiracji +174 param beta ; +175 # Indywidualne funkcje osiagniec +176 var individualRating { RATED }; +177 # Zmienna pomocnicza metody punktu odniesienia +178 var v; +179 # Skalaryzujaca funkcja osiagniecia +180 var rating = v + epsilon * (sum {r in RATED } individualRating [r]); +181 # Odleglosc od punktu odniesienia +182 var distance {r in RATED } = value [r] - aspiration [r]; +183 # Znormalizowana odleglosc od punktu odniesienia +184 var normalizedDistance {r in RATED } = lambda [r]* distance [r]; +185 # Ograniczenia zmiennej v przez indywidualne funkcje osiagniec +186 subject to VSubject {r in RATED }: +187 v <= individualRating [r]; +188 # Ograniczenia indywidualnych funkcji osiagniec +189 subject to IndividualRatingSubjectBeta {r in RATED }: +190 individualRating [r] <= beta * normalizedDistance [r]; +191 subject to IndividualRatingSubject {r in RATED }: +192 individualRating [r] <= normalizedDistance [r]; +193 +194 ################ +195 # Funkcje celu # +196 ################ +197 minimize MinimizeProfit : profit ; +198 maximize MaximizeProfit : profit ; +199 minimize MinimizeRisk : risk ; +200 maximize MaximizeRisk : risk ; +201 maximize RPM: rating ; +\end{verbatim} + +\section{Model dla programu AMPL} + +\subsection{Plik z modelem (.mod)} + +\subsection{Plik z danymi (.dat)} + +Listing 3: Dane dla modelu AMPL - pominięto scenariusze, pełny zestaw danych dostępny w załączniku. + +\begin{verbatim} +1 # ########################################################## +2 # WDWR 18042 # +3 # Planowanie produkcj w warunkach ryzyka. # +4 # DANE # +5 # Autor : Krzysztof Rudnicki # +6 # ########################################################## +7 +8 # Narzedzia +9 set TOOLS := GRINDER VDRILL HDRILL MILLER LATHE ; +10 +11 # Miesiace +12 set MONTHS := JAN FEB MAR ; +13 +14 # Liczba narzedzi +15 param toolCount := +16 GRINDER 4 +17 VDRILL 2 +18 HDRILL 3 +19 MILLER 1 +20 LATHE 1 +21 ; +22 +23 # Czasy produkcji h +24 param toolTimePerUnit : +25 P1 P2 P3←- + P4 := +26 GRINDER 0 .4 0 .6 0 ←- + 0 +27 VDRILL 0 .2 0 .1 0 ←- + 0 .6 +28 HDRILL 0 .1 0 0 .7 ←- + 0 +29 MILLER 0 .06 0 .04 0 0 .05 +30 LATHE 0 0 .05 0 .02 0 +31 ; +32 +33 # Ograniczenia rynkowe liczby sprzedawanych produktow pcs +34 param salesMarketLimit : +35 P1 P2 P3 ←- + P4 := +36 JAN 200 0 100 ←- + 200 +37 FEB 300 100 200 ←- + 200 +38 MAR 0 300 100 ←- + 200 +39 ; +40 +41 # Ograniczeine liczby magazynowanych produktow pcs +42 param storageLimit := +43 P1 200 +44 P2 200 +45 P3 200 +46 P4 200 +\end{verbatim} + +\begin{verbatim} +47 ; +48 +49 # Koszt magazynowania produktow pln/pcs per month +50 param storageUnitCost := 1; +51 +52 # Aktualny stan magazynowy pcs +53 param startingStorage := +54 P1 0 +55 P2 0 +56 P3 0 +57 P4 0 +58 ; +59 +60 # Pozadany stan magazynowy na koniec marca pcs +61 param desiredEndStorage := +62 P1 50 +63 P2 50 +64 P3 50 +65 P4 50 +66 ; +67 +68 # Liczba dni roboczych w miesiacu d +69 param daysPerMonth := 24; +70 +71 # Liczba zmian w ciagu jednego dnia roboczego +72 param shiftsPerDay := 2; +73 +74 # Dlugosc zmiany h +75 param hoursPerShift := 8; +76 +77 # Zyski wartosc oczekiwana +78 param expectedProfitPerUnit := +79 P1 8 .50944172786882 +80 P2 8 .47100593224391 +81 P3 8 .1319049712769 +82 P4 6 .39446520538826 +83 ; +84 +85 # Metoda punktu odniesienia +86 param epsilon = 0 .000025 ; +87 +88 param beta = 0 .001 ; +89 +90 param utopia := +91 PROFIT 11987 +92 RISK 1000 +93 ; +94 +95 param nadir := +96 PROFIT -2400 +97 RISK 2815 +98 ; +99 +100 param aspiration := +101 PROFIT 10000 +102 RISK 0 +\end{verbatim} + +\subsection{Skrypty uruchomieniowe (.run)} + +\section{Rozwiązanie zadania optymalizacji} + +\subsection{Wyniki dla modelu jednokryterialnego} + +$s_{mp}$ oraz wartość wyznaczonego rozwiązania optymalnego: + +$ep = 11987.42[z]$ + +Listing 7: Wynik działania skryptu wyznaczającego rozwiązanie optymalne modelu jednokryterialnego. + +\begin{verbatim} +1 # ################################################ +2 ###Maximize profit for expected profit value ### +3 # ################################################ +4 CPLEX 12 .8.0.0 : optimal integer solution ; objective 11987 .41899 +5 11MIP simplex iterations +6 0branch -and - bound nodes +7 produced := +8 JAN P1 200 +9 JAN P2 0 +10 JAN P3 100 +11 JAN P4 200 +12 FEB P1 200 +13 FEB P2 0 +14 FEB P3 200 +15 FEB P4 200 +16 MAR P1 50 +17 MAR P2 250 +18 MAR P3 150 +19 MAR P4 250 +20 ; +21 +22 sold := +23 JAN P1 200 +24 JAN P2 0 +25 JAN P3 100 +26 JAN P4 200 +27 FEB P1 200 +28 FEB P2 0 +29 FEB P3 200 +30 FEB P4 200 +31 MAR P1 0 +32 MAR P2 200 +33 MAR P3 100 +34 MAR P4 200 +35 ; +36 +37 stored := +38 JAN P1 0 +39 JAN P2 0 +40 JAN P3 0 +41 JAN P4 0 +42 FEB P1 0 +43 FEB P2 0 +44 FEB P3 0 +45 FEB P4 0 +46 MAR P1 50 +47 MAR P2 50 +48 MAR P3 50 +49 MAR P4 50 +\end{verbatim} + +52 Profit: 11987.418989 + +\begin{figure}[h!] +\centering +%\includegraphics[width=\linewidth]{_page_0_Figure_0.jpeg} +\caption{Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk} +\label{fig:solutions} +\end{figure} + +\subsection{Wyniki dla modelu dwukryterialnego} + +\subsubsection{Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk} + +Obraz zbioru rozwiązań efektywnch w przestrzeni ryzyko-zysk został uzyskany poprzez rozwiązanie zadania metody punktu odniesienia dla różnych wartości aspiracji dla zysku oraz ryzyka. Do wykonania obliczeń posłużono się skryptem przedstawionym na Listing 7. Obliczenia przeprowadzono ustalając poziomy aspiracji w wyznaczonych granicach zmienności zysku i ryzyka (wektory nadiru i utopii wyznaczone w kolejnej sekcji). Dla każdego poziomu aspiracji wykorzystano po 10 równoodległych wartości znajdujących się w przedziałach definiowanych przez wektory nadiru i utopii. + +Ze względu na duży rozmiar zadania, a przez długi czas obliczeń przy 1000 scenariuszach, zdecydowano się ograniczyć ich liczbę do 50. Niestety nie jest to liczba wystarczająca do przeprowadzenia dokładnych obliczeń, jednak uzyskane wyniki powinny być wystarczające do przedstawienia działania metody. + +Fragment wyników działania skryptu obliczeniowego przedstawia Listing 8. Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk pokazuje Rysunek 1. + +Listing 8: Skrypt obliczający wartości do wyznaczenia obrazu zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk. Pełne wyniki dostępne w załączniku. + +\begin{verbatim} +1 ### 39: Solving model for aspirations : 2395 .666667 , 312 .777778 +2 CPLEX 12 .8.0.0 : optimal integer solution within mipgap or absmipgap ; ←- + objective 5 .427722957e -07 +3 39 MIP simplex iterations +4 0 branch -and - bound nodes +5 absmipgap = 7 .81092e -07 , relmipgap = 1 .43881 +\end{verbatim} + +\begin{verbatim} +6 Profit : 2417 .827519 +7 Risk : 311 .250020 +8 RPM : 0 .000001 +9 ### 40: Solving model for aspirations : 2395 .666667 , 0 .000000 +10 CPLEX 12 .8.0.0 : +11 < BREAK > ( cplex ) +12 CPLEX solution status 13 with fixed integers : +13 aborted in phase II +14 aborted , integer solution exists ; objective -0 .06697476417 +15 116486 MIP simplex iterations +16 103313 branch -and - bound nodes +17 absmipgap = 6 .93933e -05 , relmipgap = 0 .00103611 +18 Profit : 1432 .148909 +19 Risk : 188 .510726 +20 RPM : -0 .066975 +\end{verbatim} + +Rozwiązania efektywne minimalnego ryzyka i maksymalnego zysku + +Rozwiązania efektywne dla minimalnego ryzyka i maksymalnego zysku wyznaczono wykorzystując skrypt przedstawiony na listingu Listing 4. Na podstwaie wyników jego działania, które przedstawia Listing 9 można podać następujące rozwiązania: + +\begin{itemize} +\item Minimalne ryzyko: $ep = -1000$, przy $r = 0$, +\item Maksymalny zysk: $ep = 11987$, przy $r = 2569$ +\end{itemize} + +Dodatkowo poza zakresem zadania wyznaczonon pozostałe elementy potrzebne do wyznaczenia wektorów nadiru i utopii: + +\begin{itemize} +\item Maksymalne ryzyko: $ep = 9193$, przy $r = 2815$, +\item Minimalny zysk: $ep = -2400.00$, przy $r = 0.00$ +\end{itemize} + +$$\text{Wektor nadiru: } (-2400, 2815)$$ + +Wektor utopii: $(0, 11987)$ + +Listing 9: Skrypt wyznaczający rozwiązania optymalne modelu dwukryterialnego. + +\begin{verbatim} +1 # ######################## +2 ### Minimizing profit ### +3 # ######################## +4 CPLEX 12 .8.0.0 : optimal integer solution ; objective -2400 +5 7 MIP simplex iterations +6 0 branch -and - bound nodes +7 Profit : -2400 +8 Risk : 0 +9 +10 # ######################## +11 ### Maximizing profit ### +12 # ######################## +13 CPLEX 12 .8.0.0 : optimal integer solution ; objective 11987 .41899 +14 32 MIP simplex iterations +15 0 branch -and - bound nodes +16 Profit : 11987 +17 Risk : 2569 +18 +\end{verbatim} + +\begin{verbatim} +19 # ###################### +20 ### Minimizing risk ### +21 # ###################### +22 CPLEX 12 .8.0.0 : optimal integer solution ; objective 0 +23 0 MIP simplex iterations +24 0 branch -and - bound nodes +25 Profit : -1000 +26 Risk : 0 +27 +28 # ####################### +29 ### Maximizing risk k### +30 # ####################### +31 CPLEX 12 .8.0.0 : optimal integer solution ; objective 2815 .995263 +32 21837 MIP simplex iterations +33 705 branch -and - bound nodes +34 Profit : 9193 +35 Risk : 2815 +\end{verbatim} + +\subsubsection{Analiza relacji dominacji stochastycznej dla trzech wybranych rozwiązań efektywnych} + +Do analizy wybrano następujące scenariusze: + +\begin{enumerate} +\item Maksymalny zysk $ep = 11987.42$, +\item Poziomy aspiracji $aspep = 8789.89$ oraz $asp^r = 1876.67$, +\item Poziomy aspiracji $aspep = 10388.44$ oraz $asp^r = 938.33$. +\end{enumerate} + +Dane do analizy zostały wygenerowane w trakcie przeprowadzania obliczeń do poprzednich podpunktów i są dostępne w załącznikach. + +Dystrybuanty zysku przedstawia Rysunek 2. + +Na podstawie wykresów możemy stwierdzić, że rozwiązanie dla scenariusza z maksymalnym zyskiem dominuje w sensie FSD pozostałe rozwiązania. Dodatkowo widzimy, że rozwiązanie ze scenariusza 3 dominuje w sensie FSD rozwiązanie scenariusza 2. + +\begin{figure}[h!] +\centering +%\includegraphics[width=\linewidth]{_page_0_Figure_0.jpeg} +\caption{Wykres dystrybuant zysku dla poszczególnych rozwiązań} +\end{figure} + +\end{document} \ No newline at end of file