diff --git a/Programming/WDWR/projekt/doc/graphics/ryzyko_dystrybuanta.png b/Programming/WDWR/projekt/doc/graphics/ryzyko_dystrybuanta.png new file mode 100644 index 00000000..40aa71d0 Binary files /dev/null and b/Programming/WDWR/projekt/doc/graphics/ryzyko_dystrybuanta.png differ diff --git a/Programming/WDWR/projekt/doc/graphics/ryzyko_zysk_wykres.png b/Programming/WDWR/projekt/doc/graphics/ryzyko_zysk_wykres.png new file mode 100644 index 00000000..28f07a36 Binary files /dev/null and b/Programming/WDWR/projekt/doc/graphics/ryzyko_zysk_wykres.png differ diff --git a/Programming/WDWR/projekt/doc/graphics/zysk_dystrybuanta.png b/Programming/WDWR/projekt/doc/graphics/zysk_dystrybuanta.png new file mode 100644 index 00000000..0e3c0e00 Binary files /dev/null and b/Programming/WDWR/projekt/doc/graphics/zysk_dystrybuanta.png differ diff --git a/Programming/WDWR/projekt/doc/main.pdf b/Programming/WDWR/projekt/doc/main.pdf index 4bc38ce5..5861e14b 100644 Binary files a/Programming/WDWR/projekt/doc/main.pdf and b/Programming/WDWR/projekt/doc/main.pdf differ diff --git a/Programming/WDWR/projekt/doc/main.tex b/Programming/WDWR/projekt/doc/main.tex index c252a574..f36de316 100644 --- a/Programming/WDWR/projekt/doc/main.tex +++ b/Programming/WDWR/projekt/doc/main.tex @@ -1,5 +1,4 @@ \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} @@ -126,23 +125,23 @@ i macierzami, w nawiasach kwadratowych określono ich wymiary, odnosząc się do \hline Nazwa parametru & Szczegółowy opis znaczenia \\ \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\\ + numberOfMachineTypes & Ilość typów maszyn (procesów) dostępnych w fabryce \\ +numberOfMonths & Ilość miesięcy uwzględnionych w symulacji \\ +numberOfProductsTypes & Ilość typów produktów \\ +numberOfScenarios & Ilość scenariuszy wygenerowanych do symulacji \\ +machines[numberOfMachineTypes] & Wektor typów maszyn (procesów)\\ +months[numberOfMonths] & Wektor miesięcy symulacji\\ +products[numberOfProductsTypes] & Wektor typów produktów\\ +machineCount[numberOfMachineTypes] & Wektor ilości maszyn danego typu\\ +timeToProduce[numberOfMachineTypes][numberOfProductsTypes] & macierz czasów produkcji danego produktu na danej maszynie \\ +maxProductsInMonth[numberOfMonths][numberOfProductsTypes] & macierz maksymalnej ilości produktów, jakie można sprzedać w danym miesiącu\\ +numberOfHoursInFactory & Ilość godzin pracy fabryki w miesiącu\\ +mu[numberOfProductsTypes] & Wektor wartości oczekiwanych rozkładu t-Studenta do generacji scenariuszy\\ +sigma [numberOfProductsTypes][numberOfProductsTypes] & Macierz kowariancji dla rozkłady t-Studenta\\ +sellProfit[numberOfScenarios][numberOfProductsTypes] & 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 \\ +storageMax[numberOfProductsTypes] & Wektor maksymalnej pojemności magazynu dla każdego typu produktu \\ +storageStart[numberOfProductsTypes] & Wektor ilości początkowej produktów w magazynie \\ \hline \end{tabular} \end{table} @@ -157,12 +156,12 @@ Zmienne decyzyjne stanowią wartości kontrolowane przez podmiot podejmujący de \hline Nazwa zmiennej & Szczegółowy opis znaczenia \\ \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\\ + produce[numberOfMonths][numberOfProductsTypes] & Macierz zawierające ilości wytwarzanych sztuk danego typu produktu w danym miesiącu \\ + sell[numberOfMonths][numberOfProductsTypes] & Macierz zawierająca ilości sprzedawanych sztuk danego typu produktu w danym miesiącu \\ + stock[numberOfMonths][numberOfProductsTypes] & Macierz zawierająca ilości sztuk danego typu produktu znajdujących się w magazynie w danym miesiącu \\ + workTime[numberOfMonths][numberOfMachineTypes][numberOfProductsTypes] & Macierz zawierająca czas pracy każdej maszyny dla każdego typu produktu w kazdym miesiącu \\ + if80prec[numberOfMonths][numberOfProductsTypes] & Macierz zmiennych binarnych (1 jeśli sprzedaż danego produktu w danym miesiącu przekroczyła 80\% wartości maksymalnej, 0 - w przeciwnym wypadku)\\ + lowerProfit[numberOfScenarios][numberOfMonths][numberOfProductsTypes] & 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} @@ -198,37 +197,37 @@ Zmienne decyzyjne stanowią wartości kontrolowane przez podmiot podejmujący de p \in products}} lowerProfit[i][m][p] >=0 \end{equation} -\item Ograniczenie czasowe pracy maszyn - Każda maszyna może pracować maksymalnie \textit{nHours} godzin w miesiącu, zatem łączny czas pracy wszystkich maszyn danego typu nie może przekroczyć iloczynu liczby dostępnych maszyn tego typu i czasu \textit{nHours}. +\item Ograniczenie czasowe pracy maszyn - Każda maszyna może pracować maksymalnie \textit{numberOfHoursInFactory} godzin w miesiącu, zatem łączny czas pracy wszystkich maszyn danego typu nie może przekroczyć iloczynu liczby dostępnych maszyn tego typu i czasu \textit{numberOfHoursInFactory}. \begin{equation} \bigforall_{\substack{ m \in months\\ mc \in machines}} \sum_{p \in products} - (workTime[m][mc][p] <= machineCount[mc]*nHours) + (workTime[m][mc][p] <= machineCount[mc]*numberOfHoursInFactory) \end{equation} \item Ograniczenie wiążące czas pracy maszyn z produkcją - czas wykorzystania określonego typu maszyny jest równy sumie iloczynów liczby wytworzonych jednostek każdego produktu i czasu potrzebnego na obróbkę jednej jednostki tego produktu na danej maszynie: \begin{equation} \bigforall_{\substack{ m \in months\\ mc \in machines\\ - p \in products}} workTime[m][mc][p] == produce[m][p]*prodTime[mc][p] + p \in products}} workTime[m][mc][p] == produce[m][p]*timeToProduce[mc][p] \end{equation} \item Ograniczenie maksymalnej sprzedaży wynikające z pojemności rynku w danym miesiącu: \begin{equation} \bigforall_{\substack{ m \in months\\ - p \in products}} sell[m][p] == maxInMonth[m][p] + p \in products}} sell[m][p] == maxProductsInMonth[m][p] \end{equation} \item Warunki definiujące zmienną binarną przy przekroczeniu 80 procent chłonności rynku: \begin{equation} \bigforall_{\substack{ m \in months\\ - p \in products}} sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p] + p \in products}} sell[m][p] <= 0.8*maxProductsInMonth[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] + p \in products}} sell[m][p] >= 0.8*maxProductsInMonth[m][p] * if80prec[m][p] \end{equation} \item Ograniczenia linearyzujące oddziaływanie zmiennych binarnych na funkcję celu: @@ -305,19 +304,21 @@ Model zaimplementowano w środowisku IBM ILOG CPLEX Optimization Studio z wykorz \end{enumerate} \subsection{Rozwiązanie} -Rozwiązanie optymalne modelu maksymalizacji wartości oczekiwanej zysku zostało wyznaczone przy użyciu solvera CPLEX. Maksymalna wartość oczekiwana zysku wynosi około 26023,63 zł. Optymalne wartości zmiennych decyzyjnych przedstawiają się następująco: +Rozwiązanie optymalne modelu maksymalizacji wartości oczekiwanej zysku zostało wyznaczone przy użyciu solvera CPLEX. +Maksymalna wartość oczekiwana zysku wynosi około 11036,12 zł. +Optymalne wartości zmiennych decyzyjnych przedstawiają się następująco: \begin{displaymath} \mathbf{sell} = \begin{pmatrix} - 320 & 0 & 160 & 240 \\ - 700 & 320 & 500 & 0 \\ - 0 & 800 & 600 & 320 \\ + 160 & 0 & 80 & 160 \\ + 240 & 80 & 160 & 160 \\ + 0 & 240 & 80 & 160 \\ \end{pmatrix}, \mathbf{if80prec} = \begin{pmatrix} 0 & 1 & 0 & 0 \\ - 1 & 0 & 1 & 1 \\ - 1 & 1 & 1 & 0 \\ + 0 & 0 & 0 & 0 \\ + 1 & 0 & 0 & 0 \\ \end{pmatrix}, \end{displaymath} \begin{displaymath} @@ -329,9 +330,9 @@ Rozwiązanie optymalne modelu maksymalizacji wartości oczekiwanej zysku został \end{pmatrix}, \mathbf{produce} = \begin{pmatrix} - 270 & 0 & 110 & 190 \\ - 700 & 270 & 500 & 0 \\ - 50 & 850 & 650 & 370 \\ + 110 & 0 & 30 & 110 \\ + 240 & 30 & 160 & 160 \\ + 50 & 290 & 130 & 210 \\ \end{pmatrix} \end{displaymath} @@ -339,29 +340,29 @@ Czasem pracy poszczególnych typów maszyn dla różnych typów produktów w ka \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 \\ + 44 & 0 & 0 & 0 \\ + 22 & 0 & 0 & 66 \\ + 11 & 0 & 35 & 0 \\ + 6.6 & 0 & 0 & 5.5 \\ + 0 & 0 & 1 & 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 \\ + 96 & 18 & 0 & 0 \\ + 48 & 3 & 0 & 96 \\ + 24 & 0 & 140 & 0 \\ + 14.4 & 1.2 & 0 & 8 \\ + 0 & 1.5 & 4 & 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 \\ + 20 & 174 & 0 & 0 \\ + 10 & 29 & 0 & 126 \\ + 5 & 0 & 105 & 0 \\ + 3 & 11.6 & 0 & 10.5 \\ + 0 & 14.5 & 3 & 0 \\ \end{pmatrix} \end{displaymath} @@ -379,7 +380,7 @@ gdzie $r_{t'}(\mathbf{x})$ oznacza realizację zysku dla scenariusza $t'$, a $p_ W kontekście przyjętych w projekcie oznaczeń, wyrażenie definiujące miarę ryzyka przyjmuje następującą postać: \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} +giniRisk = \frac{1}{2}\cdot\sum_{t1 \in scenarios}\sum_{t2 \in scenarios} \lvert profit[t1]-profit[t2] \rvert \cdot \frac{1}{numberOfScenarios} \cdot \frac{1}{numberOfScenarios} \end{equation} \subsection{Model preferencji} @@ -396,7 +397,7 @@ minAvgProfit stanowi dodatkowy parametr modelu. Załączniki 5 i 6 zawierają pl Na rysunku \ref{fig:profit-risk} zaprezentowano rozwiązania efektywne modelu w przestrzeni ryzyko-zysk. Niebieskie trójkąty oznaczają rozwiązania efektywne dla różnych wartości wymaganego poziomu zysku. Uwzględniając ograniczenia obliczeniowe komputera, wygenerowano 52 równomiernie rozmieszczone rozwiązania, z których każde bazuje na 30 scenariuszach. Wprowadzono ograniczenie czasowe działania solvera dla pojedynczego rozwiązania na poziomie 5 minut. Całkowity czas obliczeń przekroczył 3 godziny. Załączniki 7 i 8 obejmują pliki parametrów oraz modelu wraz ze skryptem dla solvera CPLEX, które zostały wykorzystane do uzyskania rozwiązań. Kolorem żółtym wyróżniono rozwiązanie maksymalnego zysku oraz minimalnego ryzyka. Wartości odpowiadające tym rozwiązaniom przedstawiono w tabeli \ref{tab:min-max}. \begin{figure}[ht!] \centering -%\includegraphics[width=0.8\textwidth]{graphics/results-minAvgProfit-marker} +\includegraphics[width=0.8\textwidth]{graphics/ryzyko_zysk_wykres.png} \caption{Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk} \label{fig:profit-risk} \end{figure} @@ -414,7 +415,7 @@ Na wykresie \ref{fig:profit-risk} żółtymi punktami wyznaczono rozwiązania ch \hline & Miara zysku & Miara ryzyka \\ \hline - Maksymalizacja zysku & 26553.9 zł & 796.113 zł \\ + Maksymalizacja zysku & 9515.80 zł & 360.18 zł \\ Minimalizacja ryzyka & -600.00 zł & 0.0 zł \\ \hline @@ -435,19 +436,24 @@ W celu analizy dominacji stochastycznej pierwszego rzędu (FSD) wybrano 3 rozwi \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ł\\ + Ograniczenie minimalnego zysku & 8450.97 zł & 8983.38 zł & 9515.79 zł\\ + Średni zysk & 8451.02 zł & 8983.40 zł & 9515.80 zł\\ + Miara ryzyka & 306.38 zł & 332.93 zł & 360.18 zł\\ \hline \end{tabular} \end{table} -W celu weryfikacji wzajemnej dominacji wybranych rozwiązań w sensie FSD przygotowano odwrotne dystrybuanty dla obu kryteriów. Rysunek \ref{fig:FSD-profit} ilustruje odwrotną dystrybuantę rozkładu średniego zysku między scenariuszami dla trzech wybranych rozwiązań efektywnych. Analiza wykresu wskazuje, że rozwiązanie C wykazuje dominację nad rozwiązaniami A i B w sensie FSD, co oznacza, że w każdym scenariuszu miara zysku dla decyzji C przewyższa odpowiednie wartości dla decyzji A i B. Ponadto rozwiązanie B dominuje rozwiązanie A w sensie FSD. +W celu weryfikacji wzajemnej dominacji wybranych rozwiązań w sensie FSD przygotowano odwrotne dystrybuanty +dla obu kryteriów. Rysunek \ref{fig:FSD-profit} ilustruje odwrotną dystrybuantę rozkładu średniego +zysku między scenariuszami dla trzech wybranych rozwiązań efektywnych. Analiza wykresu wskazuje, +że rozwiązanie C wykazuje dominację nad rozwiązaniami A i B w sensie FSD, co oznacza, że w +każdym scenariuszu miara zysku dla decyzji C przewyższa odpowiednie wartości dla decyzji A i B. +Ponadto rozwiązanie B dominuje rozwiązanie A w sensie FSD. \begin{figure}[ht!] \centering -%\includegraphics[width=\textwidth]{graphics/results-FSD-profit} +\includegraphics[width=\textwidth]{graphics/zysk_dystrybuanta.png} \caption{Odwrotna dystrybuanta rozkładu średniego zysku między scenariuszami} \label{fig:FSD-profit} \end{figure} @@ -456,34 +462,10 @@ Rysunek \ref{fig:FSD-risk} przedstawia odwrotną dystrybuantę rozkładu średni \begin{figure}[ht!] \centering -%\includegraphics[width=0.95\textwidth]{graphics/results-FSD-risk} +\includegraphics[width=\textwidth]{graphics/ryzyko_dystrybuanta.png} \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} \ No newline at end of file diff --git a/Programming/WDWR/projekt/graph.py b/Programming/WDWR/projekt/graph.py new file mode 100644 index 00000000..7f930d24 --- /dev/null +++ b/Programming/WDWR/projekt/graph.py @@ -0,0 +1,51 @@ +import matplotlib.pyplot as plt +import pandas as pd +from io import StringIO + +# Your data +data_str = """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.59;-67.423334025;12.249866065;0;0;0;1;0;0;0;0;9;8;1;43;41;50;50;7;41;42;49;7;50;50;50;50 +3;464.82;465.647226284;26.015138747;0;0;0;0;0;0;0;29;20;19;9;52;30;50;41;0;30;31;41;0;50;50;50;50 +4;997.23;997.66185313;40.349353614;0;0;0;110;0;0;0;0;30;30;13;50;20;50;37;0;20;20;37;0;50;50;50;50 +5;1529.64;1530.172175866;54.689711726;0;0;0;114;0;0;0;0;42;40;17;92;8;50;33;0;8;10;33;0;50;50;50;50 +6;2062.05;2062.088549477;69.062913221;0;0;0;9;0;0;0;200;50;50;25;50;0;50;25;0;0;0;25;0;50;50;50;50 +7;2594.46;2594.684714046;84.265583873;9;0;0;64;0;10;0;159;50;51;28;51;0;50;22;0;0;0;22;0;50;50;50;50 +8;3126.87;3127.12427492;99.497458717;20;0;0;0;0;30;0;111;50;58;35;249;0;50;15;0;0;0;15;0;50;50;50;50 +9;3659.28;3659.345897427;114.728718529;29;0;0;2;1;31;0;200;50;69;39;249;0;50;11;0;0;0;11;0;50;50;50;50 +10;4191.69;4191.916591732;129.963670504;36;0;0;114;5;32;0;160;50;79;45;210;0;50;5;0;0;0;5;0;50;50;50;50 +11;4724.1;4724.191045823;145.204545226;50;0;0;100;2;34;0;197;50;89;50;250;0;50;0;0;0;0;0;0;50;50;50;50 +12;5256.51;5256.719240584;162.349562672;72;0;34;150;0;3;0;200;50;123;50;210;0;50;0;0;0;0;0;0;50;50;50;50 +13;5788.92;5789.016098305;182.46075748;122;0;0;150;1;1;0;200;50;149;94;210;0;50;0;0;0;0;0;0;50;50;50;50 +14;6321.33;6321.358645932;205.000585625;110;0;50;150;19;33;0;200;50;156;102;250;0;50;0;0;0;0;0;0;50;50;50;50 +15;6853.74;6853.83219788;229.023498807;109;0;24;110;1;0;94;160;50;191;51;250;0;50;0;0;0;0;0;0;50;50;50;50 +16;7386.15;7386.171785273;253.962965038;1;0;1;150;121;30;189;200;50;200;50;210;0;50;0;0;0;0;0;0;50;50;50;50 +17;7918.56;7918.565798346;279.907638363;110;0;30;110;59;48;76;160;50;205;130;210;0;50;0;0;0;0;0;0;50;50;50;50 +18;8450.97;8451.020747071;306.383357869;111;0;0;150;72;0;191;200;50;256;131;210;0;50;0;0;0;0;0;0;50;50;50;50 +19;8983.38;8983.400103901;332.936696297;111;0;49;110;83;15;144;200;50;317;149;250;0;50;0;0;0;0;0;0;50;50;50;50 +20;9515.79;9515.804890325;360.18213126;110;0;30;110;110;28;160;160;50;273;150;250;0;50;0;0;0;0;0;0;50;50;50;50""" + +# Read the data +df = pd.read_csv(StringIO(data_str), sep=';') + +# Create the scatter plot +plt.figure(figsize=(10, 6)) +plt.scatter(df['avgProfit'], df['giniRisk'], alpha=0.7, s=50) + +# Add labels and title +plt.xlabel('Przeciętny Zysk') +plt.ylabel('Ryzyko') + +# Add grid for better readability +plt.grid(True, alpha=0.3) + +# Format the plot +plt.tight_layout() + +# Show the plot +plt.show() + +# Print some basic statistics +print(f"Average Profit range: {df['avgProfit'].min():.2f} to {df['avgProfit'].max():.2f}") +print(f"Gini Risk range: {df['giniRisk'].min():.2f} to {df['giniRisk'].max():.2f}") +print(f"Number of data points: {len(df)}") \ No newline at end of file diff --git a/Programming/WDWR/projekt/graph2.py b/Programming/WDWR/projekt/graph2.py new file mode 100644 index 00000000..cdae2518 --- /dev/null +++ b/Programming/WDWR/projekt/graph2.py @@ -0,0 +1,65 @@ +import matplotlib.pyplot as plt +import numpy as np + +# Data for the three scenarios +scenario1_profits = [ + 8283.101223531, 8360.092861464, 8023.436774628, 7996.435353438, 8108.734620296, + 8709.702668322, 9236.429507678, 8492.980846575, 8912.962073143, 8201.079841867, + 7947.08574225, 8426.386242154, 8633.510288097, 7925.419317516, 8216.653093455, + 8162.239336848, 10606.276724793, 7766.753696884, 8902.966530729, 8329.954853003, + 8615.534725088, 9307.905933844, 8711.836200338, 7853.713101162, 8160.850707138, + 8505.74747647, 7807.599624626, 8650.006339759, 7571.333855925, 9103.892851116 +] + +scenario2_profits = [ + 8779.880622914, 8905.098118171, 8457.038873118, 8476.337700492, 8611.662470696, + 9284.604268643, 9787.525726881, 9033.316521658, 9469.444921654, 8726.555858861, + 8437.173060618, 8935.043125766, 9172.334141304, 8425.564554151, 8725.52174345, + 8672.538442695, 11321.501722433, 8233.9854963, 9465.167737138, 8841.407418574, + 9162.816556878, 9946.670992861, 9281.411111594, 8349.695093959, 8671.731748701, + 9074.152941559, 8296.712958538, 9208.592940681, 8041.287735389, 9707.228511359 +] + +scenario3_profits = [ + 9268.899026395, 9430.210649623, 8919.631184021, 8944.062758608, 9095.775246456, + 9886.312580673, 10387.393647889, 9637.953603446, 10098.221535588, 9238.913391815, + 8980.977156104, 9414.393022001, 9722.356857713, 8917.726783311, 9178.474614142, + 9167.292074295, 12011.512542804, 8693.048121325, 10039.47692674, 9375.735645214, + 9730.36014247, 10531.376234688, 9750.101324443, 8881.341453044, 9186.289888284, + 9675.754350507, 8773.329747496, 9722.523537949, 8489.277170975, 10325.425491734 +] + +# Create figure with single plot +plt.figure(figsize=(12, 8)) + +# Sort the data for each scenario (descending order) +scenario1_sorted = sorted(scenario1_profits, reverse=True) +scenario2_sorted = sorted(scenario2_profits, reverse=True) +scenario3_sorted = sorted(scenario3_profits, reverse=True) + +# Create y-axis values (cumulative distribution from 0 to 1) +num_points = len(scenario1_profits) +y_values = [i / num_points for i in range(1, num_points + 1)] + +# Plot all three scenarios on the same graph +plt.plot(scenario1_sorted, y_values, 'b-o', label='Scenariusz 1', linewidth=2, markersize=4) +plt.plot(scenario2_sorted, y_values, 'g-s', label='Scenariusz 2', linewidth=2, markersize=4) +plt.plot(scenario3_sorted, y_values, 'r-^', label='Scenariusz 3', linewidth=2, markersize=4) +# Add labels and title +plt.xlabel('Przeciętny Zysk') +plt.ylabel('Odwrotna dystrybuanta') +plt.ylim(0, 1) # Set y-axis limits to cut off values outside 0-1 range +plt.grid(True, alpha=0.3) +plt.legend() + +# Format the plot +plt.tight_layout() + +# Show the plot +plt.show() + +# Print statistics for each scenario +print("Scenario Statistics:") +print(f"Scenario 1 - Mean: {np.mean(scenario1_profits):.2f}, Std: {np.std(scenario1_profits):.2f}") +print(f"Scenario 2 - Mean: {np.mean(scenario2_profits):.2f}, Std: {np.std(scenario2_profits):.2f}") +print(f"Scenario 3 - Mean: {np.mean(scenario3_profits):.2f}, Std: {np.std(scenario3_profits):.2f}") \ No newline at end of file diff --git a/Programming/WDWR/projekt/graph3.py b/Programming/WDWR/projekt/graph3.py new file mode 100644 index 00000000..836d93f4 --- /dev/null +++ b/Programming/WDWR/projekt/graph3.py @@ -0,0 +1,60 @@ +import matplotlib.pyplot as plt +import numpy as np + +# Data for the three scenarios - Risk values +scenario1_risks = [ + 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 +] + +scenario2_risks = [ + 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 +] + +scenario3_risks = [ + 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 +] + +# Create figure with single plot +plt.figure(figsize=(12, 8)) + +# Sort the data for each scenario (descending order) +scenario1_sorted = sorted(scenario1_risks, reverse=True) +scenario2_sorted = sorted(scenario2_risks, reverse=True) +scenario3_sorted = sorted(scenario3_risks, reverse=True) + +# Create y-axis values (cumulative distribution from 0 to 1) +num_points = len(scenario1_risks) +y_values = [i / num_points for i in range(1, num_points + 1)] + +# Plot all three scenarios on the same graph +plt.plot(scenario1_sorted, y_values, 'b-o', label='Scenariusz 1', linewidth=2, markersize=4) +plt.plot(scenario2_sorted, y_values, 'g-s', label='Scenariusz 2', linewidth=2, markersize=4) +plt.plot(scenario3_sorted, y_values, 'r-^', label='Scenariusz 3', linewidth=2, markersize=4) + +# Add labels and title +plt.xlabel('Ryzyko') +plt.ylabel('Odwrotna dystrybuanta') +plt.ylim(0, 1) # Set y-axis limits to cut off values outside 0-1 range +plt.grid(True, alpha=0.3) +plt.legend() + +# Format the plot +plt.tight_layout() + +# Show the plot +plt.show() + +# Print statistics for each scenario +print("Scenario Statistics:") +print(f"Scenario 1 - Mean: {np.mean(scenario1_risks):.2f}, " + f"Std: {np.std(scenario1_risks):.2f}") +print(f"Scenario 2 - Mean: {np.mean(scenario2_risks):.2f}, " + f"Std: {np.std(scenario2_risks):.2f}") +print(f"Scenario 3 - Mean: {np.mean(scenario3_risks):.2f}, " + f"Std: {np.std(scenario3_risks):.2f}") \ No newline at end of file diff --git a/Programming/WDWR/projekt/wdwr/wdwr17421-1.dat b/Programming/WDWR/projekt/wdwr/wdwr17421-1.dat index 03a9bad0..29cb9816 100644 --- a/Programming/WDWR/projekt/wdwr/wdwr17421-1.dat +++ b/Programming/WDWR/projekt/wdwr/wdwr17421-1.dat @@ -5,26 +5,26 @@ *********************************************/ /***************PARAMETRY********************/ -nMachType = 5; //ilosc typow maszun -nMonth = 3; //ilosc symulowanych miesiecy -nProdType = 4; //ilosc typow produktow +numberOfMachineTypes = 5; //ilosc typow maszun +numberOfMonths = 3; //ilosc symulowanych miesiecy +numberOfProductsTypes = 4; //ilosc typow produktow -nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 -nScenarios = 1000; //ilosc scenariuszy w symulacji +numberOfHoursInFactory = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 +numberOfScenarios = 1000; //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] +timeToProduce = [[ 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] +maxProductsInMonth = [[ 200 0 100 200] [ 300 100 200 200] [ 0 300 100 200]]; diff --git a/Programming/WDWR/projekt/wdwr/wdwr17421-1.mod b/Programming/WDWR/projekt/wdwr/wdwr17421-1.mod index 3678dea8..40458e01 100644 --- a/Programming/WDWR/projekt/wdwr/wdwr17421-1.mod +++ b/Programming/WDWR/projekt/wdwr/wdwr17421-1.mod @@ -8,23 +8,23 @@ //Paramatry zostaladniej opisane w pliku .dat oraz raporcie // Parametry liczbowe -int nMachType = ...; -int nMonth = ...; -int nProdType = ...; +int numberOfMachineTypes = ...; +int numberOfMonths = ...; +int numberOfProductsTypes = ...; -int nHours = ...; -int nScenarios = ...; +int numberOfHoursInFactory = ...; +int numberOfScenarios = ...; // Utworzenie wektorow indeksujacych -{int} machines = asSet(1..nMachType); -{int} months = asSet(1..nMonth); -{int} products = asSet(1..nProdType); -{int} scenarios = asSet(1..nScenarios); +{int} machines = asSet(1..numberOfMachineTypes); +{int} months = asSet(1..numberOfMonths); +{int} products = asSet(1..numberOfProductsTypes); +{int} scenarios = asSet(1..numberOfScenarios); //Parametry produkcji i sprzedazy int machineCount[machines] = ...; -float prodTime[machines][products] = ...; -int maxInMonth[months][products] = ...; +float timeToProduce[machines][products] = ...; +int maxProductsInMonth[months][products] = ...; //Parametry magazynowania int storageMax[products] = ...; @@ -58,7 +58,7 @@ dvar float lowerProfit[scenarios][months][products]; 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; +dexpr float avgProfit = sum(i in scenarios)(profit[i])/numberOfScenarios; // funkcja celu maximize avgProfit; @@ -75,20 +75,20 @@ subject to { } // Ogranicznie czasu produkcji maszyn w miesiacu forall(m in months, mc in machines) { - sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*nHours); + sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*numberOfHoursInFactory); } // 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]; + workTime[m][mc][p] == produce[m][p]*timeToProduce[mc][p]; } // Ogranicznie maksymalnej pojemnosci rynku forall(m in months, p in products) { - sell[m][p] <= maxInMonth[m][p]; + sell[m][p] <= maxProductsInMonth[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]; + sell[m][p] <= 0.8*maxProductsInMonth[m][p] + 1000000 * if80prec[m][p]; + sell[m][p] >= 0.8*maxProductsInMonth[m][p] * if80prec[m][p]; } // Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu forall (i in scenarios,m in months, p in products) { diff --git a/Programming/WDWR/projekt/wdwr/wdwr17421-2.dat b/Programming/WDWR/projekt/wdwr/wdwr17421-2.dat index 3a7ca3a8..a3c64564 100644 --- a/Programming/WDWR/projekt/wdwr/wdwr17421-2.dat +++ b/Programming/WDWR/projekt/wdwr/wdwr17421-2.dat @@ -5,26 +5,26 @@ *********************************************/ /***************PARAMETRY********************/ -nMachType = 5; //ilosc typow maszun -nMonth = 3; //ilosc symulowanych miesiecy -nProdType = 4; //ilosc typow produktow +numberOfMachineTypes = 5; //ilosc typow maszun +numberOfMonths = 3; //ilosc symulowanych miesiecy +numberOfProductsTypes = 4; //ilosc typow produktow -nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 -nScenarios = 30; //ilosc scenariuszy w symulacji +numberOfHoursInFactory = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 +numberOfScenarios = 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] +timeToProduce = [[ 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] +maxProductsInMonth = [[ 200 0 100 200] [ 300 100 200 200] [ 0 300 100 200]]; diff --git a/Programming/WDWR/projekt/wdwr/wdwr17421-2.mod b/Programming/WDWR/projekt/wdwr/wdwr17421-2.mod index cb8e5a4e..56410650 100644 --- a/Programming/WDWR/projekt/wdwr/wdwr17421-2.mod +++ b/Programming/WDWR/projekt/wdwr/wdwr17421-2.mod @@ -8,23 +8,23 @@ //Paramatry zostaladniej opisane w pliku .dat oraz raporcie // Parametry liczbowe -int nMachType = ...; -int nMonth = ...; -int nProdType = ...; +int numberOfMachineTypes = ...; +int numberOfMonths = ...; +int numberOfProductsTypes = ...; -int nHours = ...; -int nScenarios = ...; +int numberOfHoursInFactory = ...; +int numberOfScenarios = ...; // Utworzenie wektorow indeksujacych -{int} machines = asSet(1..nMachType); -{int} months = asSet(1..nMonth); -{int} products = asSet(1..nProdType); -{int} scenarios = asSet(1..nScenarios); +{int} machines = asSet(1..numberOfMachineTypes); +{int} months = asSet(1..numberOfMonths); +{int} products = asSet(1..numberOfProductsTypes); +{int} scenarios = asSet(1..numberOfScenarios); //Parametry produkcji i sprzedazy int machineCount[machines] = ...; -float prodTime[machines][products] = ...; -int maxInMonth[months][products] = ...; +float timeToProduce[machines][products] = ...; +int maxProductsInMonth[months][products] = ...; //Parametry magazynowania int storageMax[products] = ...; @@ -59,11 +59,11 @@ 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; +dexpr float avgProfit = sum(i in scenarios)(profit[i])/numberOfScenarios; // 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 + 0.5 * abs(profit[t1] - profit[t2]) * 1/numberOfScenarios * 1/numberOfScenarios ); // funkcja celu @@ -82,20 +82,20 @@ subject to { } // Ogranicznie czasu produkcji maszyn w miesiacu forall(m in months, mc in machines) { - sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*nHours); + sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*numberOfHoursInFactory); } // 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]; + workTime[m][mc][p] == produce[m][p]*timeToProduce[mc][p]; } // Ogranicznie maksymalnej pojemnosci rynku forall(m in months, p in products) { - sell[m][p] <= maxInMonth[m][p]; + sell[m][p] <= maxProductsInMonth[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]; + sell[m][p] <= 0.8*maxProductsInMonth[m][p] + 1000000 * if80prec[m][p]; + sell[m][p] >= 0.8*maxProductsInMonth[m][p] * if80prec[m][p]; } // Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu forall (i in scenarios,m in months, p in products) { diff --git a/Programming/WDWR/projekt/wdwr/wdwr17421-3.dat b/Programming/WDWR/projekt/wdwr/wdwr17421-3.dat index 4f6cbb12..c4e49420 100644 --- a/Programming/WDWR/projekt/wdwr/wdwr17421-3.dat +++ b/Programming/WDWR/projekt/wdwr/wdwr17421-3.dat @@ -5,26 +5,26 @@ *********************************************/ /***************PARAMETRY********************/ -nMachType = 5; //ilosc typow maszun -nMonth = 3; //ilosc symulowanych miesiecy -nProdType = 4; //ilosc typow produktow +numberOfMachineTypes = 5; //ilosc typow maszun +numberOfMonths = 3; //ilosc symulowanych miesiecy +numberOfProductsTypes = 4; //ilosc typow produktow -nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 -nScenarios = 30; //ilosc scenariuszy w symulacji +numberOfHoursInFactory = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 +numberOfScenarios = 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] +timeToProduce = [[ 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] +maxProductsInMonth = [[ 200 0 100 200] [ 300 100 200 200] [ 0 300 100 200]]; diff --git a/Programming/WDWR/projekt/wdwr/wdwr17421-3.mod b/Programming/WDWR/projekt/wdwr/wdwr17421-3.mod index 43b1dacc..58b242e7 100644 --- a/Programming/WDWR/projekt/wdwr/wdwr17421-3.mod +++ b/Programming/WDWR/projekt/wdwr/wdwr17421-3.mod @@ -8,23 +8,23 @@ //Paramatry zostaladniej opisane w pliku .dat oraz raporcie // Parametry liczbowe -int nMachType = ...; -int nMonth = ...; -int nProdType = ...; +int numberOfMachineTypes = ...; +int numberOfMonths = ...; +int numberOfProductsTypes = ...; -int nHours = ...; -int nScenarios = ...; +int numberOfHoursInFactory = ...; +int numberOfScenarios = ...; // Utworzenie wektorow indeksujacych -{int} machines = asSet(1..nMachType); -{int} months = asSet(1..nMonth); -{int} products = asSet(1..nProdType); -{int} scenarios = asSet(1..nScenarios); +{int} machines = asSet(1..numberOfMachineTypes); +{int} months = asSet(1..numberOfMonths); +{int} products = asSet(1..numberOfProductsTypes); +{int} scenarios = asSet(1..numberOfScenarios); //Parametry produkcji i sprzedazy int machineCount[machines] = ...; -float prodTime[machines][products] = ...; -int maxInMonth[months][products] = ...; +float timeToProduce[machines][products] = ...; +int maxProductsInMonth[months][products] = ...; //Parametry magazynowania int storageMax[products] = ...; @@ -62,11 +62,11 @@ 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; +dexpr float avgProfit = sum(i in scenarios)(profit[i])/numberOfScenarios; // 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 + 0.5 * abs(profit[t1] - profit[t2]) * 1/numberOfScenarios * 1/numberOfScenarios ); // funkcja celu @@ -85,20 +85,20 @@ subject to { } // Ogranicznie czasu produkcji maszyn w miesiacu forall(m in months, mc in machines) { - sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*nHours); + sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*numberOfHoursInFactory); } // 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]; + workTime[m][mc][p] == produce[m][p]*timeToProduce[mc][p]; } // Ogranicznie maksymalnej pojemnosci rynku forall(m in months, p in products) { - sell[m][p] <= maxInMonth[m][p]; + sell[m][p] <= maxProductsInMonth[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]; + sell[m][p] <= 0.8*maxProductsInMonth[m][p] + 1000000 * if80prec[m][p]; + sell[m][p] >= 0.8*maxProductsInMonth[m][p] * if80prec[m][p]; } // Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu forall (i in scenarios,m in months, p in products) { diff --git a/Programming/WDWR/projekt/wdwr/wdwr17421-4.dat b/Programming/WDWR/projekt/wdwr/wdwr17421-4.dat index 696d2ca0..a9c14a7a 100644 --- a/Programming/WDWR/projekt/wdwr/wdwr17421-4.dat +++ b/Programming/WDWR/projekt/wdwr/wdwr17421-4.dat @@ -5,26 +5,26 @@ *********************************************/ /***************PARAMETRY********************/ -nMachType = 5; //ilosc typow maszun -nMonth = 3; //ilosc symulowanych miesiecy -nProdType = 4; //ilosc typow produktow +numberOfMachineTypes = 5; //ilosc typow maszun +numberOfMonths = 3; //ilosc symulowanych miesiecy +numberOfProductsTypes = 4; //ilosc typow produktow -nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 -nScenarios = 30; //ilosc scenariuszy w symulacji +numberOfHoursInFactory = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 +numberOfScenarios = 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] +timeToProduce = [[ 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] +maxProductsInMonth = [[ 200 0 100 200] [ 300 100 200 200] [ 0 300 100 200]]; diff --git a/Programming/WDWR/projekt/wdwr/wdwr17421-4.mod b/Programming/WDWR/projekt/wdwr/wdwr17421-4.mod index bcc00dc9..aee1957f 100644 --- a/Programming/WDWR/projekt/wdwr/wdwr17421-4.mod +++ b/Programming/WDWR/projekt/wdwr/wdwr17421-4.mod @@ -8,23 +8,23 @@ //Paramatry zostaladniej opisane w pliku .dat oraz raporcie // Parametry liczbowe -int nMachType = ...; -int nMonth = ...; -int nProdType = ...; +int numberOfMachineTypes = ...; +int numberOfMonths = ...; +int numberOfProductsTypes = ...; -int nHours = ...; -int nScenarios = ...; +int numberOfHoursInFactory = ...; +int numberOfScenarios = ...; // Utworzenie wektorow indeksujacych -{int} machines = asSet(1..nMachType); -{int} months = asSet(1..nMonth); -{int} products = asSet(1..nProdType); -{int} scenarios = asSet(1..nScenarios); +{int} machines = asSet(1..numberOfMachineTypes); +{int} months = asSet(1..numberOfMonths); +{int} products = asSet(1..numberOfProductsTypes); +{int} scenarios = asSet(1..numberOfScenarios); //Parametry produkcji i sprzedazy int machineCount[machines] = ...; -float prodTime[machines][products] = ...; -int maxInMonth[months][products] = ...; +float timeToProduce[machines][products] = ...; +int maxProductsInMonth[months][products] = ...; //Parametry magazynowania int storageMax[products] = ...; @@ -62,16 +62,16 @@ 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; +dexpr float avgProfit = sum(i in scenarios)(profit[i])/numberOfScenarios; // 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 + 0.5 * abs(profit[i] - profit[t]) * 1/numberOfScenarios ); // 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 + 0.5 * abs(profit[t1] - profit[t2]) * 1/numberOfScenarios * 1/numberOfScenarios ); // funkcja celu @@ -90,20 +90,20 @@ subject to { } // Ogranicznie czasu produkcji maszyn w miesiacu forall(m in months, mc in machines) { - sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*nHours); + sum(p in products) (workTime[m][mc][p]) <= (machineCount[mc]*numberOfHoursInFactory); } // 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]; + workTime[m][mc][p] == produce[m][p]*timeToProduce[mc][p]; } // Ogranicznie maksymalnej pojemnosci rynku forall(m in months, p in products) { - sell[m][p] <= maxInMonth[m][p]; + sell[m][p] <= maxProductsInMonth[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]; + sell[m][p] <= 0.8*maxProductsInMonth[m][p] + 1000000 * if80prec[m][p]; + sell[m][p] >= 0.8*maxProductsInMonth[m][p] * if80prec[m][p]; } // Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu forall (i in scenarios,m in months, p in products) { @@ -165,14 +165,14 @@ main { i = 1;4 fileProfit.writeln("avgProfit: "); - while (i<=data.nScenarios) { + while (i<=data.numberOfScenarios) { fileProfit.writeln(mod.profit[i]); i++; }; i = 1; fileRisk.writeln("Risk: "); - while (i<=data.nScenarios) { + while (i<=data.numberOfScenarios) { fileRisk.writeln(mod.risk[i]); i++; }; @@ -197,14 +197,14 @@ main { i = 1; fileProfit.writeln("avgProfit: "); - while (i<=data.nScenarios) { + while (i<=data.numberOfScenarios) { fileProfit.writeln(mod.profit[i]); i++; }; i = 1; fileRisk.writeln("Risk: "); - while (i<=data.nScenarios) { + while (i<=data.numberOfScenarios) { fileRisk.writeln(mod.risk[i]); i++; }; @@ -228,14 +228,14 @@ main { i = 1; fileProfit.writeln("avgProfit: "); - while (i<=data.nScenarios) { + while (i<=data.numberOfScenarios) { fileProfit.writeln(mod.profit[i]); i++; }; i = 1; fileRisk.writeln("Risk: "); - while (i<=data.nScenarios) { + while (i<=data.numberOfScenarios) { fileRisk.writeln(mod.risk[i]); i++; };