chore: better wdwr project source

This commit is contained in:
Krzysztof Rudnicki 2025-04-21 16:51:59 +02:00
parent b49b5e3592
commit 27a602f994
47 changed files with 4129 additions and 23801 deletions

View File

@ -1,4 +0,0 @@
8.50944172786882
8.47100593224391
8.1319049712769
6.39446520538826

View File

@ -1,36 +0,0 @@
library(tmvtnorm)
# t-Stutdet parameters
Mu = c(9, 8, 7, 6)
Sigma = matrix(c(16, -2, -1, -3,
-2, 9, -4, -1,
-1, -4, 4, 1,
-3, -1, 1, 1),
nrow=4, ncol=4)
lower_bound = 5
upper_bound = 12
# Generate scenarios
data <- rtmvt(n=10000, mean=Mu, sigma=Sigma, df=5, lower=rep(lower_bound, 4), upper=rep(upper_bound, 4))
write.table(format(data, digits=15, drop0trailing=F), "data10000.txt", quote=F, sep="\t", eol="\n\t", col.names = F, row.names = T)
mean <- colMeans(data)
E <- function(idx, Mu, Sigma, v, alfa, beta) {
mu = Mu[idx]
sigma = Sigma[idx, idx]
a = (alfa - mu)/sigma
b = (beta - mu)/sigma
nom = gamma((v-1)/2) *
((v+a^2)^(-1*(v-1)/2) -
(v+b^2)^(-1*(v-1)/2)) *
v^(v/2)
den = 2 * (pt(b, v) - pt(a, v)) * gamma(v/2) * gamma(1/2)
return (mu + sigma*(nom/den))
}
ER1 <- E(1, Mu, Sigma, 5, 5, 12)
ER2 <- E(2, Mu, Sigma, 5, 5, 12)
ER3 <- E(3, Mu, Sigma, 5, 5, 12)
ER4 <- E(4, Mu, Sigma, 5, 5, 12)
ER <- c(ER1, ER2, ER3, ER4)
write.table(ER, "ER.txt", sep="\t", col.names=F, row.names=F)

File diff suppressed because it is too large Load Diff

View File

@ -1,127 +0,0 @@
###########################################################
# WDWR 18042 #
# Planowanie produkcj w warunkach ryzyka. #
# MODEL #
# Autor: Krzysztof Rudnicki #
###########################################################
##########
# Zbiory #
##########
# Produkty
set PRODUCTS = {"P1", "P2", "P3", "P4"};
# Narzedzia
set TOOLS;
# Miesiace
set MONTHS ordered;
# Scenariusze
param scenarioCount = 10000;
set SCENARIOS = {0..scenarioCount};
#############
# Parametry #
#############
# Liczba kazdego z narzedzi
param toolCount {TOOLS} >= 1;
# Dochody ze sprzedazy [pln/szt]
param expectedProfitPerUnit {PRODUCTS} >= 0;
# Scenarios
param scenarioProfitPerUnit {SCENARIOS, PRODUCTS};
# Czasy produkcji [godz]
param toolTimePerUnit {TOOLS, PRODUCTS} >= 0;
# Ograniczenia rynkowe liczby sprzedawanych produktow [szt]
param salesMarketLimit {MONTHS, PRODUCTS} >= 0;
# Ograniczeine liczby magazynowanych produktow [szt]
param storageLimit {PRODUCTS} >= 0;
# Koszt magazynowania produktow [pln/szt per msc]
param storageUnitCost >= 0;
# Aktualny stan magazynowy [szt]
param startingStorage {PRODUCTS} >= 0;
# Pozadany stan magazynowy na koniec symulacji [szt]
param desiredEndStorage {PRODUCTS} >= 0;
# Liczba dni roboczych w miesiacu [d]
param daysPerMonth >= 1;
# Liczba zmian w ciagu jednego dnia roboczego
param shiftsPerDay >= 1;
# Dlugosc zmiany [godz]
param hoursPerShift >= 1;
# Liczba roboczogodzin w miesi<EFBFBD>cu [godz]
param workHoursPerMonth = daysPerMonth*shiftsPerDay*hoursPerShift;
###########
# Zmienne #
###########
# Produkcja produktow
var produced {MONTHS, PRODUCTS} >= 0 integer;
# Sprzedaz produktow w danym miesiacu
var sold {MONTHS,PRODUCTS} >= 0 integer;
var totalSold {p in PRODUCTS} = sum {m in MONTHS} sold[m, p];
# Iloosc produktow przekazanych do magazynu w danym miesiacu
var stored {m in MONTHS, p in PRODUCTS} = produced[m, p] - sold[m, p];
# Stan magazynowy na koniec danego miesiaca
var storage {m in MONTHS, p in PRODUCTS} =
startingStorage[p] + sum {m2 in MONTHS: ord(m2) <= ord(m)} stored[m2, p];
# Czas pracy narzedzi w danym miesi<EFBFBD>cu
var availableToolTime {t in TOOLS} =
toolCount[t]*workHoursPerMonth;
var usedToolTime {m in MONTHS, t in TOOLS} =
sum {p in PRODUCTS} produced[m,p]*toolTimePerUnit[t,p];
# Koszt magazynowania
var monthlyStorageCost {m in MONTHS} =
(sum {p in PRODUCTS} storage[m, p])*storageUnitCost;
var totalStorageCost = sum {m in MONTHS} monthlyStorageCost[m];
# Zysk dla warto<EFBFBD>ci oczekiwanej
var expectedSalesProfit =
sum {p in PRODUCTS} totalSold[p]*expectedProfitPerUnit[p];
var expectedNetProfit =
expectedSalesProfit - totalStorageCost;
#######################
# Ograniczenia modelu #
#######################
# Ograniczenie rynkowe sprzedazy produktow
subject to SalesMarketLimit {m in MONTHS, p in PRODUCTS}:
sold[m, p] <= salesMarketLimit[m, p];
# Ograniczenie magazynowe sprzedazy produktow
subject to SalesLimit1 {p in PRODUCTS}:
sold[first(MONTHS), p] <= produced[first(MONTHS), p];
subject to SalesLimit2 {m in MONTHS, p in PRODUCTS: m != first(MONTHS)}:
sold[m, p] <= produced [m, p] + storage[m, p];
# Powiazanie sprzedazy produktu P4 ze sprzedaza produktow P1 i P2
subject to P4SalesConstraint {m in MONTHS}:
sold[m, "P4"] >= sold[m, "P1"] + sold[m, "P2"];
# Ograniczenie pojemno<EFBFBD>ci magazynowej
subject to StorageLimit {m in MONTHS, p in PRODUCTS}:
storage[m, p] <= storageLimit[p];
# Ograniczenie na po<EFBFBD><EFBFBD>dany stan magazynowy na koniec marca
subject to DesiredStorage {p in PRODUCTS}:
storage[last(MONTHS), p] >= desiredEndStorage[p];
#Ograniczenie czasu pracy narzedzi w miesiacu
subject to ToolWorkTime {m in MONTHS, t in TOOLS}:
usedToolTime[m, t] <= availableToolTime[t];
################
# Funkcje celu #
################
maximize Profit: expectedNetProfit;

View File

@ -1,27 +0,0 @@
###########################################################
# WDWR 18042 #
# Planowanie produkcj w warunkach ryzyka. #
# SKRYPT URUCHAMIAJACY - Metoda punktu odniesienia #
# Autor: Krzysztof Rudnicki #
###########################################################
#######################
# Konfiguracja modelu #
#######################
model WDWR1.mod;
data WDWR1.dat;
option solver cplex;
#############################
# Model jednokryterialny #
#############################
printf "\n#################################################\n";
printf "### Maximize profit for expected profit value ###\n";
printf "#################################################\n";
objective Profit;
solve;
display produced;
display sold;
display stored;
printf "Profit: %f\n", Profit;

File diff suppressed because it is too large Load Diff

View File

@ -1,201 +0,0 @@
###########################################################
# WDWR 18042 #
# Planowanie produkcj w warunkach ryzyka. #
# MODEL #
# Autor: Krzysztof Rudnicki #
###########################################################
##########
# Zbiory #
##########
# Produkty
set PRODUCTS = {"P1", "P2", "P3", "P4"};
# Narzedzia
set TOOLS;
# Miesiace
set MONTHS ordered;
# Scenariusze
param scenarioCount;
set SCENARIOS = {1..scenarioCount};
#############
# Parametry #
#############
# Liczba kazdego z narzedzi
param toolCount {TOOLS} >= 1;
# Dochody ze sprzedazy [pln/szt]
param expectedProfitPerUnit {PRODUCTS} >= 0;
# Scenarios
param scenarioProfitPerUnit {SCENARIOS, PRODUCTS};
# Czasy produkcji [godz]
param toolTimePerUnit {TOOLS, PRODUCTS} >= 0;
# Ograniczenia rynkowe liczby sprzedawanych produktow [szt]
param salesMarketLimit {MONTHS, PRODUCTS} >= 0;
# Ograniczeine liczby magazynowanych produktow [szt]
param storageLimit {PRODUCTS} >= 0;
# Koszt magazynowania produktow [pln/szt per msc]
param storageUnitCost >= 0;
# Aktualny stan magazynowy [szt]
param startingStorage {PRODUCTS} >= 0;
# Pozadany stan magazynowy na koniec symulacji [szt]
param desiredEndStorage {PRODUCTS} >= 0;
# Liczba dni roboczych w miesiacu [d]
param daysPerMonth >= 1;
# Liczba zmian w ciagu jednego dnia roboczego
param shiftsPerDay >= 1;
# Dlugosc zmiany [godz]
param hoursPerShift >= 1;
# Liczba roboczogodzin w miesi<EFBFBD>cu [godz]
param workHoursPerMonth = daysPerMonth*shiftsPerDay*hoursPerShift;
# Czas pracy narzedzi w danym miesi<EFBFBD>cu
param availableToolTime {t in TOOLS} = toolCount[t]*workHoursPerMonth;
###########
# Zmienne #
###########
# Produkcja produktow
var produced {MONTHS, PRODUCTS} >= 0 integer;
# Sprzedaz produktow w danym miesiacu
var sold {MONTHS,PRODUCTS} >= 0 integer;
var totalSold {p in PRODUCTS} = sum {m in MONTHS} sold[m, p];
# Iloosc produktow przekazanych do magazynu w danym miesiacu
var stored {m in MONTHS, p in PRODUCTS} = produced[m, p] - sold[m, p];
# Stan magazynowy na koniec danego miesiaca
var storage {m in MONTHS, p in PRODUCTS} =
startingStorage[p] + sum {m2 in MONTHS: ord(m2) <= ord(m)} stored[m2, p];
# Wykorzystany czas pracy
var usedToolTime {m in MONTHS, t in TOOLS} =
sum {p in PRODUCTS} produced[m,p]*toolTimePerUnit[t,p];
# Koszt magazynowania
var monthlyStorageCost {m in MONTHS} =
(sum {p in PRODUCTS} storage[m, p])*storageUnitCost;
var totalStorageCost = sum {m in MONTHS} monthlyStorageCost[m];
# Zysk dla warto<EFBFBD>ci oczekiwanej
var expectedSalesProfit =
sum {p in PRODUCTS} totalSold[p]*expectedProfitPerUnit[p];
var expectedNetProfit =
expectedSalesProfit - totalStorageCost;
# Zysk w danym scenariuszu
var scenarioSalesProfit {s in SCENARIOS} =
sum {p in PRODUCTS} totalSold[p]*scenarioProfitPerUnit[s, p];
var scenarioNetProfit {s in SCENARIOS} =
scenarioSalesProfit[s] - totalStorageCost;
# Odchylenie jako miara ryzyka - zlinearyzowana wartosc bezwzgledna
var deviation {s in SCENARIOS} =
expectedNetProfit - scenarioNetProfit[s];
var P {SCENARIOS} >= 0;
var Q {SCENARIOS} >= 0;
subject to deviationLimit {s1 in SCENARIOS, s2 in SCENARIOS}:
deviation[s1]-deviation[s2]+P[s1]-Q[s2] = 0;
#var maxDeviation = max {s in SCENARIOS} deviation[s];
var maxDeviation;
# Linearyzacja maksymalnego odchylenia jako miary ryzyka
param M = 10000;
var Z {SCENARIOS} binary;
subject to mdLimit {s in SCENARIOS}:
maxDeviation >= deviation[s];
subject to mdWhere {s in SCENARIOS}:
maxDeviation <= deviation[s] + M*(1-Z[s]);
subject to mdOS:
sum{s in SCENARIOS} Z[s] = 1;
# Aliasy dla ocenianych warto<EFBFBD>ci
var profit = expectedNetProfit;
var risk = maxDeviation;
#######################
# Ograniczenia modelu #
#######################
# Ograniczenie rynkowe sprzedazy produktow
subject to SalesMarketLimit {m in MONTHS, p in PRODUCTS}:
sold[m, p] <= salesMarketLimit[m, p];
# Ograniczenie magazynowe sprzedazy produktow
subject to SalesLimit1 {p in PRODUCTS}:
sold[first(MONTHS), p] <= produced[first(MONTHS), p];
subject to SalesLimit2 {m in MONTHS, p in PRODUCTS: m != first(MONTHS)}:
sold[m, p] <= produced [m, p] + storage[m, p];
# Powiazanie sprzedazy produktu P4 ze sprzedaza produktow P1 i P2
subject to P4SalesConstraint {m in MONTHS}:
sold[m, "P4"] >= sold[m, "P1"] + sold[m, "P2"];
# Ograniczenie pojemno<EFBFBD>ci magazynowej
subject to StorageLimit {m in MONTHS, p in PRODUCTS}:
storage[m, p] <= storageLimit[p];
# Ograniczenie na po<EFBFBD><EFBFBD>dany stan magazynowy na koniec marca
subject to DesiredStorage {p in PRODUCTS}:
storage[last(MONTHS), p] >= desiredEndStorage[p];
#Ograniczenie czasu pracy narzedzi w miesiacu
subject to ToolWorkTime {m in MONTHS, t in TOOLS}:
usedToolTime[m, t] <= availableToolTime[t];
#############################
# Metoda punktu odniesienia #
#############################
# Skladniki wektora oceny
set RATED = {"PROFIT", "RISK"};
# Wektor oceny
var value {r in RATED} =
if r == "PROFIT" then profit
else if r == "RISK" then risk;
# Wektor aspiracji
param aspiration {RATED};
# Warto<EFBFBD>ci utopii i nadiru
param utopia {RATED};
param nadir {RATED};
# Wspolczynniki normalizujace
param lambda {r in RATED} =
1 / (utopia[r]-nadir[r]);
# Wspolczynnik skladnika regularyzacyjnego
param epsilon;
# Wspolczynnik pomniejszenia warto<EFBFBD>ci ocen ponad poziomem aspiracji
param beta;
# Indywidualne funkcje osiagniec
var individualRating {RATED};
# Zmienna pomocnicza metody punktu odniesienia
var v;
# Skalaryzujaca funkcja osiagniecia
var rating = v + epsilon * (sum {r in RATED} individualRating[r]);
# Odleglo<EFBFBD>c od punktu odniesienia
var distance {r in RATED} = value[r]-aspiration[r];
# Znormalizowana odleglo<EFBFBD>c od punktu odniesienia
var normalizedDistance {r in RATED} = lambda[r]*distance[r];
# Ograniczenia zmiennej v przez indywidualne funkcje osiagniec
subject to VSubject {r in RATED}:
v <= individualRating[r];
# Ograniczenia indywidualnych funkcji osiagniec
subject to IndividualRatingSubjectBeta {r in RATED}:
individualRating[r] <= beta*normalizedDistance[r];
subject to IndividualRatingSubject {r in RATED}:
individualRating[r] <= normalizedDistance[r];
################
# Funkcje celu #
################
minimize MinimizeProfit: profit;
maximize MaximizeProfit: profit;
minimize MinimizeRisk: risk;
maximize MaximizeRisk: risk;
maximize RPM: rating;

View File

@ -1,50 +0,0 @@
###########################################################
# WDWR 18042 #
# Planowanie produkcj w warunkach ryzyka. #
# SKRYPT URUCHAMIAJACY - Metoda punktu odniesienia #
# Autor: Krzysztof Rudnicki #
###########################################################
#######################
# Konfiguracja modelu #
#######################
model WDWR2.mod;
data WDWR2_trunc.dat;
option solver cplex;
#############################
# Metoda punktu odniesienia #
#############################
printf "\n######################################\n";
printf "### RPM solution space calculation ###\n";
printf "######################################\n";
objective RPM;
param steps = 10;
param stepSize {r in RATED} = (utopia[r] - nadir[r]) / (steps-1);
param iteration;
param iterationCount = steps*steps;
set RESULTS = {1..iterationCount};
set VALUES = {"PROFIT", "RISK", "RPM"};
param result {RESULTS, VALUES};
for {i in 0..steps-1} {
for {j in 0..steps-1} {
let iteration := 1 + steps*i + j;
let aspiration["PROFIT"] := nadir["PROFIT"] + i * stepSize["PROFIT"];
let aspiration["RISK"] := nadir["RISK"] + j * stepSize["RISK"];
printf "### %d: Solving model for aspirations: %f, %f\n",
iteration, aspiration["PROFIT"], aspiration["RISK"];
solve;
let result[iteration, "PROFIT"] := profit;
let result[iteration, "RISK"] := risk;
let result[iteration, "RPM"] := RPM;
printf "Profit: %f\n", profit;
printf "Risk: %f\n", risk;
printf "RPM: %f\n", RPM;
}
}
display result;
printf { r in RESULTS } "%f\t%f\t%f\n", result[r,"PROFIT"], result[r, "RISK"], result[r,"RPM"] > ./result.csv ;

View File

@ -1,154 +0,0 @@
###########################################################
# WDWR 18042 #
# Planowanie produkcj w warunkach ryzyka. #
# DANE #
# Autor: Krzysztof Rudnicki #
###########################################################
# Narzedzia
set TOOLS := GRINDER VDRILL HDRILL MILLER LATHE;
# Miesiace
set MONTHS := JAN FEB MAR;
# Licza narzedzi
param toolCount :=
GRINDER 4
VDRILL 2
HDRILL 3
MILLER 1
LATHE 1
;
# Czasy produkcji h
param toolTimePerUnit:
P1 P2 P3 P4 :=
GRINDER 0.4 0.6 0 0
VDRILL 0.2 0.1 0 0.6
HDRILL 0.1 0 0.7 0
MILLER 0.06 0.04 0 0.05
LATHE 0 0.05 0.02 0
;
# Ograniczenia rynkowe liczby sprzedawanych produktow pcs
param salesMarketLimit:
P1 P2 P3 P4 :=
JAN 200 0 100 200
FEB 300 100 200 200
MAR 0 300 100 200
;
# Ograniczeine liczby magazynowanych produktow pcs
param storageLimit :=
P1 200
P2 200
P3 200
P4 200
;
# Koszt magazynowania produktow pln/pcs per month
param storageUnitCost := 1;
# Aktualny stan magazynowy pcs
param startingStorage :=
P1 0
P2 0
P3 0
P4 0
;
# Poz<6F>dany stan magazynowy na koniec marca pcs
param desiredEndStorage :=
P1 50
P2 50
P3 50
P4 50
;
# Liczba dni roboczych w miesiacu d
param daysPerMonth := 24;
# Liczba zmian w ciagu jednego dnia roboczego
param shiftsPerDay := 2;
# Dlugosc zmiany h
param hoursPerShift := 8;
# Zyski warto<74><6F> oczekiwana
param expectedProfitPerUnit :=
P1 8.50944172786882
P2 8.47100593224391
P3 8.1319049712769
P4 6.39446520538826
;
# Metoda punktu odniesienia
param epsilon = 0.000025;
param beta = 0.001;
param utopia :=
PROFIT 11987
RISK 0
;
param nadir :=
PROFIT -2400
RISK 2815
;
# Scenariusze
param scenarioCount := 50;
param scenarioProfitPerUnit:
P1 P2 P3 P4 :=
1 6.78312108289149 5.79640238361981 10.05787433056357 6.57331416435723
2 6.99738290528301 9.01490464757196 5.08481517735633 6.42703739335277
3 5.16730304787176 7.52317923266688 10.72313438657665 7.22667916959417
4 8.52274093276464 11.38240217987188 6.13080610568167 6.43883854824552
5 6.50428131735901 6.61788006135640 7.86111017073128 6.96225068464523
6 5.73487133076911 9.16374087573468 5.52557377604414 6.34042770048443
7 7.57821826531473 5.53212159376577 9.44747152703083 7.92080735281354
8 8.46351060213176 6.67108340536348 7.96447972290298 6.74037823409959
9 10.60705431897493 6.29351506828248 8.08238578885269 6.64513805083938
10 5.49788635095338 8.01657169352075 8.50721094756387 6.32347360999400
11 9.98722514505514 8.89045419912165 7.40638427340367 6.19123907839219
12 7.73547221322455 11.39341677791569 7.08591860802534 6.65287015880773
13 8.00244141512299 7.46013718525416 9.07534043801771 7.01972409076348
14 10.01757296285428 11.16631823758034 5.36427432741987 5.93803320930752
15 8.73982030016946 7.22788862315047 7.52123044637611 6.30583102048732
16 6.74830998356361 5.16961378121024 9.83052665533391 6.97518295642799
17 5.79891835909540 7.62305645016980 7.28259746189341 6.58122366239758
18 5.01746785364914 5.37120611569365 11.37580509674048 7.45754618734148
19 8.84615981059243 10.36884740288172 5.51512168506823 5.14746695259905
20 10.27832406220036 6.26817737098193 6.75980452880535 6.00071122161820
21 9.15464079326701 9.22511946737560 8.59742728186919 5.85941844163078
22 7.41070715265531 9.03326860943882 9.51105396612463 5.95705526059528
23 9.41688054404721 5.48792302160852 8.05314441506622 6.33167522079485
24 7.99636302963949 8.45127363831087 6.80178566896807 6.40796549415317
25 8.77607512859202 9.06083514509964 6.14324653925151 5.73196891114116
26 6.15756683330483 5.81155622391928 8.95298231122791 7.75631798464974
27 8.71820952681711 6.75933713868641 6.20173677287384 5.94931057772569
28 7.50988798239200 8.40250942598753 7.59076793688675 6.83115118367424
29 11.46519479939599 5.34788729417893 7.49642151003498 5.09135446750897
30 9.24470379243678 7.86407386582905 6.91504065225354 5.66423375179536
31 10.11059443261933 5.19726478862852 7.17323727021490 5.35589059533840
32 8.52798709174698 9.92750815054074 7.11656712470230 5.52054849939254
33 10.96107079994176 7.10910792528864 5.70378349251154 5.17164984043314
34 7.06917204470777 7.93024674036222 7.04742602521247 6.02267636557175
35 8.48134255283988 5.85227829193417 5.36851422694765 6.58963142694151
36 10.79598232218280 6.78064186807628 6.45254214496221 6.01773663687229
37 9.31085304521786 7.24038452979960 7.11927599287817 5.94495349693440
38 11.73162984938600 8.89170449659670 7.24145427728390 5.50727529989226
39 9.95614904957837 8.24343617183020 6.08421773053824 5.59097741826648
40 10.84398291202468 5.62144717550252 8.73978776370006 5.90011906694585
41 9.66329756207950 8.71563915673125 8.57471405154024 6.25399915313449
42 11.75197973817904 9.62791703809340 6.15087294856069 5.12525411655807
43 10.21024933655283 5.45043424512963 7.70802205088631 6.26487953122650
44 7.00126415308046 9.52080591709321 6.34678934922762 5.78571635562224
45 10.95808951943000 5.38346727815726 6.12050483571891 7.52568971146160
46 7.24407146573199 10.74100159223745 7.79352388695434 5.86675126000469
47 11.09420218544564 7.58722148021949 10.11955301735720 5.87263773263194
48 6.56196505922266 8.86557049389506 6.68759866488725 6.54786762414447
49 6.36408747696432 9.90697341186375 8.67549323089252 7.10602003316923
50 5.25413960261441 9.86316602732531 6.97502397729463 5.79670081684910
;

View File

@ -1,53 +0,0 @@
###########################################################
# WDWR 18042 #
# Planowanie produkcj w warunkach ryzyka. #
# SKRYPT URUCHAMIAJACY #
# Autor: Krzysztof Rudnicki #
###########################################################
#######################
# Konfiguracja modelu #
#######################
model WDWR2.mod;
data WDWR2.dat;
option solver cplex;
###########################################################
# Rozwiazania optymalne dla wyznaczenia granic zmienno<6E>ci #
# tj wektorow utopii i nadiru #
###########################################################
# Minimalny zysk
printf "\n#########################\n";
printf "### Minimizing profit ###\n";
printf "#########################\n";
objective MinimizeProfit;
solve;
printf "Profit: %f\n", profit;
printf "Risk: %f\n", risk;
# Maksymalny koszt
printf "\n#########################\n";
printf "### Maximizing profit ###\n";
printf "#########################\n";
objective MaximizeProfit;
solve;
printf "Profit: %f\n", profit;
printf "Risk: %f\n", risk;
# Minimalny poziom zanieczyszcze<7A>
printf "\n#######################\n";
printf "### Minimizing risk ###\n";
printf "#######################\n";
objective MinimizeRisk;
solve;
printf "Profit: %f\n", profit;
printf "Risk: %f\n", risk;
# Maksymalny poziom zanieczyszcze<7A>
printf "\n########################\n";
printf "### Maximizing risk k###\n";
printf "########################\n";
objective MaximizeRisk;
solve;
printf "Profit: %f\n", profit;
printf "Risk: %f\n", risk;

File diff suppressed because it is too large Load Diff

View File

@ -1,771 +0,0 @@
## **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ą<br>zysku<br>2.1<br>Zbiory indeksowe<br>.<br>2.2<br>Parametry<br>2.3<br>Zmienne<br>2.4<br>Ograniczenia<br>.<br>2.5<br>Funkcja celu | 3<br>3<br>3<br>4<br>4<br>4 |
| 3 | Dwukryterialny model zysku i ryzyka z wartoscią oczekiwaną jako miarą zysku i od<br>chyleniem maksymalnym jako miarą ryzyka<br>3.1<br>Zbiory indeksowe<br>.<br>3.2<br>Parametry<br>3.3<br>Zmienne<br>3.4<br>Ograniczenia<br>.<br>3.5<br>Metoda punktu odniesienia<br>. | 5<br>5<br>5<br>5<br>5<br>6 |
| 4 | Wyznaczenie parametrów zadania z rozkładu t-Studenta | 6 |
| 5 | Model dla programu AMPL<br>5.1<br>Plik z modelem (.mod)<br>5.2<br>Plik z danymi (.dat)<br>5.3<br>Skrypty uruchomieniowe (.run) | 8<br>8<br>11<br>14 |
| 6 | Rozwiązanie zadania optymalizacji<br>6.1<br>Wyniki dla modelu jednokryterialnego<br>.<br>6.2<br>Wyniki dla modelu dwukryterialnego<br>6.2.1<br>Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk<br>.<br>6.2.2<br>Analiza relacji dominacji stochastycznej dla trzech wybranych rozwiązań efek<br>tywnych | 16<br>16<br>19<br>19<br>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 ryzykozysk.
- b. Wskazać rozwiązania efektywne minimalnego ryzyka i maksymalnego zysku. Jakie odpowiadają im wartości w przestrzeni ryzykozysk?
- 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 =<br>P1, , P4 | Zbiór wytwarzanych produktów |
| T =<br>T1, , T5 | Zbiór typów narzędzi wykorzystywanych przy produkcji |
| M =<br>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<br>p [zł] |
| ttputp | Czas wykorzystania maszyny typu<br>t przy produkcji jednej sztuki pro |
| | duktu<br>p [godz] |
| smlmp | Limit sprzedaży produktu<br>p w miesiącu<br>m [szt] |
| stlp | Limit pojemności magazynu na produkt<br>p [szt] |
| stcpu | Koszt magazynowania jednej sztuki dowolnego produktu [zł] |
| st0p | Początkowy stan magazynowy produktu<br>p [szt] |
| dstp | Porządany końcowy stan magazynowy produktu<br>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 =<br>dpm · spd · hps | Liczba godzin roboczych w ciągu każdego miesiąca [godz] |
| =<br>attt<br>tct<br> whpm | Dostępna liczba godzin roboczych maszyn typu<br>t w ciągu każdego |
| | miesiąca [godz] |
## **2.3 Zmienne**
| Zmienna | Opis |
|----------------------------------------------------|--------------------------------------------------------------------|
| pmp | Liczba sztuk produktu<br>p wyprodukowanych w miesiącu<br>m [szt] |
| smp | Liczba sztuk produktu<br>p sprzedanych w miesiącu<br>m [szt] |
| X<br>=<br>tsp<br>smp | Całkowita liczba sprzedanych sztuk produktu<br>p |
| m∈M | |
| =<br>stdmp<br>pmp<br> smp | Liczba sztuk produktu<br>p zmagazynowanych w miesiącu<br>m [szt] |
| Xm<br>=<br>st0p<br>+<br>stgmp<br>stdm2p<br>m2=1 | Stan magazynowy produktu<br>p na koniec miesiąca<br>m [szt] |
| X<br>uttmt<br>=<br>pmp<br> ttputp<br>p∈P | Wykorzystanie czasu pracy maszyny typu<br>t w miesiącu<br>m [godz] |
| X<br>X<br>tstc =<br>stcpu ·<br>stgmp<br>m∈M<br>p∈P | Całkowity koszt wykorzystania magazynów [zł] |
| ep = (X<br>tsp<br>· eppup)<br> 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:
*<sup>s</sup>mp* <sup>6</sup> *smlmp, <sup></sup><sup>m</sup> <sup></sup> M, <sup></sup><sup>p</sup> <sup></sup> <sup>P</sup>*
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:
*<sup>s</sup>m*<sup>4</sup> <sup>&</sup>gt; *<sup>s</sup>m*<sup>1</sup> <sup>+</sup> *<sup>s</sup>m*2*, <sup></sup><sup>m</sup> <sup></sup> <sup>M</sup>*
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 *att<sup>t</sup> , ∀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 =<br>S1, , S1000 | Zbiór scenariuszy wygenerowanych z rozkładu t-Studenta |
### **3.2 Parametry**
| Parametr | Opis |
|----------|-----------------------------------------------------------------------|
| sppups | Zysk ze sprzedaży jednej sztuki produktu<br>p w scenariuszu<br>s [zł] |
### **3.3 Zmienne**
| Zmienna | Opis |
|-------------------------------------------|------------------------------------------------------------------------|
| = (X<br>· sppups)<br>sps<br>tsp<br> tstc | Wartość zysku całkowitego dla scenariusza<br>s zysku ze sprzedaży |
| p∈P | produktów [zł] |
| devs<br>=<br> 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<br>ldevs,<br>Ps,<br>Qs |
| =<br>ldevs<br>ep sps | Zmienna pomocnicza wykorzystana w linearyzacji odchylenia |
| | zysku w scenariuszu<br>s |
| Ps | Zmienna pomocnicza wykorzystana w linearyzacji zmiennejk |
| | devs |
| Qs | Zmienna pomocnicza wykorzystana w linearyzacji zmiennej<br>devs |
| mdev = maxs∈S<br>devs | Maksymalne odchylenie zysu [zł]. Jako, że funkcja max jest nie |
| | liniowa, zmienna została poddana linearyzacji z użyciem zmien |
| | nych<br>M,<br>Zs |
| M | Zmienna<br>pomocnicza<br>wykorzystana<br>w<br>linearyzacji<br>zmiennej |
| | mdev |
| Zs | Zmienna<br>pomocnicza<br>binarna<br>wykorzystana<br>w<br>linearyzacji |
| | zmiennej<br>mdev |
| r =<br>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,<br>λep |
| | przyjmie wartość dodatnią, a<br>ujemną.<br>λ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 *oc<sup>r</sup>*
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*) *<sup>T</sup>* = [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 | ###<br>Maximize<br>profit<br>for<br>expected<br>profit<br>value<br>### | | | | | | | | | | | | | | |
| 3 | # ################################################ | | | | | | | | | | | | | | |
| 4 | CPLEX | | 12 .8.0.0 : | optimal | | integer | | solution ; | | | objective | 11987 .41899 | | | |
| 5 | | 11<br>MIP<br>simplex<br>iterations | | | | | | | | | | | | | |
| 6 | | 0<br>branch -and - bound<br>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)
<span id="page-0-1"></span>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)
<span id="page-0-0"></span>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 *asp<sup>r</sup>* = 1876*.*67,
- 3. Poziomy aspiracji *aspep* = 10388*.*44 oraz *asp<sup>r</sup>* = 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ń

View File

@ -1,921 +0,0 @@
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[polish]{babel}
\usepackage{amsmath,amssymb}
\usepackage{graphicx}
\usepackage{booktabs}
\usepackage{hyperref}
\usepackage{longtable}
\usepackage{enumitem}
\title{WDWR, sprawozdanie}
\author{Krzysztof Rudnicki, 307585}
\date{\today}
\begin{document}
\maketitle
\section*{Spis treści}
\begin{longtable}{|c|l|c|}
\hline
1 & Treść zadania & 2 \\
\hline
2 & Jednokryterialny model wyboru w warunkach ryzyka z wartością oczekiwaną jako miarą & 3 \\
& zysku & \\
& 2.1 Zbiory indeksowe & 3 \\
& 2.2 Parametry & 3 \\
& 2.3 Zmienne & 4 \\
& 2.4 Ograniczenia & 4 \\
& 2.5 Funkcja celu & 4 \\
\hline
3 & Dwukryterialny model zysku i ryzyka z wartoscią oczekiwaną jako miarą zysku i od & 5 \\
& chyleniem maksymalnym jako miarą ryzyka & \\
& 3.1 Zbiory indeksowe & 5 \\
& 3.2 Parametry & 5 \\
& 3.3 Zmienne & 5 \\
& 3.4 Ograniczenia & 5 \\
& 3.5 Metoda punktu odniesienia & 6 \\
\hline
4 & Wyznaczenie parametrów zadania z rozkładu t-Studenta & 6 \\
\hline
5 & Model dla programu AMPL & 8 \\
& 5.1 Plik z modelem (.mod) & 8 \\
& 5.2 Plik z danymi (.dat) & 11 \\
& 5.3 Skrypty uruchomieniowe (.run) & 14 \\
\hline
6 & Rozwiązanie zadania optymalizacji & 16 \\
& 6.1 Wyniki dla modelu jednokryterialnego & 16 \\
& 6.2 Wyniki dla modelu dwukryterialnego & 19 \\
& 6.2.1 Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk & 19 \\
& 6.2.2 Analiza relacji dominacji stochastycznej dla trzech wybranych rozwiązań efek & 21 \\
& tywnych & \\
\hline
\end{longtable}
\section*{WDWR 18402}
Rozważamy następujące zagadnienie planowania produkcji:
\begin{itemize}
\item Przedsiębiorstwo wytwarza 4 produkty P1, \ldots, 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:
\end{itemize}
\begin{table}[h!]
\centering
\begin{tabular}{|l|c|c|c|c|}
\hline
& P1 & P2 & P3 & P4 \\
\hline
Szlifowanie & 0,4 & 0,6 &&\\
\hline
Wiercenie pionowe & 0,2 & 0,1 && 0,6 \\
\hline
Wiercenie poziome & 0,1 && 0,7 &\\
\hline
Frezowanie & 0,06 & 0,04 && 0,05 \\
\hline
Toczenie && 0,05 & 0,02 &\\
\hline
\end{tabular}
\end{table}
\begin{itemize}
\item Dochody ze sprzedaży produktów (w zł/sztukę) określają składowe wektora losowego \textbf{R} = ($R_1, \ldots, R_4$)$^T$. Wektor losowy \textbf{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 $\mu$ oraz $\mathbf{\Sigma}$ 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}.
$$
\end{itemize}
\begin{itemize}
\item Istnieją ograniczenia rynkowe na liczbę sprzedawanych produktów w danym miesiącu:
\end{itemize}
\begin{table}[h!]
\centering
\begin{tabular}{|l|c|c|c|c|}
\hline
& P1 & P2 & P3 & P4 \\
\hline
Styczeń & 200 & 0 & 100 & 200 \\
\hline
Luty & 300 & 100 & 200 & 200 \\
\hline
Marzec & 0 & 300 & 100 & 200 \\
\hline
\end{tabular}
\end{table}
\begin{itemize}
\item 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.
\item 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.
\item 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.
\item 1. Zaproponować jednokryterialny model wyboru w warunkach ryzyka z wartością oczekiwaną jako miarą zysku. Wyznaczyć rozwiązanie optymalne.
\item 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 $\mathbf{x} \in Q$ odchylenie maksymalne jest definiowane jako $D(\mathbf{x}) = \max_{t=1,...,T} |\mu(\mathbf{x}) - r_t(\mathbf{x})|$, gdzie $\mu(\mathbf{x})$ oznacza wartość oczekiwaną, $r_t(\mathbf{x})$ realizację dla scenariusza $t$.
\begin{itemize}
\item a. Wyznaczyć obraz zbioru rozwiązań efektywnych w przestrzeni ryzykozysk.
\item b. Wskazać rozwiązania efektywne minimalnego ryzyka i maksymalnego zysku. Jakie odpowiadają im wartości w przestrzeni ryzykozysk?
\item 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.
\end{itemize}
\end{itemize}
\section{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.
\subsection{Zbiory indeksowe}
\begin{table}[h!]
\centering
\begin{tabular}{|l|l|}
\hline
Zbiór & Opis \\
\hline
P = P1, \ldots, P4 & Zbiór wytwarzanych produktów \\
\hline
T = T1, \ldots, T5 & Zbiór typów narzędzi wykorzystywanych przy produkcji \\
\hline
M = M1, M2, M3 & Zbiór kolejnych miesięcy produkcji \\
\hline
\end{tabular}
\end{table}
\subsection{Parametry}
\begin{table}[h!]
\centering
\begin{tabular}{|l|p{10cm}|}
\hline
Parametr & Opis \\
\hline
$tc_t$ & Liczba narzędzi typu t [szt] \\
\hline
$eppu_p$ & Oczekiwany zysk ze sprzedaży jednej sztuki produktu $p$ [zł] \\
\hline
$ttpu_{tp}$ & Czas wykorzystania maszyny typu $t$ przy produkcji jednej sztuki produktu $p$ [godz] \\
\hline
$smlm_p$ & Limit sprzedaży produktu $p$ w miesiącu $m$ [szt] \\
\hline
$stl_p$ & Limit pojemności magazynu na produkt $p$ [szt] \\
\hline
$stcp_u$ & Koszt magazynowania jednej sztuki dowolnego produktu [zł] \\
\hline
$st0_p$ & Początkowy stan magazynowy produktu $p$ [szt] \\
\hline
$dst_p$ & Porządany końcowy stan magazynowy produktu $p$ [szt] \\
\hline
$dp_m$ & Liczba dni roboczych w każdym miesiącu [d] \\
\hline
$sp_d$ & Liczba zmian w każdym dniu roboczym [j] \\
\hline
$whp_s$ & Liczba godzin roboczych w ciągu każdej zmiany [godz] \\
\hline
$whp_m = dp_m \cdot sp_d \cdot hp_s$ & Liczba godzin roboczych w ciągu każdego miesiąca [godz] \\
\hline
$att_t = tc_t \cdot whp_m$ & Dostępna liczba godzin roboczych maszyn typu $t$ w ciągu każdego miesiąca [godz] \\
\hline
\end{tabular}
\end{table}
\subsection{Zmienne}
\begin{table}[h!]
\centering
\begin{tabular}{|l|p{10cm}|}
\hline
Zmienna & Opis \\
\hline
$p_{mp}$ & Liczba sztuk produktu $p$ wyprodukowanych w miesiącu $m$ [szt] \\
\hline
$s_{mp}$ & Liczba sztuk produktu $p$ sprzedanych w miesiącu $m$ [szt] \\
\hline
$ts_p = \sum_{m \in M} s_{mp}$ & Całkowita liczba sprzedanych sztuk produktu $p$ \\
\hline
$std_{mp} = p_{mp} - s_{mp}$ & Liczba sztuk produktu $p$ zmagazynowanych w miesiącu $m$ [szt] \\
\hline
$stg_{mp} = st0_p + \sum_{m2=1}^{m} std_{m2p}$ & Stan magazynowy produktu $p$ na koniec miesiąca $m$ [szt] \\
\hline
$uttm_t = \sum_{p \in P} p_{mp} \cdot ttpu_{tp}$ & Wykorzystanie czasu pracy maszyny typu $t$ w miesiącu $m$ [godz] \\
\hline
$tstc = stcp_u \cdot \sum_{m \in M} \sum_{p \in P} stg_{mp}$ & Całkowity koszt wykorzystania magazynów [zł] \\
\hline
$ep = \sum_{p \in P} (ts_p \cdot eppu_p) - tstc$ & Wartość zysku całkowitego dla wartości oczekiwanych zysku ze sprzedaży produktów [zł] \\
\hline
\end{tabular}
\end{table}
\subsection{Ograniczenia}
Ograniczenie rynkowe sprzedawanych produktów:
$s_{mp} \leq smlm_p, \quad \forall m \in M, \forall p \in 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:
$s_{m4} > 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}

View File

@ -1,7 +0,0 @@
Ocenione na 80/100
Uwagi:
- brak wstępu teoretycznego
- brak udowodnienia, że można użyć wartości oczekiwanej w zadaniu 1-wszym - E(R) = E(R1) + E(R2)
- błąd na wykresie z obrazem rozwiązań - pojawiają się rozwiązania zdominowane! - może sugerować błąd w implementacji
- brak odniesienia do przypadku ogólnego i omówienia wyninku w badaniu dominacji stohastycznej

View File

@ -0,0 +1,252 @@
/materials/
## CPLEX Studio ####################################################################
*.oplproject
*.project
*.log
## R programming ####################################################################
# History files
.Rhistory
.Rapp.history
# Session Data files
.RData
# Example code in package build process
*-Ex.R
# Output files from R CMD build
/*.tar.gz
# Output files from R CMD check
/*.Rcheck/
# RStudio files
.Rproj.user/
# knitr and R markdown default cache directories
/*_cache/
/cache/
# Temporary files created by R markdown
*.utf8.md
*.knit.md
## LATEX ##############################################################################
/docs/LATEX/raport.pdf
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
*.fmt
*.fot
*.cb
*.cb2
## Intermediate documents:
*.dvi
*-converted-to.*
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex
*.synctex(busy)
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# achemso
acs-*.bib
# amsthm
*.thm
# beamer
*.nav
*.pre
*.snm
*.vrb
# changes
*.soc
# cprotect
*.cpt
# elsarticle (documentclass of Elsevier journals)
*.spl
# endnotes
*.ent
# fixme
*.lox
# feynmf/feynmp
*.mf
*.mp
*.t[1-9]
*.t[1-9][0-9]
*.tfm
#(r)(e)ledmac/(r)(e)ledpar
*.end
*.?end
*.[1-9]
*.[1-9][0-9]
*.[1-9][0-9][0-9]
*.[1-9]R
*.[1-9][0-9]R
*.[1-9][0-9][0-9]R
*.eledsec[1-9]
*.eledsec[1-9]R
*.eledsec[1-9][0-9]
*.eledsec[1-9][0-9]R
*.eledsec[1-9][0-9][0-9]
*.eledsec[1-9][0-9][0-9]R
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
*.glsdefs
# gnuplottex
*-gnuplottex-*
# gregoriotex
*.gaux
*.gtex
# hyperref
*.brf
# knitr
*-concordance.tex
# TODO Comment the next line if you want to keep your tikz graphics files
*.tikz
*-tikzDictionary
# listings
*.lol
# makeidx
*.idx
*.ilg
*.ind
*.ist
# minitoc
*.maf
*.mlf
*.mlt
*.mtc[0-9]*
*.slf[0-9]*
*.slt[0-9]*
*.stc[0-9]*
# minted
_minted*
*.pyg
# morewrites
*.mw
# nomencl
*.nlo
# pax
*.pax
# pdfpcnotes
*.pdfpc
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# scrwfile
*.wrt
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# pdfcomment
*.upa
*.upb
# pythontex
*.pytxcode
pythontex-files-*/
# thmtools
*.loe
# TikZ & PGF
*.dpth
*.md5
*.auxlock
# todonotes
*.tdo
# easy-todo
*.lod
# xindy
*.xdy
# xypic precompiled matrices
*.xyc
# endfloat
*.ttt
*.fff
# Latexian
TSWLatexianTemp*
## Editors:
# WinEdt
*.bak
*.sav
# Texpad
.texpadtmp
# Kile
*.backup
# KBibTeX
*~[0-9]*
# auto folder when using emacs and auctex
/auto/*
# expex forward references with \gathertags
*-tags.tex

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,18 @@
library(MASS) # mvrnorm()
mu <- c(9, 8, 7, 6); # expected values
sigma <- matrix(c(16,-2,-1,-3,-2,9,-4,-1,-1,-4,4,1,-3,-1,1,1), 4); # covariance matrix
nu <- 4; # degrees of freedom
n <- 10000; # number of scenarios
y <- t(t(mvrnorm(n, rep(0, length(mu)), sigma) * sqrt(nu / rchisq(n, nu))) + mu)
y <- y[y[,1]>=5,]
y <- y[y[,2]>=5,]
y <- y[y[,3]>=5,]
y <- y[y[,4]>=5,]
y <- y[y[,1]<=12,]
y <- y[y[,2]<=12,]
y <- y[y[,3]<=12,]
y <- y[y[,4]<=12,]
y <- y[1:1000,]
write.table(y, "scenarios.txt", sep=" ", eol="]\n[", row.names = FALSE, col.names=FALSE)

View File

@ -0,0 +1,2 @@
# eiti-wdwr
WDWR

View File

@ -0,0 +1,53 @@
i;minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
1;-600;-600;0;0;0;0;0;0;0;0;0;0;0;0;0;50;50;50;50;50;50;50;50;50;50;50;50
2;-67.59000000000003;-67.19889931518434;9.26551;1;0;0;0;0;1;0;0;10;8;6;34;40;50;44;16;40;42;44;16;50;50;50;50
3;464.82;465.107;19.0047;0;0;0;1;0;0;0;0;23;20;14;64;27;50;36;0;27;30;36;0;50;50;50;50
4;997.23;997.357;29.4848;0;0;0;43;0;0;0;0;36;30;23;57;15;50;27;0;14;20;27;0;50;50;50;50
5;1529.64;1530.25;39.9669;0;0;0;85;0;0;0;0;47;42;31;52;3;50;19;0;3;8;19;0;50;50;50;50
6;2062.05;2062.08;50.8849;3;0;0;120;7;2;0;0;50;51;42;51;0;50;8;0;0;0;8;0;50;50;50;50
7;2594.46;2594.52;62.1001;0;0;0;162;24;13;0;0;50;51;49;50;0;50;1;0;0;0;1;0;50;50;50;50
8;3126.87;3127.18;73.5215;36;0;2;246;2;24;0;0;50;51;50;73;0;50;0;0;0;0;0;0;50;50;50;50
9;3659.28;3659.63;85.1089;44;0;8;248;8;32;1;0;50;53;50;116;0;50;0;0;0;0;0;0;50;50;50;50
10;4191.69;4192.2;96.6978;15;0;17;244;51;0;0;0;50;97;50;160;0;50;0;0;0;0;0;0;50;50;50;50
11;4724.1;4724.19;108.275;79;0;0;77;0;57;24;0;50;52;52;374;0;50;0;0;0;0;0;0;50;50;50;50
12;5256.51;5256.76;119.859;0;0;0;188;93;71;34;0;50;50;50;239;0;50;0;0;0;0;0;0;50;50;50;50
13;5788.92;5789.33;131.455;64;0;42;109;43;81;0;0;50;52;50;436;0;50;0;0;0;0;0;0;50;50;50;50
14;6321.33;6321.9;143.053;2;0;49;192;119;95;1;0;50;50;50;365;0;50;0;0;0;0;0;0;50;50;50;50
15;6853.74;6853.79;154.626;3;0;57;187;132;101;1;0;50;55;50;442;0;50;0;0;0;0;0;0;50;50;50;50
16;7386.15;7386.47;166.79;3;0;114;250;147;120;0;0;50;56;51;450;0;50;0;0;0;0;0;0;50;50;50;50
17;7918.56;7918.79;180.122;165;0;109;190;0;145;2;0;50;53;51;370;0;50;0;0;0;0;0;0;50;50;50;50
18;8450.97;8450.98;194.31;95;0;117;250;85;172;50;0;50;50;56;450;0;50;0;0;0;0;0;0;50;50;50;50
19;8983.38;8983.46;209.32;201;0;146;190;1;191;51;0;50;52;54;450;0;50;0;0;0;0;0;0;50;50;50;50
20;9515.79;9515.8;225.023;288;0;148;250;1;212;81;0;50;50;50;450;0;50;0;0;0;0;0;0;50;50;50;50
21;10048.2;10048.3;241.223;1;0;150;190;236;302;0;0;50;51;160;370;0;50;0;0;0;0;0;0;50;50;50;50
22;10580.6;10580.7;257.65;257;0;109;250;1;0;0;0;50;304;184;450;0;50;0;0;0;0;0;0;50;50;50;50
23;11113;11113.1;274.336;1;0;149;250;274;349;162;0;50;56;50;450;0;50;0;0;0;0;0;0;50;50;50;50
24;11645.4;11645.6;291.421;272;0;150;190;85;1;188;0;50;346;50;450;0;50;0;0;0;0;0;0;50;50;50;50
25;12177.8;12177.9;308.783;270;0;111;190;36;270;0;0;50;99;301;450;0;50;0;0;0;0;0;0;50;50;50;50
26;12710.2;12710.4;326.256;0;0;0;250;324;271;409;0;50;183;80;450;0;50;0;0;0;0;0;0;50;50;50;50
27;13242.7;13242.9;343.752;270;0;148;190;135;0;275;0;50;411;52;450;0;50;0;0;0;0;0;0;50;50;50;50
28;13775.1;13775.2;361.295;0;0;3;250;362;350;0;0;50;160;560;370;0;50;0;0;0;0;0;0;50;50;50;50
29;14307.5;14307.7;378.849;271;0;146;190;176;11;327;0;50;439;52;450;0;50;0;0;0;0;0;0;50;50;50;50
30;14839.9;14840;396.41;347;0;110;190;131;270;482;0;50;266;51;370;0;50;0;0;0;0;0;0;50;50;50;50
31;15372.3;15372.7;414.073;0;0;5;190;417;349;5;0;50;225;530;450;0;50;0;0;0;0;0;0;50;50;50;50
32;15904.7;15904.9;431.837;270;0;110;190;162;270;400;0;50;246;60;370;0;50;0;0;0;0;0;0;50;50;50;50
33;16437.1;16437.2;449.621;270;0;0;190;239;350;72;0;50;269;649;450;0;50;0;0;0;0;0;0;50;50;50;50
34;16969.5;16969.6;467.424;350;0;5;250;190;1;399;0;50;560;227;370;0;50;0;0;0;0;0;0;50;50;50;50
35;17501.9;17502;485.233;349;0;1;250;204;23;129;0;50;691;530;370;0;50;0;0;0;0;0;0;50;50;50;50
36;18034.3;18034.4;503.08;0;0;148;250;610;0;51;0;50;748;530;450;0;50;0;0;0;0;0;0;50;50;50;50
37;18566.8;18566.9;520.949;1;0;150;190;502;0;401;0;50;776;288;450;0;50;0;0;0;0;0;0;50;50;50;50
38;19099.2;19099.2;538.82;1;0;1;250;520;1;499;0;50;803;344;450;0;50;0;0;0;0;0;0;50;50;50;50
39;19631.6;19631.6;556.705;1;0;150;190;672;349;500;0;50;406;261;370;0;50;0;0;0;0;0;0;50;50;50;50
40;20164;20164;574.59;1;0;36;250;693;9;497;0;50;690;363;370;0;50;0;0;0;0;0;0;50;50;50;50
41;20696.4;20696.4;592.504;347;0;2;190;305;34;290;0;50;850;648;450;0;50;0;0;0;0;0;0;50;50;50;50
42;21228.8;21228.8;610.459;271;0;1;190;383;59;499;0;50;850;444;370;0;50;0;0;0;0;0;0;50;50;50;50
43;21761.2;21761.3;628.438;350;0;150;190;338;349;500;0;50;500;362;450;0;50;0;0;0;0;0;0;50;50;50;50
44;22293.6;22293.7;646.432;348;0;148;190;358;296;401;0;50;690;471;450;0;50;0;0;0;0;0;0;50;50;50;50
45;22826;22826.1;664.435;350;0;0;250;374;347;400;0;50;543;527;450;0;50;0;0;0;0;0;0;50;50;50;50
46;23358.4;23358.5;682.428;270;0;149;190;570;145;313;0;50;848;530;450;0;50;0;0;0;0;0;0;50;50;50;50
47;23890.9;23891;700.439;271;0;150;250;591;270;339;0;50;719;650;450;0;50;0;0;0;0;0;0;50;50;50;50
48;24423.3;24423.3;718.467;323;0;150;250;561;258;366;0;50;761;650;370;0;50;0;0;0;0;0;0;50;50;50;50
49;24955.7;24955.8;736.497;350;0;150;250;446;272;498;0;50;850;524;450;0;50;0;0;0;0;0;0;50;50;50;50
50;25488.1;25488.3;755.133;185;0;110;190;700;307;400;0;50;848;530;450;0;50;0;0;0;0;0;0;50;50;50;50
51;26020.5;26020.6;774.872;221;0;150;250;696;263;400;0;50;690;530;450;0;50;0;0;0;0;0;0;50;50;50;50
52;26552.9;26553.9;796.113;270;0;110;190;700;270;500;0;50;690;650;450;0;50;0;0;0;0;0;0;50;50;50;50

View File

@ -0,0 +1,99 @@
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
10580.7;10580.8;257.666;336;0;149;190;0;1;134;0;50;301;51;370;0;50;0;0;0;0;0;0;50;50;50;50
avgProfit:
10431.3
10701.3
10289.3
10069.9
10850.6
10484.8
10350.1
10326.3
10453.9
10467.4
10049.4
10603.5
11024.6
11070.8
10234.5
10268
10798.3
9880.5
10836.7
11107.6
10320.1
11855.6
9764.31
11123.6
10475
11498.3
10815
10594.3
9900.24
10777.9
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
20164;20164;574.598;346;0;0;250;289;9;401;0;50;689;583;370;0;50;0;0;0;0;0;0;50;50;50;50
avgProfit:
20154.7
20455.9
20073
18945.5
20449.9
19784.6
19458
19834.6
20212.1
20071.6
18646.7
20721.6
20994.7
21696
19350
19462
20773.9
18405.2
20631.2
20984
18959.4
22145.5
18483.8
21647.1
20124.6
22142.5
20811.8
20397.9
18593.3
20510
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
26553.9;26553.9;796.113;270;0;150;190;700;270;400;0;50;850;530;370;0;50;0;0;0;0;0;0;50;50;50;50
avgProfit:
26799.8
27035.6
26275.1
24812.5
26806
25731.5
25709.3
26040
26796.5
26717.3
24063.1
27351.1
27509.7
28774
25328.3
25695.7
27530.2
24353
26997.2
27534.5
24894.9
28956
24512.9
28704.1
26404.1
29275.3
27718.4
27043.9
24179.5
27068.2

View File

@ -0,0 +1,99 @@
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
25488.3;25488.3;755.133;268;0;110;190;477;270;500;0;50;654;530;370;0;50;0;0;0;0;0;0;50;50;50;50
avgProfit:
25609.4
25873.7
25413.2
23878.9
25764.6
24872.7
24604.1
25059.6
25695.3
25506.2
23307.3
26302.3
26478.7
27585.3
24356.9
24579.8
26361.5
23240.8
26012.6
26449.8
23820.7
27877.6
23386.8
27485.6
25413.4
28068.6
26454.6
25893.9
23353.4
25942
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
26020.6;26020.8;774.88;218;0;110;190;700;266;400;0;50;846;530;450;0;50;0;0;0;0;0;0;50;50;50;50
avgProfit:
26186
26404.1
25894.4
24381.3
26283.5
25336.7
25180.9
25542.5
26294.8
26116.1
23699.7
26835.4
26989.9
28161.5
24813.8
25087.9
26951.7
23788.7
26512.6
26979.8
24345.2
28472.6
23907.3
28056.3
25890.8
28668.9
27075.7
26478.2
23787.7
26501.1
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
26553.9;26553.9;796.113;270;0;150;190;700;270;400;0;50;850;530;370;0;50;0;0;0;0;0;0;50;50;50;50
avgProfit:
26799.8
27035.6
26275.1
24812.5
26806
25731.5
25709.3
26040
26796.5
26717.3
24063.1
27351.1
27509.7
28774
25328.3
25695.7
27530.2
24353
26997.2
27534.5
24894.9
28956
24512.9
28704.1
26404.1
29275.3
27718.4
27043.9
24179.5
27068.2

View File

@ -0,0 +1,99 @@
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
10580.7;10580.8;257.666;336;0;149;190;0;1;134;0;50;301;51;370;0;50;0;0;0;0;0;0;50;50;50;50
Risk:
184.458
195.09
207.678
278.26
220.823
181.042
195.281
199.255
182.194
181.295
285.773
185.306
272.997
288.405
223.407
213.341
208.693
354.01
217.093
301.892
200.499
637.424
408.232
308.314
181.042
470.693
212.039
184.694
345.455
205.291
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
20164;20164;574.598;346;0;0;250;289;9;401;0;50;689;583;370;0;50;0;0;0;0;0;0;50;50;50;50
Risk:
403.784
414.043
408.225
664.379
413.447
448.303
513.763
439.966
403.784
408.366
773.926
459.531
537.056
795.835
542.569
512.817
471.741
879.425
441.46
533.521
659.742
990.73
842.758
776.278
404.787
989.35
481.833
409.978
795.275
421.261
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
26553.9;26553.9;796.113;270;0;150;190;700;270;400;0;50;850;530;370;0;50;0;0;0;0;0;0;50;50;50;50
Risk:
559.839
576.633
596.264
942.092
560.045
679.026
683.47
627.607
559.839
562.478
1245.41
638.37
675.366
1132.8
784.609
686.634
680.842
1115.92
572.793
682.114
914.647
1211.67
1051.95
1104.87
583.36
1360.71
743.425
577.734
1191.09
581.791

View File

@ -0,0 +1,99 @@
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
25488.3;25488.3;755.133;268;0;110;190;477;270;500;0;50;654;530;370;0;50;0;0;0;0;0;0;50;50;50;50
Risk:
530.713
540.297
540.363
880.892
533.022
618.647
672.371
587.509
530.713
534.152
1092.72
618.438
665.276
1074.34
737.478
678.05
632.259
1123.76
560.502
655.794
900.277
1201.02
1059.4
1034.46
540.34
1290.13
657.239
542.315
1072.76
548.737
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
26020.6;26020.8;774.88;218;0;110;190;700;266;400;0;50;846;530;450;0;50;0;0;0;0;0;0;50;50;50;50
Risk:
545.117
552.781
562.228
899.047
545.117
643.324
674.499
609.029
545.491
547.446
1160.56
629.71
667.372
1097.62
769.274
696.182
656.859
1119.07
565.151
664.345
911.073
1232.42
1071.62
1055.54
562.586
1324.02
695.983
560.188
1119.5
563.245
minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4
26553.9;26553.9;796.113;270;0;150;190;700;270;400;0;50;850;530;370;0;50;0;0;0;0;0;0;50;50;50;50
Risk:
559.839
576.633
596.264
942.092
560.045
679.026
683.47
627.607
559.839
562.478
1245.41
638.37
675.366
1132.8
784.609
686.634
680.842
1115.92
572.793
682.114
914.647
1211.67
1051.95
1104.87
583.36
1360.71
743.425
577.734
1191.09
581.791

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,117 @@
/*********************************************
* OPL 12.5.1.0 Model
* Author: Krzysztof Rudnicki
* Creation Date: May 23, 2017 at 6:34:43 PM
*********************************************/
/***********PARAMETRY************************/
//Paramatry zostaladniej opisane w pliku .dat oraz raporcie
// Parametry liczbowe
int nMachType = ...;
int nMonth = ...;
int nProdType = ...;
int nHours = ...;
int nScenarios = ...;
// Utworzenie wektorow indeksujacych
{int} machines = asSet(1..nMachType);
{int} months = asSet(1..nMonth);
{int} products = asSet(1..nProdType);
{int} scenarios = asSet(1..nScenarios);
//Parametry produkcji i sprzedazy
int machineCount[machines] = ...;
float prodTime[machines][products] = ...;
int maxInMonth[months][products] = ...;
//Parametry magazynowania
int storageMax[products] = ...;
int storageCost = ...;
int storageStart[products] = ...;
//Parametry do generowania scenariusze (nieuzywane w modelu CPLEX)
int mu[products] = ...;
int sigma[products][products] = ...;
//Macierz scenariuszy dochodow ze sprzedazy: typ produkty (kolumna) - scenariusz (wiersz)
float sellProfit[scenarios][products] = ...;
/*********** ZMIENNE DECYZYJNE ********************************************/
dvar int produce[months][products]; // Liczba wyprodukowanych
dvar int sell[months][products]; // Liczba sprzedanych
dvar int stock[months][products]; // Liczba w magazynie
// Czas wykorzystany na danym typie maszyna na dany typ produktu
dvar float workTime[months][machines][products];
// Zmienna binarna - czy sprzedaz danego typu produktu przekaroczyla 80 procent pojemnosci rynku
dvar boolean if80prec[months][products];
// Zmienna - ile pieniedzy nalezy odjac od dochodow z poszczegolnych produkow
// w poszczegolnych miesiacach ze wzgledu na przekroczenie 80% pojmnosci rynku
dvar float lowerProfit[scenarios][months][products];
/************ KRYTERIA OCENY *********************************************/
// zysk policzony dla poszczegolnych scenariuszy
dexpr float profit[i in scenarios] = sum(m in months, p in products)
(sell[m][p]*sellProfit[i][p]-lowerProfit[i][m][p]- stock[m][p]*storageCost);
// wartosc oczekiwana zysku policzona jako srednia
dexpr float avgProfit = sum(i in scenarios)(profit[i])/nScenarios;
// funkcja celu
maximize avgProfit;
// ************** OGRANICZENIA ******************************************/
subject to {
// Zmienne decyzyjne nie mniejsze niz zero
forall(i in scenarios, m in months, mc in machines, p in products) {
workTime[m][mc][p] >= 0;
produce[m][p] >= 0;
sell[m][p] >= 0;
stock[m][p] >= 0;
lowerProfit[i][m][p] >= 0;
}
// Ogranicznie czasu produkcji maszyn w miesiacu
forall(m in months, mc in machines) {
sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*nHours);
}
// Ograniczenie definiujace wykorzystany czas pracy maszyn
forall(m in months, p in products, mc in machines) {
workTime[m][mc][p] == produce[m][p]*prodTime[mc][p];
}
// Ogranicznie maksymalnej pojemnosci rynku
forall(m in months, p in products) {
sell[m][p] <= maxInMonth[m][p];
}
// Ogranicznie ustawiajace zmienna binarna po przekroczeniu 80 procent pojemnosci rynku
forall(m in months, p in products) {
sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p];
sell[m][p] >= 0.8*maxInMonth[m][p] * if80prec[m][p];
}
// Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu
forall (i in scenarios,m in months, p in products) {
lowerProfit[i][m][p] <= 1000000 * if80prec[m][p];
lowerProfit[i][m][p] <= 0.2 * sell[m][p]*sellProfit[i][p];
0.2 * sell[m][p]*sellProfit[i][p] - lowerProfit[i][m][p] + 1000000 * if80prec[m][p] <= 1000000;
}
// Ograniczenie sprzedazy oraz definicja ilosci towaru pozostajacej w magazynie
forall(m in months, p in products) {
if(m == 1) { //pierwszy miesiac
sell[m][p] <= produce[m][p]+storageStart[p];
stock[m][p]==(produce[m][p] + storageStart[p])-sell[m][p];
}else { // kolejne miesiace
sell[m][p] <= produce[m][p] + stock[m-1][p];
stock[m][p]==(produce[m][p] + stock[m-1][p])-sell[m][p];
}
}
// Ogranicznie maksymalnej ilosci magazynowanych produktow oraz
// wymaganej ilosc pozostalej w magazynie na na koniec symulacji
forall(m in months, p in products) {
stock[m][p] <= storageMax[p];
if(m == 3) {
stock[m][p] >= 50;
}
}
}

View File

@ -0,0 +1,77 @@
/*********************************************
* OPL 12.5.1.0 Data
* Author: Krzysztof Rudnicki
* Creation Date: May 24, 2017 at 10:09:32 PM
*********************************************/
/***************PARAMETRY********************/
nMachType = 5; //ilosc typow maszun
nMonth = 3; //ilosc symulowanych miesiecy
nProdType = 4; //ilosc typow produktow
nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384
nScenarios = 30; //ilosc scenariuszy w symulacji
// Ilosc maszyn poszczegolnych typow
machineCount = [4 2 3 1 1];
// Koszty wykorzystania typow maszyn (wiersze)
//w wytwarzaniu poszczegolnych typow produktow (kolumny)
prodTime = [[ 0.4 0.6 0 0]
[ 0.2 0.1 0 0.6]
[ 0.1 0 0.7 0]
[ 0.06 0.04 0 0.05]
[ 0 0.05 0.02 0]];
// Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz)
maxInMonth = [[ 200 0 100 200]
[ 300 100 200 200]
[ 0 300 100 200]];
// Magazyn
storageMax = [200 200 200 200]; //maksymalna pojemnosc dla typow produktow
storageCost = 1; //koszt magazynowania zl/sztuka/miesiac
storageStart = [0 0 0 0]; //poczatkowa ilosc w magazynach
/************************* SCENARIOS *************************/
// expected values (used only in t-student.R script)
mu = [9 8 7 6];
// covariance (used only in t-student.R script)
sigma = [[ 16 -2 -1 -3]
[ -2 9 -4 -1]
[ -1 -4 4 1]
[ -3 -1 1 1]];
// scenarios (generated by t-student.R script)
sellProfit = [[10.7349277395552 7.72178696852481 6.91313555665251 5.3580692014906]
[11.4029325398093 5.35289018472828 8.44560627918346 5.94437008867837]
[5.9511305436333 9.89072813219028 8.15019579921374 5.92283032635847]
[6.98653442934503 9.43820696539249 6.08947859890014 6.28684001183198]
[8.97632928181137 7.73492022936159 7.69443003815675 6.65911599366542]
[6.3718935550723 8.80949463923562 7.79090422832384 6.81174804312265]
[8.78246371277526 9.96223625339419 5.07839427301482 6.04541265888823]
[8.61200211939238 6.9004774184148 8.38569802461679 6.01047636955988]
[8.04259291408092 11.6005401405856 5.51825529023523 5.52418355625024]
[10.2568641176451 9.42484863719592 5.61768337124079 5.44832826311492]
[6.06345343273768 6.67810135189213 8.25425855603235 7.11046580533962]
[8.74262951486885 8.49193741618487 8.26781448661321 5.63718569432722]
[8.96019482191789 7.48206038212727 8.64020735666332 6.61806454609454]
[10.7060656286305 7.74073441264031 8.70806653294011 5.56273592101066]
[9.14849596786536 5.38206186993592 8.48324089408178 6.31836607658665]
[10.9884988766065 5.05294389126629 7.81201862380442 5.89377116896792]
[9.85025400030063 9.20603928762331 6.76845266520436 5.77678827669309]
[9.76699335636152 7.83363407758539 5.01347383618885 5.84594312150737]
[8.22098260831502 7.93964476990494 8.36747212617667 6.58666346744554]
[9.64940023484707 7.34646951028725 8.15389801271092 6.71485257935324]
[9.56697193644308 7.24791547600423 5.82061898605385 6.6329880618574]
[7.64858383380397 11.8956850930214 6.57566578417732 7.52978318768004]
[10.8667504186116 5.6239431792075 6.49095275149094 5.44747350145729]
[11.5459204391574 6.5874000517338 8.91791399632966 5.70569902009294]
[9.00453124705504 6.25952067886102 8.93937357845343 6.11437998871486]
[10.4316051568988 8.89165309349428 8.00183466339121 6.22792967489147]
[11.1403947310683 8.80153331584519 6.36710780356291 5.52424084189948]
[9.5907049066395 9.30053224873728 6.5052199777433 5.64308372528693]
[6.47305423724122 7.66508680006143 7.42589600717661 6.52108273658984]
[9.76726531281191 8.22194904261638 7.1081746124431 6.13833241033153]
];

View File

@ -0,0 +1,128 @@
/*********************************************
* OPL 12.5.1.0 Model
* Author: mateu
* Creation Date: May 24, 2017 at 10:08:31 PM
*********************************************/
/***********PARAMETRY************************/
//Paramatry zostaladniej opisane w pliku .dat oraz raporcie
// Parametry liczbowe
int nMachType = ...;
int nMonth = ...;
int nProdType = ...;
int nHours = ...;
int nScenarios = ...;
// Utworzenie wektorow indeksujacych
{int} machines = asSet(1..nMachType);
{int} months = asSet(1..nMonth);
{int} products = asSet(1..nProdType);
{int} scenarios = asSet(1..nScenarios);
//Parametry produkcji i sprzedazy
int machineCount[machines] = ...;
float prodTime[machines][products] = ...;
int maxInMonth[months][products] = ...;
//Parametry magazynowania
int storageMax[products] = ...;
int storageCost = ...;
int storageStart[products] = ...;
//Parametry do generowania scenariusze (nieuzywane w modelu CPLEX)
int mu[products] = ...;
int sigma[products][products] = ...;
//Macierz scenariuszy dochodow ze sprzedazy: typ produkty (kolumna) - scenariusz (wiersz)
float sellProfit[scenarios][products] = ...;
/*********** ZMIENNE DECYZYJNE ********************************************/
dvar int produce[months][products]; // Liczba wyprodukowanych
dvar int sell[months][products]; // Liczba sprzedanych
dvar int stock[months][products]; // Liczba w magazynie
// Czas wykorzystany na danym typie maszyna na dany typ produktu
dvar float workTime[months][machines][products];
// Zmienna binarna - czy sprzedaz danego typu produktu przekaroczyla 80 procent pojemnosci rynku
dvar boolean if80prec[months][products];
// Zmienna - ile pieniedzy nalezy odjac od dochodow z poszczegolnych produkow
// w poszczegolnych miesiacach ze wzgledu na przekroczenie 80% pojmnosci rynku
dvar float lowerProfit[scenarios][months][products];
/************ KRYTERIA OCENY *********************************************/
// ZYSK policzony dla poszczegolnych scenariuszy
dexpr float profit[i in scenarios] = sum(m in months, p in products)
(sell[m][p]*sellProfit[i][p]-lowerProfit[i][m][p]- stock[m][p]*storageCost);
// wartosc oczekiwana zysku policzona jako srednia
dexpr float avgProfit = sum(i in scenarios)(profit[i])/nScenarios;
// RYZYKO zdefiniowane srednia roznica Giniego
dexpr float giniRisk = sum (t1 in scenarios, t2 in scenarios ) (
0.5 * abs(profit[t1] - profit[t2]) * 1/nScenarios * 1/nScenarios
);
// funkcja celu
//minimize giniRisk;
maximize avgProfit;
// ************** OGRANICZENIA ******************************************/
subject to {
// Zmienne decyzyjne nie mniejsze niz zero
forall(i in scenarios, m in months, mc in machines, p in products) {
workTime[m][mc][p] >= 0;
produce[m][p] >= 0;
sell[m][p] >= 0;
stock[m][p] >= 0;
lowerProfit[i][m][p] >= 0;
}
// Ogranicznie czasu produkcji maszyn w miesiacu
forall(m in months, mc in machines) {
sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*nHours);
}
// Ograniczenie definiujace wykorzystany czas pracy maszyn
forall(m in months, p in products, mc in machines) {
workTime[m][mc][p] == produce[m][p]*prodTime[mc][p];
}
// Ogranicznie maksymalnej pojemnosci rynku
forall(m in months, p in products) {
sell[m][p] <= maxInMonth[m][p];
}
// Ogranicznie ustawiajace zmienna binarna po przekroczeniu 80 procent pojemnosci rynku
forall(m in months, p in products) {
sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p];
sell[m][p] >= 0.8*maxInMonth[m][p] * if80prec[m][p];
}
// Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu
forall (i in scenarios,m in months, p in products) {
lowerProfit[i][m][p] <= 1000000 * if80prec[m][p];
lowerProfit[i][m][p] <= 0.2 * sell[m][p]*sellProfit[i][p];
0.2 * sell[m][p]*sellProfit[i][p] - lowerProfit[i][m][p] + 1000000 * if80prec[m][p] <= 1000000;
}
// Ograniczenie sprzedazy oraz definicja ilosci towaru pozostajacej w magazynie
forall(m in months, p in products) {
if(m == 1) { //pierwszy miesiac
sell[m][p] <= produce[m][p]+storageStart[p];
stock[m][p]==(produce[m][p] + storageStart[p])-sell[m][p];
}else { // kolejne miesiace
sell[m][p] <= produce[m][p] + stock[m-1][p];
stock[m][p]==(produce[m][p] + stock[m-1][p])-sell[m][p];
}
}
// Ogranicznie maksymalnej ilosci magazynowanych produktow oraz
// wymaganej ilosc pozostalej w magazynie na na koniec symulacji
forall(m in months, p in products) {
stock[m][p] <= storageMax[p];
if(m == 3) {
stock[m][p] >= 50;
}
}
}
execute {
cplex.tilim = 600;
writeln("avgProfit: ",avgProfit,", giniRisk: ",giniRisk);
}

View File

@ -0,0 +1,80 @@
/*********************************************
* OPL 12.5.1.0 Data
* Author: Krzysztof Rudnicki
* Creation Date: May 24, 2017 at 10:09:32 PM
*********************************************/
/***************PARAMETRY********************/
nMachType = 5; //ilosc typow maszun
nMonth = 3; //ilosc symulowanych miesiecy
nProdType = 4; //ilosc typow produktow
nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384
nScenarios = 30; //ilosc scenariuszy w symulacji
// Ilosc maszyn poszczegolnych typow
machineCount = [4 2 3 1 1];
// Koszty wykorzystania typow maszyn (wiersze)
//w wytwarzaniu poszczegolnych typow produktow (kolumny)
prodTime = [[ 0.4 0.6 0 0]
[ 0.2 0.1 0 0.6]
[ 0.1 0 0.7 0]
[ 0.06 0.04 0 0.05]
[ 0 0.05 0.02 0]];
// Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz)
maxInMonth = [[ 200 0 100 200]
[ 300 100 200 200]
[ 0 300 100 200]];
// Magazyn
storageMax = [200 200 200 200]; //maksymalna pojemnosc dla typow produktow
storageCost = 1; //koszt magazynowania zl/sztuka/miesiac
storageStart = [0 0 0 0]; //poczatkowa ilosc w magazynach
/******************* METODA: WYMAGANY POZIOM ZYSKU ***********/
minAvgProfit = 20000.0; //wymagany poziom zysku
/************************* SCENARIOS *************************/
// expected values (used only in t-student.R script)
mu = [9 8 7 6];
// covariance (used only in t-student.R script)
sigma = [[ 16 -2 -1 -3]
[ -2 9 -4 -1]
[ -1 -4 4 1]
[ -3 -1 1 1]];
// scenarios (generated by t-student.R script)
sellProfit = [[10.7349277395552 7.72178696852481 6.91313555665251 5.3580692014906]
[11.4029325398093 5.35289018472828 8.44560627918346 5.94437008867837]
[5.9511305436333 9.89072813219028 8.15019579921374 5.92283032635847]
[6.98653442934503 9.43820696539249 6.08947859890014 6.28684001183198]
[8.97632928181137 7.73492022936159 7.69443003815675 6.65911599366542]
[6.3718935550723 8.80949463923562 7.79090422832384 6.81174804312265]
[8.78246371277526 9.96223625339419 5.07839427301482 6.04541265888823]
[8.61200211939238 6.9004774184148 8.38569802461679 6.01047636955988]
[8.04259291408092 11.6005401405856 5.51825529023523 5.52418355625024]
[10.2568641176451 9.42484863719592 5.61768337124079 5.44832826311492]
[6.06345343273768 6.67810135189213 8.25425855603235 7.11046580533962]
[8.74262951486885 8.49193741618487 8.26781448661321 5.63718569432722]
[8.96019482191789 7.48206038212727 8.64020735666332 6.61806454609454]
[10.7060656286305 7.74073441264031 8.70806653294011 5.56273592101066]
[9.14849596786536 5.38206186993592 8.48324089408178 6.31836607658665]
[10.9884988766065 5.05294389126629 7.81201862380442 5.89377116896792]
[9.85025400030063 9.20603928762331 6.76845266520436 5.77678827669309]
[9.76699335636152 7.83363407758539 5.01347383618885 5.84594312150737]
[8.22098260831502 7.93964476990494 8.36747212617667 6.58666346744554]
[9.64940023484707 7.34646951028725 8.15389801271092 6.71485257935324]
[9.56697193644308 7.24791547600423 5.82061898605385 6.6329880618574]
[7.64858383380397 11.8956850930214 6.57566578417732 7.52978318768004]
[10.8667504186116 5.6239431792075 6.49095275149094 5.44747350145729]
[11.5459204391574 6.5874000517338 8.91791399632966 5.70569902009294]
[9.00453124705504 6.25952067886102 8.93937357845343 6.11437998871486]
[10.4316051568988 8.89165309349428 8.00183466339121 6.22792967489147]
[11.1403947310683 8.80153331584519 6.36710780356291 5.52424084189948]
[9.5907049066395 9.30053224873728 6.5052199777433 5.64308372528693]
[6.47305423724122 7.66508680006143 7.42589600717661 6.52108273658984]
[9.76726531281191 8.22194904261638 7.1081746124431 6.13833241033153]
];

View File

@ -0,0 +1,164 @@
/*********************************************
* OPL 12.5.1.0 Model
* Author: mateu
* Creation Date: May 24, 2017 at 10:08:31 PM
*********************************************/
/***********PARAMETRY************************/
//Paramatry zostaladniej opisane w pliku .dat oraz raporcie
// Parametry liczbowe
int nMachType = ...;
int nMonth = ...;
int nProdType = ...;
int nHours = ...;
int nScenarios = ...;
// Utworzenie wektorow indeksujacych
{int} machines = asSet(1..nMachType);
{int} months = asSet(1..nMonth);
{int} products = asSet(1..nProdType);
{int} scenarios = asSet(1..nScenarios);
//Parametry produkcji i sprzedazy
int machineCount[machines] = ...;
float prodTime[machines][products] = ...;
int maxInMonth[months][products] = ...;
//Parametry magazynowania
int storageMax[products] = ...;
int storageCost = ...;
int storageStart[products] = ...;
//Parametry do generowania scenariusze (nieuzywane w modelu CPLEX)
int mu[products] = ...;
int sigma[products][products] = ...;
//Macierz scenariuszy dochodow ze sprzedazy: typ produkty (kolumna) - scenariusz (wiersz)
float sellProfit[scenarios][products] = ...;
/******************* PARAMTERY METODY: WYMAGANY POZIOM ZYSKU ***********/
float minAvgProfit = ...; //wymagany poziom zysku
/*********** ZMIENNE DECYZYJNE ********************************************/
dvar int produce[months][products]; // Liczba wyprodukowanych
dvar int sell[months][products]; // Liczba sprzedanych
dvar int stock[months][products]; // Liczba w magazynie
// Czas wykorzystany na danym typie maszyna na dany typ produktu
dvar float workTime[months][machines][products];
// Zmienna binarna - czy sprzedaz danego typu produktu przekaroczyla 80 procent pojemnosci rynku
dvar boolean if80prec[months][products];
// Zmienna - ile pieniedzy nalezy odjac od dochodow z poszczegolnych produkow
// w poszczegolnych miesiacach ze wzgledu na przekroczenie 80% pojmnosci rynku
dvar float lowerProfit[scenarios][months][products];
/************ KRYTERIA OCENY *********************************************/
// ZYSK policzony dla poszczegolnych scenariuszy
dexpr float profit[i in scenarios] = sum(m in months, p in products)
(sell[m][p]*sellProfit[i][p]-lowerProfit[i][m][p]- stock[m][p]*storageCost);
// wartosc oczekiwana zysku policzona jako srednia
dexpr float avgProfit = sum(i in scenarios)(profit[i])/nScenarios;
// RYZYKO zdefiniowane srednia roznica Giniego
dexpr float giniRisk = sum (t1 in scenarios, t2 in scenarios ) (
0.5 * abs(profit[t1] - profit[t2]) * 1/nScenarios * 1/nScenarios
);
// funkcja celu
minimize giniRisk;
//maximize avgProfit;
// ************** OGRANICZENIA ******************************************/
subject to {
// Zmienne decyzyjne nie mniejsze niz zero
forall(i in scenarios, m in months, mc in machines, p in products) {
workTime[m][mc][p] >= 0;
produce[m][p] >= 0;
sell[m][p] >= 0;
stock[m][p] >= 0;
lowerProfit[i][m][p] >= 0;
}
// Ogranicznie czasu produkcji maszyn w miesiacu
forall(m in months, mc in machines) {
sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*nHours);
}
// Ograniczenie definiujace wykorzystany czas pracy maszyn
forall(m in months, p in products, mc in machines) {
workTime[m][mc][p] == produce[m][p]*prodTime[mc][p];
}
// Ogranicznie maksymalnej pojemnosci rynku
forall(m in months, p in products) {
sell[m][p] <= maxInMonth[m][p];
}
// Ogranicznie ustawiajace zmienna binarna po przekroczeniu 80 procent pojemnosci rynku
forall(m in months, p in products) {
sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p];
sell[m][p] >= 0.8*maxInMonth[m][p] * if80prec[m][p];
}
// Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu
forall (i in scenarios,m in months, p in products) {
lowerProfit[i][m][p] <= 1000000 * if80prec[m][p];
lowerProfit[i][m][p] <= 0.2 * sell[m][p]*sellProfit[i][p];
0.2 * sell[m][p]*sellProfit[i][p] - lowerProfit[i][m][p] + 1000000 * if80prec[m][p] <= 1000000;
}
// Ograniczenie sprzedazy oraz definicja ilosci towaru pozostajacej w magazynie
forall(m in months, p in products) {
if(m == 1) { //pierwszy miesiac
sell[m][p] <= produce[m][p]+storageStart[p];
stock[m][p]==(produce[m][p] + storageStart[p])-sell[m][p];
}else { // kolejne miesiace
sell[m][p] <= produce[m][p] + stock[m-1][p];
stock[m][p]==(produce[m][p] + stock[m-1][p])-sell[m][p];
}
}
// Ogranicznie maksymalnej ilosci magazynowanych produktow oraz
// wymaganej ilosc pozostalej w magazynie na na koniec symulacji
forall(m in months, p in products) {
stock[m][p] <= storageMax[p];
if(m == 3) {
stock[m][p] >= 50;
}
}
/******************OGRANICZENIE: WYMAGANY POZIOM ZYSKU ****************************/
avgProfit>=minAvgProfit;
}// Koniec ogranicznen
main {
var file = new IloOplOutputFile("result-minAvgProfit.txt");
//var fileAP = new IloOplOutputFile("avgProfitScenario.txt");
//var fileMR = new IloOplOutputFile("maxRiskScenario.txt");
var mod = thisOplModel;
var def = mod.modelDefinition;
var data = mod.dataElements;
var maxAvgProfit = 26553;
var i = 1;
file.writeln("i;minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4");
data.minAvgProfit = -600.0;
while (data.minAvgProfit <= maxAvgProfit) {
mod = new IloOplModel (def, cplex);
mod.addDataSource(data);
mod.generate();
cplex.tilim = 300;
cplex.solve();
file.writeln(i,";",data.minAvgProfit,";",mod.avgProfit,";",mod.giniRisk,";",mod.produce[1][1],";",mod.produce[1][2],";",mod.produce[1][3],";",mod.produce[1][4], ";",mod.produce[2][1],";",mod.produce[2][2],";",mod.produce[2][3],";",mod.produce[2][4],";",mod.produce[3][1],";",mod.produce[3][2], ";",mod.produce[3][3],";",mod.produce[3][4],";",mod.stock[1][1],";",mod.stock[1][2],";",mod.stock[1][3],";",mod.stock[1][4], ";",mod.stock[2][1],";",mod.stock[2][2],";",mod.stock[2][3],";",mod.stock[2][4],";",mod.stock[3][1],";",mod.stock[3][2], ";",mod.stock[3][3],";",mod.stock[3][4]);
writeln(i," minAvgProfit: ",data.minAvgProfit," avgProfit: ",mod.avgProfit,", giniRisk: ",mod.giniRisk);
mod.end();
data.minAvgProfit = data.minAvgProfit + 532.41;
i = i+1;
};
file.close();
//fileAP.close();
//fileMR.close();
}

View File

@ -0,0 +1,80 @@
/*********************************************
* OPL 12.5.1.0 Data
* Author: Krzysztof Rudnicki
* Creation Date: May 24, 2017 at 10:09:32 PM
*********************************************/
/***************PARAMETRY********************/
nMachType = 5; //ilosc typow maszun
nMonth = 3; //ilosc symulowanych miesiecy
nProdType = 4; //ilosc typow produktow
nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384
nScenarios = 30; //ilosc scenariuszy w symulacji
// Ilosc maszyn poszczegolnych typow
machineCount = [4 2 3 1 1];
// Koszty wykorzystania typow maszyn (wiersze)
//w wytwarzaniu poszczegolnych typow produktow (kolumny)
prodTime = [[ 0.4 0.6 0 0]
[ 0.2 0.1 0 0.6]
[ 0.1 0 0.7 0]
[ 0.06 0.04 0 0.05]
[ 0 0.05 0.02 0]];
// Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz)
maxInMonth = [[ 200 0 100 200]
[ 300 100 200 200]
[ 0 300 100 200]];
// Magazyn
storageMax = [200 200 200 200]; //maksymalna pojemnosc dla typow produktow
storageCost = 1; //koszt magazynowania zl/sztuka/miesiac
storageStart = [0 0 0 0]; //poczatkowa ilosc w magazynach
/******************* METODA: WYMAGANY POZIOM ZYSKU ***********/
minAvgProfit = 20000.0; //wymagany poziom zysku
/************************* SCENARIOS *************************/
// expected values (used only in t-student.R script)
mu = [9 8 7 6];
// covariance (used only in t-student.R script)
sigma = [[ 16 -2 -1 -3]
[ -2 9 -4 -1]
[ -1 -4 4 1]
[ -3 -1 1 1]];
// scenarios (generated by t-student.R script)
sellProfit = [[10.7349277395552 7.72178696852481 6.91313555665251 5.3580692014906]
[11.4029325398093 5.35289018472828 8.44560627918346 5.94437008867837]
[5.9511305436333 9.89072813219028 8.15019579921374 5.92283032635847]
[6.98653442934503 9.43820696539249 6.08947859890014 6.28684001183198]
[8.97632928181137 7.73492022936159 7.69443003815675 6.65911599366542]
[6.3718935550723 8.80949463923562 7.79090422832384 6.81174804312265]
[8.78246371277526 9.96223625339419 5.07839427301482 6.04541265888823]
[8.61200211939238 6.9004774184148 8.38569802461679 6.01047636955988]
[8.04259291408092 11.6005401405856 5.51825529023523 5.52418355625024]
[10.2568641176451 9.42484863719592 5.61768337124079 5.44832826311492]
[6.06345343273768 6.67810135189213 8.25425855603235 7.11046580533962]
[8.74262951486885 8.49193741618487 8.26781448661321 5.63718569432722]
[8.96019482191789 7.48206038212727 8.64020735666332 6.61806454609454]
[10.7060656286305 7.74073441264031 8.70806653294011 5.56273592101066]
[9.14849596786536 5.38206186993592 8.48324089408178 6.31836607658665]
[10.9884988766065 5.05294389126629 7.81201862380442 5.89377116896792]
[9.85025400030063 9.20603928762331 6.76845266520436 5.77678827669309]
[9.76699335636152 7.83363407758539 5.01347383618885 5.84594312150737]
[8.22098260831502 7.93964476990494 8.36747212617667 6.58666346744554]
[9.64940023484707 7.34646951028725 8.15389801271092 6.71485257935324]
[9.56697193644308 7.24791547600423 5.82061898605385 6.6329880618574]
[7.64858383380397 11.8956850930214 6.57566578417732 7.52978318768004]
[10.8667504186116 5.6239431792075 6.49095275149094 5.44747350145729]
[11.5459204391574 6.5874000517338 8.91791399632966 5.70569902009294]
[9.00453124705504 6.25952067886102 8.93937357845343 6.11437998871486]
[10.4316051568988 8.89165309349428 8.00183466339121 6.22792967489147]
[11.1403947310683 8.80153331584519 6.36710780356291 5.52424084189948]
[9.5907049066395 9.30053224873728 6.5052199777433 5.64308372528693]
[6.47305423724122 7.66508680006143 7.42589600717661 6.52108273658984]
[9.76726531281191 8.22194904261638 7.1081746124431 6.13833241033153]
];

View File

@ -0,0 +1,248 @@
/*********************************************
* OPL 12.5.1.0 Model
* Author: mateu
* Creation Date: May 24, 2017 at 10:08:31 PM
*********************************************/
/***********PARAMETRY************************/
//Paramatry zostaladniej opisane w pliku .dat oraz raporcie
// Parametry liczbowe
int nMachType = ...;
int nMonth = ...;
int nProdType = ...;
int nHours = ...;
int nScenarios = ...;
// Utworzenie wektorow indeksujacych
{int} machines = asSet(1..nMachType);
{int} months = asSet(1..nMonth);
{int} products = asSet(1..nProdType);
{int} scenarios = asSet(1..nScenarios);
//Parametry produkcji i sprzedazy
int machineCount[machines] = ...;
float prodTime[machines][products] = ...;
int maxInMonth[months][products] = ...;
//Parametry magazynowania
int storageMax[products] = ...;
int storageCost = ...;
int storageStart[products] = ...;
//Parametry do generowania scenariusze (nieuzywane w modelu CPLEX)
int mu[products] = ...;
int sigma[products][products] = ...;
//Macierz scenariuszy dochodow ze sprzedazy: typ produkty (kolumna) - scenariusz (wiersz)
float sellProfit[scenarios][products] = ...;
/******************* PARAMTERY METODY: WYMAGANY POZIOM ZYSKU ***********/
float minAvgProfit = ...; //wymagany poziom zysku
/*********** ZMIENNE DECYZYJNE ********************************************/
dvar int produce[months][products]; // Liczba wyprodukowanych
dvar int sell[months][products]; // Liczba sprzedanych
dvar int stock[months][products]; // Liczba w magazynie
// Czas wykorzystany na danym typie maszyna na dany typ produktu
dvar float workTime[months][machines][products];
// Zmienna binarna - czy sprzedaz danego typu produktu przekaroczyla 80 procent pojemnosci rynku
dvar boolean if80prec[months][products];
// Zmienna - ile pieniedzy nalezy odjac od dochodow z poszczegolnych produkow
// w poszczegolnych miesiacach ze wzgledu na przekroczenie 80% pojmnosci rynku
dvar float lowerProfit[scenarios][months][products];
/************ KRYTERIA OCENY *********************************************/
// ZYSK policzony dla poszczegolnych scenariuszy
dexpr float profit[i in scenarios] = sum(m in months, p in products)
(sell[m][p]*sellProfit[i][p]-lowerProfit[i][m][p]- stock[m][p]*storageCost);
// wartosc oczekiwana zysku policzona jako srednia
dexpr float avgProfit = sum(i in scenarios)(profit[i])/nScenarios;
// DODATKOWE OBLICZNIE RYZYKA DLA KAZDEGO SCENARIUSZA - POTRZEBNE DO ANALIZY FSD
dexpr float risk[i in scenarios] = sum (t in scenarios) (
0.5 * abs(profit[i] - profit[t]) * 1/nScenarios
);
// RYZYKO zdefiniowane srednia roznica Giniego
dexpr float giniRisk = sum (t1 in scenarios, t2 in scenarios ) (
0.5 * abs(profit[t1] - profit[t2]) * 1/nScenarios * 1/nScenarios
);
// funkcja celu
minimize giniRisk;
//maximize avgProfit;
// ************** OGRANICZENIA ******************************************/
subject to {
// Zmienne decyzyjne nie mniejsze niz zero
forall(i in scenarios, m in months, mc in machines, p in products) {
workTime[m][mc][p] >= 0;
produce[m][p] >= 0;
sell[m][p] >= 0;
stock[m][p] >= 0;
lowerProfit[i][m][p] >= 0;
}
// Ogranicznie czasu produkcji maszyn w miesiacu
forall(m in months, mc in machines) {
sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*nHours);
}
// Ograniczenie definiujace wykorzystany czas pracy maszyn
forall(m in months, p in products, mc in machines) {
workTime[m][mc][p] == produce[m][p]*prodTime[mc][p];
}
// Ogranicznie maksymalnej pojemnosci rynku
forall(m in months, p in products) {
sell[m][p] <= maxInMonth[m][p];
}
// Ogranicznie ustawiajace zmienna binarna po przekroczeniu 80 procent pojemnosci rynku
forall(m in months, p in products) {
sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p];
sell[m][p] >= 0.8*maxInMonth[m][p] * if80prec[m][p];
}
// Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu
forall (i in scenarios,m in months, p in products) {
lowerProfit[i][m][p] <= 1000000 * if80prec[m][p];
lowerProfit[i][m][p] <= 0.2 * sell[m][p]*sellProfit[i][p];
0.2 * sell[m][p]*sellProfit[i][p] - lowerProfit[i][m][p] + 1000000 * if80prec[m][p] <= 1000000;
}
// Ograniczenie sprzedazy oraz definicja ilosci towaru pozostajacej w magazynie
forall(m in months, p in products) {
if(m == 1) { //pierwszy miesiac
sell[m][p] <= produce[m][p]+storageStart[p];
stock[m][p]==(produce[m][p] + storageStart[p])-sell[m][p];
}else { // kolejne miesiace
sell[m][p] <= produce[m][p] + stock[m-1][p];
stock[m][p]==(produce[m][p] + stock[m-1][p])-sell[m][p];
}
}
// Ogranicznie maksymalnej ilosci magazynowanych produktow oraz
// wymaganej ilosc pozostalej w magazynie na na koniec symulacji
forall(m in months, p in products) {
stock[m][p] <= storageMax[p];
if(m == 3) {
stock[m][p] >= 50;
}
}
/******************OGRANICZENIE: WYMAGANY POZIOM ZYSKU ****************************/
avgProfit>=minAvgProfit;
}// Koniec ogranicznen
main {
//var fileProfit = new IloOplOutputFile("results-minAvgProfit-FSD-profit.txt");
//var fileRisk = new IloOplOutputFile("results-minAvgProfit-FSD-risk.txt");
var fileProfit = new IloOplOutputFile("results-minAvgProfit-FSD-profit(2).txt");
var fileRisk = new IloOplOutputFile("results-minAvgProfit-FSD-risk(2).txt");
var mod = thisOplModel;
var def = mod.modelDefinition;
var data = mod.dataElements;
var maxAvgProfit = 26553;
var i = 1;
/**************** Pierwsze wybrane rozwiazanie ************************************/
fileProfit.writeln("minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4");
fileRisk.writeln("minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4");
//data.minAvgProfit = 25488.3;
data.minAvgProfit = 10580.7;
mod = new IloOplModel (def, cplex);
mod.addDataSource(data);
mod.generate();
writeln("Pierwsze wybrane rozwiazanie: ");
cplex.solve();
writeln(i," minAvgProfit: ",data.minAvgProfit," avgProfit: ",mod.avgProfit,", giniRisk: ",mod.giniRisk);
fileProfit.writeln(data.minAvgProfit,";",mod.avgProfit,";",mod.giniRisk,";",mod.produce[1][1],";",mod.produce[1][2],";",mod.produce[1][3],";",mod.produce[1][4], ";",mod.produce[2][1],";",mod.produce[2][2],";",mod.produce[2][3],";",mod.produce[2][4],";",mod.produce[3][1],";",mod.produce[3][2], ";",mod.produce[3][3],";",mod.produce[3][4],";",mod.stock[1][1],";",mod.stock[1][2],";",mod.stock[1][3],";",mod.stock[1][4], ";",mod.stock[2][1],";",mod.stock[2][2],";",mod.stock[2][3],";",mod.stock[2][4],";",mod.stock[3][1],";",mod.stock[3][2], ";",mod.stock[3][3],";",mod.stock[3][4]);
fileRisk.writeln(data.minAvgProfit,";",mod.avgProfit,";",mod.giniRisk,";",mod.produce[1][1],";",mod.produce[1][2],";",mod.produce[1][3],";",mod.produce[1][4], ";",mod.produce[2][1],";",mod.produce[2][2],";",mod.produce[2][3],";",mod.produce[2][4],";",mod.produce[3][1],";",mod.produce[3][2], ";",mod.produce[3][3],";",mod.produce[3][4],";",mod.stock[1][1],";",mod.stock[1][2],";",mod.stock[1][3],";",mod.stock[1][4], ";",mod.stock[2][1],";",mod.stock[2][2],";",mod.stock[2][3],";",mod.stock[2][4],";",mod.stock[3][1],";",mod.stock[3][2], ";",mod.stock[3][3],";",mod.stock[3][4]);
i = 1;
fileProfit.writeln("avgProfit: ");
while (i<=data.nScenarios) {
fileProfit.writeln(mod.profit[i]);
i++;
};
i = 1;
fileRisk.writeln("Risk: ");
while (i<=data.nScenarios) {
fileRisk.writeln(mod.risk[i]);
i++;
};
/**************** Drugie wybrane rozwiazanie ************************************/
fileProfit.writeln("minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4");
fileRisk.writeln("minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4");
//data.minAvgProfit = 26020.6;
data.minAvgProfit = 20164;
mod = new IloOplModel (def, cplex);
mod.addDataSource(data);
mod.generate();
writeln("Drugie wybrane rozwiazanie: ");
cplex.solve();
writeln(i," minAvgProfit: ",data.minAvgProfit," avgProfit: ",mod.avgProfit,", giniRisk: ",mod.giniRisk);
fileProfit.writeln(data.minAvgProfit,";",mod.avgProfit,";",mod.giniRisk,";",mod.produce[1][1],";",mod.produce[1][2],";",mod.produce[1][3],";",mod.produce[1][4], ";",mod.produce[2][1],";",mod.produce[2][2],";",mod.produce[2][3],";",mod.produce[2][4],";",mod.produce[3][1],";",mod.produce[3][2], ";",mod.produce[3][3],";",mod.produce[3][4],";",mod.stock[1][1],";",mod.stock[1][2],";",mod.stock[1][3],";",mod.stock[1][4], ";",mod.stock[2][1],";",mod.stock[2][2],";",mod.stock[2][3],";",mod.stock[2][4],";",mod.stock[3][1],";",mod.stock[3][2], ";",mod.stock[3][3],";",mod.stock[3][4]);
fileRisk.writeln(data.minAvgProfit,";",mod.avgProfit,";",mod.giniRisk,";",mod.produce[1][1],";",mod.produce[1][2],";",mod.produce[1][3],";",mod.produce[1][4], ";",mod.produce[2][1],";",mod.produce[2][2],";",mod.produce[2][3],";",mod.produce[2][4],";",mod.produce[3][1],";",mod.produce[3][2], ";",mod.produce[3][3],";",mod.produce[3][4],";",mod.stock[1][1],";",mod.stock[1][2],";",mod.stock[1][3],";",mod.stock[1][4], ";",mod.stock[2][1],";",mod.stock[2][2],";",mod.stock[2][3],";",mod.stock[2][4],";",mod.stock[3][1],";",mod.stock[3][2], ";",mod.stock[3][3],";",mod.stock[3][4]);
i = 1;
fileProfit.writeln("avgProfit: ");
while (i<=data.nScenarios) {
fileProfit.writeln(mod.profit[i]);
i++;
};
i = 1;
fileRisk.writeln("Risk: ");
while (i<=data.nScenarios) {
fileRisk.writeln(mod.risk[i]);
i++;
};
/**************** Trzecie wybrane rozwiazanie ************************************/
fileProfit.writeln("minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4");
fileRisk.writeln("minAvgProfit;avgProfit;giniRisk;m1_prod_P1;m1_prod_P2;m1_prod_P3;m1_prod_P4;m2_prod_P1;m2_prod_P2;m2_prod_P3;m2_prod_P4;m3_prod_P1;m3_prod_P2;m3_prod_P3;m3_prod_P4;m1_stock_P1;m1_stock_P2;m1_stock_P3;m1_stock_P4;m2_stock_P1;m2_stock_P2;m2_stock_P3;m2_stock_P4;m3_stock_P1;m3_stock_P2;m3_stock_P3;m3_stock_P4");
//data.minAvgProfit = 26553.9;
data.minAvgProfit = 26553.9;
mod = new IloOplModel (def, cplex);
mod.addDataSource(data);
mod.generate();
writeln("Trzecie wybrane rozwiazanie: ");
cplex.solve();
writeln(i," minAvgProfit: ",data.minAvgProfit," avgProfit: ",mod.avgProfit,", giniRisk: ",mod.giniRisk);
fileProfit.writeln(data.minAvgProfit,";",mod.avgProfit,";",mod.giniRisk,";",mod.produce[1][1],";",mod.produce[1][2],";",mod.produce[1][3],";",mod.produce[1][4], ";",mod.produce[2][1],";",mod.produce[2][2],";",mod.produce[2][3],";",mod.produce[2][4],";",mod.produce[3][1],";",mod.produce[3][2], ";",mod.produce[3][3],";",mod.produce[3][4],";",mod.stock[1][1],";",mod.stock[1][2],";",mod.stock[1][3],";",mod.stock[1][4], ";",mod.stock[2][1],";",mod.stock[2][2],";",mod.stock[2][3],";",mod.stock[2][4],";",mod.stock[3][1],";",mod.stock[3][2], ";",mod.stock[3][3],";",mod.stock[3][4]);
fileRisk.writeln(data.minAvgProfit,";",mod.avgProfit,";",mod.giniRisk,";",mod.produce[1][1],";",mod.produce[1][2],";",mod.produce[1][3],";",mod.produce[1][4], ";",mod.produce[2][1],";",mod.produce[2][2],";",mod.produce[2][3],";",mod.produce[2][4],";",mod.produce[3][1],";",mod.produce[3][2], ";",mod.produce[3][3],";",mod.produce[3][4],";",mod.stock[1][1],";",mod.stock[1][2],";",mod.stock[1][3],";",mod.stock[1][4], ";",mod.stock[2][1],";",mod.stock[2][2],";",mod.stock[2][3],";",mod.stock[2][4],";",mod.stock[3][1],";",mod.stock[3][2], ";",mod.stock[3][3],";",mod.stock[3][4]);
i = 1;
fileProfit.writeln("avgProfit: ");
while (i<=data.nScenarios) {
fileProfit.writeln(mod.profit[i]);
i++;
};
i = 1;
fileRisk.writeln("Risk: ");
while (i<=data.nScenarios) {
fileRisk.writeln(mod.risk[i]);
i++;
};
fileProfit.close();
fileRisk.close();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -0,0 +1,467 @@
\documentclass[11pt,a4paper]{article}
\usepackage[OT4]{polski}
\usepackage[utf8]{inputenc}
\usepackage[inner=2.5cm,outer=2.5cm, tmargin=2.5cm,bmargin=2.5cm]{geometry}
\usepackage{amsmath}
\usepackage{relsize,amsfonts}
\usepackage{enumitem}
\usepackage{graphicx}
\newcommand\bigexists{%
\mathop{\lower0.75ex\hbox{\ensuremath{%
\mathlarger{\mathlarger{\mathlarger{\mathlarger{\exists}}}}}}}%
\limits}
\newcommand\bigforall{%
\mathop{\lower0.75ex\hbox{\ensuremath{%
\mathlarger{\mathlarger{\mathlarger{\mathlarger{\forall}}}}}}}%
\limits}
\title{Wspomaganie Decyzji w Warunkach Ryzyka\\\large \medskip Projekt: WDWR 25406\\}
\author{Krzysztof Rudnicki 307585}
\date{\today}
\begin{document}
\maketitle
\section*{Treść zadania}
\addcontentsline{toc}{section}{Treść zadania}
Rozważmy następujące zagadnienie planowania produkcji:
\begin{itemize}
\item 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:\\
\begin{center}
\begin{tabular}{l*{4}{c}}
\hline
& P1 & P2 & P3 & P4 \\
\hline
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 & - \\
\hline
\end{tabular}
\end{center}
\item Dochody ze sprzedaży produktów (w zł/sztukę) określają składowe wektora $\mathbf{R} = (R_{1},...,R_{4})^{T}$. Wektor $\mathbf{R}$ opisuje 4-wymiarowy rozkład \textit{t}-Studenta z 4 stopniami swobody, którego wartości składowych zostały zawężone do przedziału $[5;12]$. Wektor wartości oczekiwanych $\mu$ oraz macierz kowariancji $\Sigma$ niezawężonego rozkładu \textit{t}-Studenta są następujące:
\begin{displaymath}
\mathbf{\mu} =
\begin{pmatrix}
9 \\ 8 \\ 7 \\ 6 \\
\end{pmatrix},
\mathbf{\Sigma} =
\begin{pmatrix}
16 & -2 & -1 & -3 \\
-2 & 9 & -4 & -1 \\
-1 & -4 & 4 & 1 \\
-3 & -1 & 1 & 1 \\
\end{pmatrix}
\end{displaymath}
\item Istnieją ograniczenia rynkowe na liczbę sprzedawanych produktów w danym miesiącu:
\begin{center}
\begin{tabular}{l*{4}{c}}
\hline
& P1 & P2 & P3 & P4 \\
\hline
Styczeń & 200 & 0 & 100 & 200 \\
Luty & 300 & 100 & 200 & 200 \\
Marzec & 0 & 300 & 100 & 200 \\
\hline
\end{tabular}
\end{center}
\item Jeżeli sprzedaż danego produktu przekracza 80 procent ilości jaką może wchłonąć rynek, jego dochód spada o 20 procent.
\item Istnieje możliwość składowania do 200 sztuk każdego produktu w danym czasie w cenie 1 zł/sztukę za miesiąc. W chwili obecnej (grudzień) w magazynach znajduje się 0 sztuk każdego produkt. Istnieje wymaganie, aby tyle pozostało również pod koniec marca.
\item 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.
\end{itemize}
\section*{Polecenia}
\addcontentsline{toc}{section}{Polecenia}
\begin{enumerate}
\item Zaproponować jednokryterialny model wyboru w warunkach ryzyka z wartością oczekiwaną jako miarą zysku. Wyznaczyć rozwiązanie optymalne.
\item Jako rozszerzenie powyższego zaproponować dwukryterialny model zysku i ryzyka ze średnią jako miarą zysku i średnią różnicą Giniego jako miarą ryzyka. Dla decyzji $\mathbf{x}\in Q$ średnia różnica Giniego jest definiowana jako $\Gamma(\mathbf{x})=\frac{1}{2}\sum_{t'=1}^{T}\sum_{t"=1}^{T}\lvert r_{t'}(\mathbf{x})-r_{t"}(\mathbf{x})\rvert p_{t'}p_{t"}$, gdzie $r_{t'}(\mathbf{x})$ oznacza realizację dla scenariusza t, $p_{t}$ prawdopodobieństwo scenariusza t.
\begin{enumerate}
\item Wyznaczyć obraz zbioru rozwiązań efektywnych w przestrzeni zysk-ryzyko.
\item Wskazać rozwiązania efektywne minimalnego ryzyka i maksymalnego zysku. Jakie odpowiadają im wartości w przestrzeni ryzyko-zysk?
\item 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.
\end{enumerate}
\end{enumerate}
\section{Jednokryterialny model wyboru}
Jednokryterialny model wyboru w warunkach ryzyka ma umożliwić wybór rozwiązania optymalnego ze względu na maksymalizację wartości oczekiwanej zysku. Wartość oczekiwana ma być określana na podstawie scenariuszy wygenerowanych z rozkładu \textit{t}-Studenta o parametrach podanych w treści zadania. Przyjęto, że wszystkie scenariusze mają takie same prawdopodobieństwo.
\subsection{Parametry modelu}
W tabeli \ref{tab:param} zestawiono wszystkie przyjęte parametry modelu razem z opisami. Takie samo nazwy przyjęto podczas implementacji modelu. W przypadku wektorów oraz macierzy parametrów w nawiasach kwadratowych podano ich rozmiar odwołując się do parametrów liczbowych.
\begin{table}[ht!]
\caption{Tabela zawierająca parametry modelu jednokryterialnego}
\label{tab:param}
\begin{tabular}{lp{9cm}}
\hline
Nazwa parametru & Opis \\
\hline
nMachType & Ilość typów maszyn (procesów) dostępnych w fabryce \\
nMonth & Ilość miesięcy uwzględnionych w symulacji \\
nProdType & Ilość typów produktów \\
nScenarios & Ilość scenariuszy wygenerowanych do symulacji \\
machines[nMachType] & Wektor typów maszyn (procesów)\\
months[nMonth] & Wektor miesięcy symulacji\\
products[nProdType] & Wektor typów produktów\\
machineCount[nMachType] & Wektor ilości maszyn danego typu\\
prodTime[nMachType][nProdType] & macierz czasów produkcji danego produktu na danej maszynie \\
maxInMonth[nMonth][nProdType] & macierz maksymalnej ilości produktów, jakie można sprzedać w danym miesiącu\\
nHours & Ilość godzin pracy fabryki w miesiącu\\
mu[nProdType] & Wektor wartości oczekiwanych rozkładu t-Studenta do generacji scenariuszy\\
sigma [nProdType][nProdType] & Macierz kowariancji dla rozkłady t-Studenta\\
sellProfit[nScenarios][nProdType] & Macierz wygenerowanych sceniariuszy dochodów ze sprzedaży produktów\\
storageCost & Koszt trzymania jednej sztuki produktu w magazynie przez miesiąc \\
storageMax[nProdType] & Wektor maksymalnej pojemności magazynu dla każdego typu produktu \\
storageStart[nProdType] & Wektor ilości początkowej produktów w magazynie \\
\hline
\end{tabular}
\end{table}
\subsection{Zmienne decyzyjne}
Zmienne decyzyjne są kontrolowanymi przez decydenta, kluczowymi dla problemu wartościami. Celem systemu jest dobranie przez solver takich wartości tych zmiennych, które pozwolą na osiągnięcie najlepszego rozwiązania zadania. W tabeli \ref{tab:var} przedstawiono zmienne decyzyjne wykorzystane w modelu wraz z opisami. Zastosowano konwencję nazw identyczną, jak w przypadku parametrów modelu.
\begin{table}[ht!]
\caption{Tabela zawierająca zmienne decyzyjne modelu}
\label{tab:var}
\begin{tabular}{lp{7.5cm}}
\hline
Nazwa zmiennej & Opis \\
\hline
produce[nMonth][nProdType] & Macierz zawierające ilości wytwarzanych sztuk danego typu produktu w danym miesiącu \\
sell[nMonth][nProdType] & Macierz zawierająca ilości sprzedawanych sztuk danego typu produktu w danym miesiącu \\
stock[nMonth][nProdType] & Macierz zawierająca ilości sztuk danego typu produktu znajdujących się w magazynie w danym miesiącu \\
workTime[nMonth][nMachType][nProdType] & Macierz zawierająca czas pracy każdej maszyny dla każdego typu produktu w kazdym miesiącu \\
if80prec[nMonth][nProdType] & Macierz zmiennych binarnych (1 jeśli sprzedaż danego produktu w danym miesiącu przekroczyła 80\% wartości maksymalnej, 0 - w przeciwnym wypadku)\\
lowerProfit[nScenarios][nMonth][nProdType] & Macierz przechowująca kwoty, jaką należy odjąć od zysków z poszczególnych typów produktów w poszczególnych miesiącach, ze względu na przekroczenie 80\% pojemności rynku. Zmienna niezbędna do wyeliminowania obecności zmiennej binarnej w funkcji oceny\\
\hline
\end{tabular}
\end{table}
\subsection{Ograniczenia}
Z punktu widzenia projektowania modelu, najważniejsze jest prawidłowe dobranie przedstawionych założeniach ograniczeń. Zidentyfikowano następujące ograniczenia modelu:
\begin{itemize}
\item Ograniczenie dolne wartości zmiennych decyzyjnych wartości nie mogą być mniejsze od zera:
\begin{equation}
\bigforall_{\substack{
m \in months \\
p \in products \\
mc \in machines}} workTime[m][mc][p] >=0
\end{equation}
\begin{equation}
\bigforall_{\substack{
m \in months \\
p \in products}} produce[m][p] >=0
\end{equation}
\begin{equation}
\bigforall_{\substack{
m \in months \\
p \in products}} sell[m][p] >=0
\end{equation}
\begin{equation}
\bigforall_{\substack{
m \in months \\
p \in products}} stock[m][p] >=0
\end{equation}
\begin{equation}
\bigforall_{\substack{
i \in scenarios \\
m \in months \\
p \in products}} lowerProfit[i][m][p] >=0
\end{equation}
\item Ograniczenie ilości jednocześnie pracujących maszyn - Ze względu na to, że każda pojedyncza maszyna może pracować w ciągu miesiąca \textit{nHours} godzin, to dla każdego typu maszyny, czas ich pracy nie może przekroczyć wartości iloczynu ilości maszyn danego typu oraz czasu \textit{nHours}.
\begin{equation}
\bigforall_{\substack{
m \in months\\
mc \in machines}} \sum_{p \in products}
(workTime[m][mc][p] <= machineCount[mc]*nHours)
\end{equation}
\item Ograniczenie definiujące czas pracy maszyn - czas pracy danego typu maszyny to iloczyn ilości wyprodukowanych sztuk danego produktu i czasu trwania danego procesu technologicznego dla jednej sztuki:
\begin{equation}
\bigforall_{\substack{
m \in months\\
mc \in machines\\
p \in products}} workTime[m][mc][p] == produce[m][p]*prodTime[mc][p]
\end{equation}
\item Ograniczenie rynkowe maksymalnej sprzedaży w danym miesiącu:
\begin{equation}
\bigforall_{\substack{
m \in months\\
p \in products}} sell[m][p] == maxInMonth[m][p]
\end{equation}
\item Ograniczenia ustawiające zmienną binarną po przekroczeniu 80 procent pojemności rynku:
\begin{equation}
\bigforall_{\substack{
m \in months\\
p \in products}} sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p]
\end{equation}
\begin{equation}
\bigforall_{\substack{
m \in months\\
p \in products}} sell[m][p] >= 0.8*maxInMonth[m][p] * if80prec[m][p]
\end{equation}
\item Ograniczenia linearyzujące wpływ zmiennej binarnej na funkcje celu:
\begin{equation}
\bigforall_{\substack{
i \in scenarios\\
m \in months\\
p \in products}} lowerProfit[i][m][p] <= 1000000 * if80prec[m][p]
\end{equation}
\begin{equation}
\bigforall_{\substack{
i \in scenarios\\
m \in months\\
p \in products}} lowerProfit[i][m][p] <= 0.2 * sell[m][p]*sellProfit[i][p]
\end{equation}
\begin{multline}
\bigforall_{\substack{
i \in scenarios\\
m \in months\\
p \in products}} 0.2 * sell[m][p]*sellProfit[i][p] - lowerProfit[i][m][p] +\\ 1000000 * if80prec[m][p] <= 1000000;
\end{multline}
\item Ograniczenie sprzedaż do ilości sztuk wyprodukowanych oraz znajdujących się w magazynie. Dla pierwszego miesiąca ma ono postać:
\begin{equation}
\bigforall_{\substack{
m \in months\\
p \in products}} sell[m][p] <= produce[m][p]+storageStart[p]
\end{equation}
Dla każdego następnego miesiąca:
\begin{equation}
\bigforall_{\substack{
m \in months\\
p \in products}} sell[m][p] <= produce[m][p] + stock[m-1][p]
\end{equation}
\item Ograniczenie definiujące ilość produktów pozostających w magazynach na następny miesiąc, jako sumę sztuk wyprodukowanych i będących w magazynie na początku tego miesiąca pomniejszoną o ilość sprzedaną w tym miesiącu. Dla pierwszego miesiąca:
\begin{equation}
\bigforall_{\substack{
m \in months\\
p \in products}} stock[m][p]==(produce[m][p] + storageStart[p])-sell[m][p]
\end{equation}
Dla każdego następnego miesiąca:
\begin{equation}
\bigforall_{\substack{
m \in months\\
p \in products}} stock[m][p]==(produce[m][p] + stock[m-1][p])-sell[m][p]
\end{equation}
\end{itemize}
\subsection{Funkcja celu}
Funkcja celu dla modelu jednokryterialnego to maksymalizacja wartości oczekiwanej zysku dla wszystkich scenariuszy. Dla każdego scenariusza została przyjęta funkcja zysku w postaci
\begin{multline}
\bigforall_{\substack{
i<nScernarios\\
i \in N}}
profit[i] =\sum_{m \in months} \sum_{p \in products}
(sell[m][p]\cdot sellProfit[i][p] \\ -lowerProfit[i][m][p]-stock[m][p]*storageCost)
\end{multline}
\subsection{Implementacja modelu}
\subsubsection{Generacja scenariusz dochodów ze sprzedaży}
Dochody ze sprzedaży poszczególnych produktów są określone wektorem losowym określonym w treści zadania. Do wygenerowania wektorów opisujących konkretne scenariusze sprzedaży wykorzystano pakiet MASS dla języka R. Skrypt drukujący wektory do pliku został napisany w środowisku R Studio IDE. Załącznik 1 to wspomniany skrypt - \textit{t-student.R}. Do potrzeby symulacji wygenerowano 1000 scenariuszy.
\subsubsection{Model}
Rozwiązanie zadania zaimplementowano w całości przy pomocy programu IBM ILOG CPLEX Optimization Studio przy wykorzystaniu solvera CPLEX. Nazwy parametrów oraz zmiennych decyzyjnych pokrywają się z nazwami opisanymi w tabelach \ref{tab:param} i \ref{tab:var}. Załącznik 2 to plik \textit{wdwr17421-1.dat}, który definiuje parametry modelu. Załącznik 3 to plik \textit{wdwr17421-1.mod}, który wczytuje parametry modelu, definiuje zmienne decyzyjne, funkcję oceny oraz ograniczenia modelu. Dla przyśpieszenia implementacji modelu przyjęto, że kolejne miesiące, produkty oraz procesy technologiczne będą opisane liczbami naturalnymi. Miesiące ponumerowane są w kolejności występowania, produkty według indeksu przy literze P w nazwie, a procesy technologiczne w następujące kolejności:
\begin{enumerate}
\item Szlifowanie,
\item Wiercenie pionowe,
\item Wiercenie poziome,
\item Frezowanie,
\item Toczenie.
\end{enumerate}
\subsection{Rozwiązanie}
Optymalne rozwiązanie maksymalizacji wartości oczekiwanej zysku zostało obliczone przez solver CPLEX. Optymalny zysk wyniósł około 26023,63 zł. Wynik taki jest osiągany dla następujących wartości zmiennych decyzyjnych:
\begin{displaymath}
\mathbf{sell} =
\begin{pmatrix}
320 & 0 & 160 & 240 \\
700 & 320 & 500 & 0 \\
0 & 800 & 600 & 320 \\
\end{pmatrix},
\mathbf{if80prec} =
\begin{pmatrix}
0 & 1 & 0 & 0 \\
1 & 0 & 1 & 1 \\
1 & 1 & 1 & 0 \\
\end{pmatrix},
\end{displaymath}
\begin{displaymath}
\mathbf{stock} =
\begin{pmatrix}
0 & 50 & 0 & 0 \\
0 & 0 & 0 & 0 \\
50 & 50 & 50 & 50 \\
\end{pmatrix},
\mathbf{produce} =
\begin{pmatrix}
270 & 0 & 110 & 190 \\
700 & 270 & 500 & 0 \\
50 & 850 & 650 & 370 \\
\end{pmatrix}
\end{displaymath}
Macierze z czasami pracy maszyn dla poszczególnych typów produktów zostały przedstawione oddzielnie dla każdego miesiąca:
\begin{displaymath}
\mathbf{workTime[1]} =
\begin{pmatrix}
108 & 0 & 0 & 0 \\
54 & 0 & 0 & 114 \\
27 & 0 & 77 & 0 \\
16.2 & 0 & 0 & 9.5 \\
0 & 0 & 2.2 & 0 \\
\end{pmatrix},
\mathbf{workTime[2]} =
\begin{pmatrix}
280 & 162 & 0 & 0 \\
140 & 27 & 0 & 0 \\
70 & 0 & 350 & 0 \\
42 & 10.8 & 0 & 0 \\
0 & 13.5 & 10 & 0 \\
\end{pmatrix},
\end{displaymath}
\begin{displaymath}
\mathbf{workTime[3]} =
\begin{pmatrix}
20 & 510 & 0 & 0 \\
10 & 85 & 0 & 222 \\
5 & 0 & 455 & 0 \\
3 & 34 & 0 & 18.5 \\
0 & 42.5 & 13 & 0 \\
\end{pmatrix}
\end{displaymath}
Macierzy lowerProfit nie przedstawiono w raporcie ze względu na jej wielkość. Pełne wyniki działania solvera dołączono do raportu jako załącznik 4.
\subsection{Wnioski}
Z przeprowadzonej sytuacji wynika, że możliwości produkcyjne fabryki przekraczają pojemność rynku. W celu maksymalizacji w niektórych miesiącach opłaca się sprzedawać poszczególne produkty, nawet po przekroczeniu 80\% pojemności rynku. Nie ma potrzeby magazynowania produktów, poza wymaganym minimum.
\section{Model dwukryterialny zysku i ryzyka}
\subsection{Model zadania}
Model przedsiębiorstwa pozostał w całości taki, jak w pierwszej części zadania. Miarą zysku jest wartość oczekiwana, czyli w przypadku równie prawdopodobnych scenariuszy - średnia. Miarą ryzyka w danym zadaniu jest średnia różnica Giniego wyrażająca się wzorem:
\begin{equation}
\Gamma(\mathbf{x})=\frac{1}{2}\sum_{t'=1}^{T}\sum_{t"=1}^{T}\lvert r_{t'}(\mathbf{x})-r_{t"}(\mathbf{x})\rvert p_{t'}p_{t"},
\end{equation}
gdzie $r_{t'}(\mathbf{x})$ oznacza realizację dla scenariusza t, a $p_{t}$ - prawdopodobieństwo scenariusza t.
Zgodnie z przyjętymi w projekcie oznaczeniami wyrażenie określające miarę ryzyka będzie wyglądało następująco:
\begin{equation}
giniRisk = \frac{1}{2}\cdot\sum_{t1 \in scenarios}\sum_{t2 \in scenarios} \lvert profit[t1]-profit[t2] \rvert \cdot \frac{1}{nScenarios} \cdot \frac{1}{nScenarios}
\end{equation}
\subsection{Model preferencji}
Model preferencji został zbudowany na podstawie wymaganego poziomu średniej przy minimalizacji ryzyka.
\begin{equation}
avgProfit<minAvgProfit
\end{equation}
\begin{equation}
minimize giniRisk
\end{equation}
minAvgProfit jest dodatkowym parametrem modelu. Załączniki 5 i 6 to pliki z paramtrami i modelem zadania dwukryterialnego wyboru - pliki źródłowe dla solvera CPLEX.
\subsection{Zbiór rozwiązań efektywnych w przestrzeni ryzyko-zysk}
Rysunek \ref{fig:profit-risk} przedstawia rozwiązania efektywne modelu w przestrzeni ryzyko-zysk. Niebieskie trójkąty przedstawiają rozwiązanie efektywne dla różnych wartości wymaganego poziomu zysku. Ze względu na możliwości obliczeniowe komputera rozwiązania 52 równo odległe rozwiązania, każe biorące pod uwagę 30 scenariuszy. Wprowadzono ograniczenie czasu solvera poświęconego jednemu rozwiązania do 5 min. Obliczenia zajęły ponad 3 godziny. Załączniki 7 i 8 to pliki parametrów oraz modelu wraz ze skryptem dla solvera CPLEX, służące do uzyskania rozwiązań. Kolorem żółtym oznaczono rozwiązanie maksymalnego zysku oraz minimalnego ryzyka. Odpowiadające im wartości zawarte są w tabeli \ref{tab:min-max}.
\begin{figure}[ht!]
\centering
\includegraphics[width=0.8\textwidth]{graphics/results-minAvgProfit-marker}
\caption{Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk}
\label{fig:profit-risk}
\end{figure}
\subsection{Rozwiązania efektywne minimalnego ryzyka i maksymalnego zysku}
Na wykresie \ref{fig:profit-risk} kolorem żółtym oznaczono rozwiązania maksymalnego zysku oraz minimalnego ryzyka. Odpowiadające im wartości w przestrzeni ryzyko zysk zawarte są w tabeli \ref{tab:min-max}.
\begin{table}[ht!]
\label{tab:min-max}
\caption{Rozwiązania maksymalnego zysku i minimalnego ryzyka}
\centering
\begin{tabular}{l*{4}{c}}
\hline
& Miara zysku & Miara ryzyka \\
\hline
Maksymalizacja zysku & 26553.9 zł & 796.113 zł \\
Minimalizacja ryzyka & -600.00 zł & 0.0 zł \\
\hline
\end{tabular}
\end{table}
Rozwiązanie zadania jednokryterialnego maksymalizacji zysku wiąże się maksymalizacją ryzyka, natomiast zadanie minimalizacji ryzyka, bez ograniczeń na miarę zysku powoduje stratę (zysk ujemny) spowodowaną brakiem sprzedaży oraz kosztami utrzymania minimalnego stanu magazynu.
\subsection{Sprawdzenie dominacji stochastycznej wybranych rozwiązań efektywnych}
W celu sprawdzenia dominacji stochastycznej pierwszego rzędu (FSD) wybrano 3 rozwiązania efektywne modelu. Zostały oznaczone literami A, B, C. Wartości średniego zysku oraz miary ryzyka odpowiadające tym rozwiązaniom zostały przedstawione w tabeli \ref{tab:abc}. Wybrano rozwiązanie, które były do siebie najbardziej zbliżone pod względem średniej zysku. Jej wartość różniła się o około 500 zł. Załączniki 9 i 10 to pliki parametrów oraz modelu wraz ze skryptem dla solvera CPLEX, służące do wygenerowania informacji o zysku i ryzyku dla poszczególnych scenariuszy.
\begin{table}[ht!]
\label{tab:abc}
\caption{Rozwiązania wybrane do analizy dominacji FSD}
\centering
\begin{tabular}{lccc}
\hline
& A & B & C \\
\hline
Ograniczenie minimalnego zysku & 25488.1 zł & 26020.5 zł & 26552.9 zł\\
Średni zysk & 25488.3 zł & 26020.6 zł & 26553.9 zł\\
Miara ryzyka & 755.133 zł & 774.872 zł & 796.113 zł\\
\hline
\end{tabular}
\end{table}
Aby sprawdzić dominację wzajemną dominację rozwiązań w sensie FSD narysowano odwrotne dystrybuanty dla obydwu kryteriów. Rysunek \ref{fig:FSD-profit} przedstawia wykres odwrotnej dystrybuanty rozkładu średniego zysku pomiędzy scenariuszami dla 3 wybranych rozwiązań efektywnych. Z wykresu można odczytać, że rozwiązanie C dominuje rozwiązania A i B w sensie FSD, tzn. że dla każdego scenariusza miara zysku w przypadku decyzji C jest większa niż w przypadku decyzji A i B. Rozwiązanie B dominuje w sensie FSD rozwiązanie A.
\begin{figure}[ht!]
\centering
\includegraphics[width=\textwidth]{graphics/results-FSD-profit}
\caption{Odwrotna dystrybuanta rozkładu średniego zysku między scenariuszami}
\label{fig:FSD-profit}
\end{figure}
Rysunek \ref{fig:FSD-risk} to wykres odwrotnej dystrybuanty rozkładu średniego różnicy Giniego jako miary ryzyka pomiędzy scenariuszami dla tych samych 3 rozwiązań efektywnych. Ze względu na miarę ryzyka rozwiązanie A dominuje rozwiązania B, C, natomiast rozwiązanie B nie dominuje "ściśle" rozwiązania C. Powodem jest przecinanie się dystrybuant w miejscu oznaczonym na żółto na wykresie na rysunku \ref{fig:FSD-profit}.
\begin{figure}[ht!]
\centering
\includegraphics[width=0.95\textwidth]{graphics/results-FSD-risk}
\caption{Odwrotna dystrybuanta rozkładu średniej różnicy Giniego między scenariuszami}
\label{fig:FSD-risk}
\end{figure}
\clearpage
%%% SPIS TABEL %%%
% \phantomsection
\addcontentsline{toc}{chapter}{\listtablename}
\listoftables
%%% SPIS ZAŁĄCZNIKÓW %%%
\addcontentsline{toc}{section}{Spis załączników}
\section*{Spis załączników}
\begin{enumerate}
\item t-Student.R - skrypt generujący wektory opisujące dochód ze sprzedaży produktów w poszczególnych scenariuszy,
\item wdwr17421-1.dat - plik definiujący parametry modelu jednokryterialnego,
\item wdwr17421-1.mod - plik implementujący model jednokryterialny,
\item wdwr17421-1.log - pełne wyniki działania solvera dla modelu jednokryterialnego,
\item wdwr17421-2.dat - plik definiujący parametry modelu dwukryterialnego,
\item wdwr17421-2.mod - plik implementujący model dwukryterialny,
\item wdwr17421-3.dat - plik definiujący parametry modelu dwukryterialnego,
\item wdwr17421-3.mod - plik implementujący model oraz skrypt do uzyskania obrazu rozwiązań w przestrzeni ryzyko-zysk,
\item wdwr17421-4.dat - plik definiujący parametry modelu,
\item wdwr17421-4.mod - plik implementujący model oraz skrypt do uzyskania danych do analizy dominacji FSD.
\end{enumerate}
\end{document}

View File

@ -1,8 +0,0 @@
sudo pacman -S r
yay r-tmvtnorm
Rscript WDWR.r
#Download AMPL
https://wutwaw-my.sharepoint.com/:f:/g/personal/adam_krzemienowski_pw_edu_pl/EopE83LtqlJFnzi8u2iDkwoBgISyjUVvCbcE4EVaUwEMqw
~/ampl/ampl_linux-intel64/ampl ./WDWR1.run
~/ampl/ampl_linux-intel64/ampl ./WDWR2.run
~/ampl/ampl_linux-intel64/ampl ./WDWR3.run

View File

@ -1,50 +0,0 @@
0.020000 11639.667141
0.040000 10292.082599
0.060000 11996.818322
0.080000 11801.202380
0.100000 11047.083018
0.120000 9941.182838
0.140000 12469.184647
0.160000 11749.639752
0.180000 12521.561887
0.200000 10799.437424
0.220000 12250.278054
0.240000 11998.961779
0.260000 12334.974633
0.280000 11748.822489
0.300000 11533.496636
0.320000 11650.567186
0.340000 10505.951816
0.360000 11906.078116
0.380000 10706.762250
0.400000 11469.313644
0.420000 12261.502189
0.440000 11949.591326
0.460000 11684.599720
0.480000 11254.293504
0.500000 11019.077043
0.520000 11660.321693
0.540000 10689.432294
0.560000 11619.454963
0.580000 11509.036663
0.600000 11235.252802
0.620000 10966.519996
0.640000 11355.652416
0.660000 10990.753206
0.680000 10646.294395
0.700000 10464.177226
0.720000 11666.180143
0.740000 11387.100619
0.760000 12471.939730
0.780000 11219.420397
0.800000 12297.869146
0.820000 12590.731969
0.840000 11961.876952
0.860000 11816.323123
0.880000 10514.812398
0.900000 12223.545025
0.920000 11483.289216
0.940000 13326.529017
0.960000 10801.660163
0.980000 12060.838985
1.000000 10142.319128
1 0.020000 11639.667141
2 0.040000 10292.082599
3 0.060000 11996.818322
4 0.080000 11801.202380
5 0.100000 11047.083018
6 0.120000 9941.182838
7 0.140000 12469.184647
8 0.160000 11749.639752
9 0.180000 12521.561887
10 0.200000 10799.437424
11 0.220000 12250.278054
12 0.240000 11998.961779
13 0.260000 12334.974633
14 0.280000 11748.822489
15 0.300000 11533.496636
16 0.320000 11650.567186
17 0.340000 10505.951816
18 0.360000 11906.078116
19 0.380000 10706.762250
20 0.400000 11469.313644
21 0.420000 12261.502189
22 0.440000 11949.591326
23 0.460000 11684.599720
24 0.480000 11254.293504
25 0.500000 11019.077043
26 0.520000 11660.321693
27 0.540000 10689.432294
28 0.560000 11619.454963
29 0.580000 11509.036663
30 0.600000 11235.252802
31 0.620000 10966.519996
32 0.640000 11355.652416
33 0.660000 10990.753206
34 0.680000 10646.294395
35 0.700000 10464.177226
36 0.720000 11666.180143
37 0.740000 11387.100619
38 0.760000 12471.939730
39 0.780000 11219.420397
40 0.800000 12297.869146
41 0.820000 12590.731969
42 0.840000 11961.876952
43 0.860000 11816.323123
44 0.880000 10514.812398
45 0.900000 12223.545025
46 0.920000 11483.289216
47 0.940000 13326.529017
48 0.960000 10801.660163
49 0.980000 12060.838985
50 1.000000 10142.319128

View File

@ -1,50 +0,0 @@
0.020000 8334.413457
0.040000 8815.328577
0.060000 8744.362234
0.080000 10054.734924
0.100000 8531.997783
0.120000 8436.145053
0.140000 9274.773903
0.160000 9048.940981
0.180000 9581.821780
0.200000 8268.608177
0.220000 9781.602957
0.240000 10010.709973
0.260000 9378.021217
0.280000 10110.988008
0.300000 8996.520470
0.320000 8371.333346
0.340000 8311.828619
0.360000 8286.748340
0.380000 9051.369471
0.400000 8977.096282
0.420000 9504.738633
0.440000 9024.825705
0.460000 8785.788983
0.480000 9103.663665
0.500000 9064.958116
0.520000 8759.874949
0.540000 8539.407399
0.560000 9251.416429
0.580000 8613.449292
0.600000 8902.125325
0.620000 8270.820433
0.640000 9178.385113
0.660000 8848.276351
0.680000 8450.073796
0.700000 8528.075255
0.720000 9271.358778
0.740000 8934.054436
0.760000 9916.588628
0.780000 9125.210257
0.800000 9075.712755
0.820000 9760.295161
0.840000 9812.044676
0.860000 8961.520425
0.880000 8673.882341
0.900000 9811.630231
0.920000 9256.374980
0.940000 9798.126373
0.960000 8835.051454
0.980000 9556.205053
1.000000 8267.170403
1 0.020000 8334.413457
2 0.040000 8815.328577
3 0.060000 8744.362234
4 0.080000 10054.734924
5 0.100000 8531.997783
6 0.120000 8436.145053
7 0.140000 9274.773903
8 0.160000 9048.940981
9 0.180000 9581.821780
10 0.200000 8268.608177
11 0.220000 9781.602957
12 0.240000 10010.709973
13 0.260000 9378.021217
14 0.280000 10110.988008
15 0.300000 8996.520470
16 0.320000 8371.333346
17 0.340000 8311.828619
18 0.360000 8286.748340
19 0.380000 9051.369471
20 0.400000 8977.096282
21 0.420000 9504.738633
22 0.440000 9024.825705
23 0.460000 8785.788983
24 0.480000 9103.663665
25 0.500000 9064.958116
26 0.520000 8759.874949
27 0.540000 8539.407399
28 0.560000 9251.416429
29 0.580000 8613.449292
30 0.600000 8902.125325
31 0.620000 8270.820433
32 0.640000 9178.385113
33 0.660000 8848.276351
34 0.680000 8450.073796
35 0.700000 8528.075255
36 0.720000 9271.358778
37 0.740000 8934.054436
38 0.760000 9916.588628
39 0.780000 9125.210257
40 0.800000 9075.712755
41 0.820000 9760.295161
42 0.840000 9812.044676
43 0.860000 8961.520425
44 0.880000 8673.882341
45 0.900000 9811.630231
46 0.920000 9256.374980
47 0.940000 9798.126373
48 0.960000 8835.051454
49 0.980000 9556.205053
50 1.000000 8267.170403

View File

@ -1,50 +0,0 @@
0.020000 8462.904351
0.040000 8887.361263
0.060000 8882.563026
0.080000 10141.687000
0.100000 8634.948985
0.120000 8513.615679
0.140000 9395.675683
0.160000 9153.185821
0.180000 9687.103924
0.200000 8380.711280
0.220000 9881.370022
0.240000 10109.134413
0.260000 9496.385439
0.280000 10188.525618
0.300000 9096.003124
0.320000 8496.469280
0.340000 8408.842845
0.360000 8430.629207
0.380000 9129.919779
0.400000 9066.482113
0.420000 9619.132880
0.440000 9149.991621
0.460000 8889.914639
0.480000 9195.736366
0.500000 9149.737910
0.520000 8875.122293
0.540000 8622.587577
0.560000 9352.908154
0.580000 8710.754238
0.600000 8994.969887
0.620000 8364.096545
0.640000 9275.711427
0.660000 8925.830861
0.680000 8544.573155
0.700000 8600.349704
0.720000 9357.569926
0.740000 9028.726132
0.760000 10014.377784
0.780000 9208.464306
0.800000 9188.211655
0.820000 9873.907368
0.840000 9897.483068
0.860000 9061.467124
0.880000 8761.564619
0.900000 9892.459756
0.920000 9362.638268
0.940000 9929.148231
0.960000 8926.168209
0.980000 9672.217945
1.000000 8362.733857
1 0.020000 8462.904351
2 0.040000 8887.361263
3 0.060000 8882.563026
4 0.080000 10141.687000
5 0.100000 8634.948985
6 0.120000 8513.615679
7 0.140000 9395.675683
8 0.160000 9153.185821
9 0.180000 9687.103924
10 0.200000 8380.711280
11 0.220000 9881.370022
12 0.240000 10109.134413
13 0.260000 9496.385439
14 0.280000 10188.525618
15 0.300000 9096.003124
16 0.320000 8496.469280
17 0.340000 8408.842845
18 0.360000 8430.629207
19 0.380000 9129.919779
20 0.400000 9066.482113
21 0.420000 9619.132880
22 0.440000 9149.991621
23 0.460000 8889.914639
24 0.480000 9195.736366
25 0.500000 9149.737910
26 0.520000 8875.122293
27 0.540000 8622.587577
28 0.560000 9352.908154
29 0.580000 8710.754238
30 0.600000 8994.969887
31 0.620000 8364.096545
32 0.640000 9275.711427
33 0.660000 8925.830861
34 0.680000 8544.573155
35 0.700000 8600.349704
36 0.720000 9357.569926
37 0.740000 9028.726132
38 0.760000 10014.377784
39 0.780000 9208.464306
40 0.800000 9188.211655
41 0.820000 9873.907368
42 0.840000 9897.483068
43 0.860000 9061.467124
44 0.880000 8761.564619
45 0.900000 9892.459756
46 0.920000 9362.638268
47 0.940000 9929.148231
48 0.960000 8926.168209
49 0.980000 9672.217945
50 1.000000 8362.733857

View File

@ -1,100 +0,0 @@
-200.000000 0.000000 0.000153
-200.000000 0.000000 0.000153
-200.000000 0.000000 0.000153
-200.000000 0.000000 0.000153
-200.000000 0.000000 0.000153
-200.000000 0.000000 0.000153
-200.000000 0.000000 0.000153
-200.000000 0.000000 0.000153
-200.000000 0.000000 0.000111
-200.000000 0.000000 0.000000
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000042
-200.000000 0.000000 0.000000
5388.280763 673.375180 0.000319
8453.165836 1004.361418 0.000532
7464.470364 888.082372 0.000462
6464.644347 771.022268 0.000393
5456.347323 654.460477 0.000323
4366.632009 549.520402 0.000248
3392.421231 434.063877 0.000179
2374.847064 318.378638 0.000109
1765.371563 240.818335 0.000026
425.448190 72.719700 -0.025835
5388.280763 673.375180 0.000208
9317.090153 1147.518267 0.000481
8301.136529 1036.409118 0.000410
7285.591657 919.291964 0.000340
6361.934765 790.460607 0.000275
5365.283387 669.990504 0.000206
4434.582882 540.004038 0.000142
3373.344061 434.703276 0.000068
2417.827519 311.250020 0.000001
1432.148909 188.510726 -0.066975
5388.280763 673.375180 0.000097
10000.288917 1307.292831 0.000417
9291.427014 1151.339411 0.000368
8439.813809 1007.101848 0.000309
7436.822686 890.327465 0.000239
6344.809413 790.851811 0.000163
5340.293203 671.880254 0.000094
4375.860271 553.674833 0.000026
3444.833709 420.543399 -0.038285
2443.218902 304.590798 -0.108208
9382.134535 1104.116837 0.000263
11040.319690 1435.989662 0.000379
10406.562382 1249.283436 0.000334
9157.108633 1182.543437 0.000247
8243.887310 1046.431089 0.000184
7252.262318 926.566187 0.000115
6114.343105 833.935936 0.000036
5458.235147 652.125451 -0.009439
4451.534428 536.334425 -0.079420
3445.121460 420.374152 -0.149341
9534.263193 1124.891344 0.000163
11623.893720 1629.772538 0.000308
11040.319690 1435.989662 0.000268
10234.420750 1282.152533 0.000212
8955.458871 1217.950976 0.000123
8125.266489 1067.542071 0.000065
7460.723990 888.894318 0.000018
6462.769540 767.700977 -0.050643
5458.235147 652.125451 -0.120556
4451.534428 536.334425 -0.190537
9371.663529 1104.493126 0.000040
11985.535635 1876.338189 0.000222
11623.893720 1629.772538 0.000197
11040.319690 1435.989662 0.000156
10406.562382 1249.283436 0.000112
9479.717395 1116.983538 0.000048
8475.742091 999.775354 -0.021837
7471.207698 883.988876 -0.091810
6462.769540 767.700977 -0.161760
5458.235147 652.125451 -0.231672
10658.420822 1308.556262 0.000019
11973.604069 1746.007712 0.000110
11973.604069 1746.007712 0.000110
11623.893720 1629.772538 0.000086
11040.319690 1435.989662 0.000045
10406.562382 1249.283436 0.000001
9479.717395 1116.983538 -0.063467
8475.742091 999.775354 -0.132953
7471.207698 883.988876 -0.202927
6462.481788 767.807980 -0.272896
11984.113511 1748.047892 -0.000201
11987.418989 2046.236151 0.000000
11987.418989 2046.236151 0.000000
11984.113511 1748.047892 -0.000201
11634.403161 1632.508345 -0.024509
11040.697227 1435.311557 -0.065778
10399.451279 1248.963735 -0.110354
9479.717395 1116.983538 -0.174583
8475.454340 999.671406 -0.244090
7471.207698 883.988876 -0.314044
1 -200.000000 0.000000 0.000153
2 -200.000000 0.000000 0.000153
3 -200.000000 0.000000 0.000153
4 -200.000000 0.000000 0.000153
5 -200.000000 0.000000 0.000153
6 -200.000000 0.000000 0.000153
7 -200.000000 0.000000 0.000153
8 -200.000000 0.000000 0.000153
9 -200.000000 0.000000 0.000111
10 -200.000000 0.000000 0.000000
11 -200.000000 0.000000 0.000042
12 -200.000000 0.000000 0.000042
13 -200.000000 0.000000 0.000042
14 -200.000000 0.000000 0.000042
15 -200.000000 0.000000 0.000042
16 -200.000000 0.000000 0.000042
17 -200.000000 0.000000 0.000042
18 -200.000000 0.000000 0.000042
19 -200.000000 0.000000 0.000042
20 -200.000000 0.000000 0.000000
21 5388.280763 673.375180 0.000319
22 8453.165836 1004.361418 0.000532
23 7464.470364 888.082372 0.000462
24 6464.644347 771.022268 0.000393
25 5456.347323 654.460477 0.000323
26 4366.632009 549.520402 0.000248
27 3392.421231 434.063877 0.000179
28 2374.847064 318.378638 0.000109
29 1765.371563 240.818335 0.000026
30 425.448190 72.719700 -0.025835
31 5388.280763 673.375180 0.000208
32 9317.090153 1147.518267 0.000481
33 8301.136529 1036.409118 0.000410
34 7285.591657 919.291964 0.000340
35 6361.934765 790.460607 0.000275
36 5365.283387 669.990504 0.000206
37 4434.582882 540.004038 0.000142
38 3373.344061 434.703276 0.000068
39 2417.827519 311.250020 0.000001
40 1432.148909 188.510726 -0.066975
41 5388.280763 673.375180 0.000097
42 10000.288917 1307.292831 0.000417
43 9291.427014 1151.339411 0.000368
44 8439.813809 1007.101848 0.000309
45 7436.822686 890.327465 0.000239
46 6344.809413 790.851811 0.000163
47 5340.293203 671.880254 0.000094
48 4375.860271 553.674833 0.000026
49 3444.833709 420.543399 -0.038285
50 2443.218902 304.590798 -0.108208
51 9382.134535 1104.116837 0.000263
52 11040.319690 1435.989662 0.000379
53 10406.562382 1249.283436 0.000334
54 9157.108633 1182.543437 0.000247
55 8243.887310 1046.431089 0.000184
56 7252.262318 926.566187 0.000115
57 6114.343105 833.935936 0.000036
58 5458.235147 652.125451 -0.009439
59 4451.534428 536.334425 -0.079420
60 3445.121460 420.374152 -0.149341
61 9534.263193 1124.891344 0.000163
62 11623.893720 1629.772538 0.000308
63 11040.319690 1435.989662 0.000268
64 10234.420750 1282.152533 0.000212
65 8955.458871 1217.950976 0.000123
66 8125.266489 1067.542071 0.000065
67 7460.723990 888.894318 0.000018
68 6462.769540 767.700977 -0.050643
69 5458.235147 652.125451 -0.120556
70 4451.534428 536.334425 -0.190537
71 9371.663529 1104.493126 0.000040
72 11985.535635 1876.338189 0.000222
73 11623.893720 1629.772538 0.000197
74 11040.319690 1435.989662 0.000156
75 10406.562382 1249.283436 0.000112
76 9479.717395 1116.983538 0.000048
77 8475.742091 999.775354 -0.021837
78 7471.207698 883.988876 -0.091810
79 6462.769540 767.700977 -0.161760
80 5458.235147 652.125451 -0.231672
81 10658.420822 1308.556262 0.000019
82 11973.604069 1746.007712 0.000110
83 11973.604069 1746.007712 0.000110
84 11623.893720 1629.772538 0.000086
85 11040.319690 1435.989662 0.000045
86 10406.562382 1249.283436 0.000001
87 9479.717395 1116.983538 -0.063467
88 8475.742091 999.775354 -0.132953
89 7471.207698 883.988876 -0.202927
90 6462.481788 767.807980 -0.272896
91 11984.113511 1748.047892 -0.000201
92 11987.418989 2046.236151 0.000000
93 11987.418989 2046.236151 0.000000
94 11984.113511 1748.047892 -0.000201
95 11634.403161 1632.508345 -0.024509
96 11040.697227 1435.311557 -0.065778
97 10399.451279 1248.963735 -0.110354
98 9479.717395 1116.983538 -0.174583
99 8475.454340 999.671406 -0.244090
100 7471.207698 883.988876 -0.314044