chore: rename parameters wdwr

This commit is contained in:
Krzysztof kuhy Rudnicki 2025-05-24 23:22:59 +02:00
parent ec92fdb693
commit fc0af17c60
16 changed files with 350 additions and 192 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

View File

@ -1,5 +1,4 @@
\documentclass[11pt,a4paper]{article} \documentclass[11pt,a4paper]{article}
\usepackage[OT4]{polski}
\usepackage[utf8]{inputenc} \usepackage[utf8]{inputenc}
\usepackage[inner=2.5cm,outer=2.5cm, tmargin=2.5cm,bmargin=2.5cm]{geometry} \usepackage[inner=2.5cm,outer=2.5cm, tmargin=2.5cm,bmargin=2.5cm]{geometry}
\usepackage{amsmath} \usepackage{amsmath}
@ -126,23 +125,23 @@ i macierzami, w nawiasach kwadratowych określono ich wymiary, odnosząc się do
\hline \hline
Nazwa parametru & Szczegółowy opis znaczenia \\ Nazwa parametru & Szczegółowy opis znaczenia \\
\hline \hline
nMachType & Ilość typów maszyn (procesów) dostępnych w fabryce \\ numberOfMachineTypes & Ilość typów maszyn (procesów) dostępnych w fabryce \\
nMonth & Ilość miesięcy uwzględnionych w symulacji \\ numberOfMonths & Ilość miesięcy uwzględnionych w symulacji \\
nProdType & Ilość typów produktów \\ numberOfProductsTypes & Ilość typów produktów \\
nScenarios & Ilość scenariuszy wygenerowanych do symulacji \\ numberOfScenarios & Ilość scenariuszy wygenerowanych do symulacji \\
machines[nMachType] & Wektor typów maszyn (procesów)\\ machines[numberOfMachineTypes] & Wektor typów maszyn (procesów)\\
months[nMonth] & Wektor miesięcy symulacji\\ months[numberOfMonths] & Wektor miesięcy symulacji\\
products[nProdType] & Wektor typów produktów\\ products[numberOfProductsTypes] & Wektor typów produktów\\
machineCount[nMachType] & Wektor ilości maszyn danego typu\\ machineCount[numberOfMachineTypes] & Wektor ilości maszyn danego typu\\
prodTime[nMachType][nProdType] & macierz czasów produkcji danego produktu na danej maszynie \\ timeToProduce[numberOfMachineTypes][numberOfProductsTypes] & 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\\ maxProductsInMonth[numberOfMonths][numberOfProductsTypes] & macierz maksymalnej ilości produktów, jakie można sprzedać w danym miesiącu\\
nHours & Ilość godzin pracy fabryki w miesiącu\\ numberOfHoursInFactory & Ilość godzin pracy fabryki w miesiącu\\
mu[nProdType] & Wektor wartości oczekiwanych rozkładu t-Studenta do generacji scenariuszy\\ mu[numberOfProductsTypes] & Wektor wartości oczekiwanych rozkładu t-Studenta do generacji scenariuszy\\
sigma [nProdType][nProdType] & Macierz kowariancji dla rozkłady t-Studenta\\ sigma [numberOfProductsTypes][numberOfProductsTypes] & Macierz kowariancji dla rozkłady t-Studenta\\
sellProfit[nScenarios][nProdType] & Macierz wygenerowanych sceniariuszy dochodów ze sprzedaży produktów\\ sellProfit[numberOfScenarios][numberOfProductsTypes] & Macierz wygenerowanych sceniariuszy dochodów ze sprzedaży produktów\\
storageCost & Koszt trzymania jednej sztuki produktu w magazynie przez miesiąc \\ storageCost & Koszt trzymania jednej sztuki produktu w magazynie przez miesiąc \\
storageMax[nProdType] & Wektor maksymalnej pojemności magazynu dla każdego typu produktu \\ storageMax[numberOfProductsTypes] & Wektor maksymalnej pojemności magazynu dla każdego typu produktu \\
storageStart[nProdType] & Wektor ilości początkowej produktów w magazynie \\ storageStart[numberOfProductsTypes] & Wektor ilości początkowej produktów w magazynie \\
\hline \hline
\end{tabular} \end{tabular}
\end{table} \end{table}
@ -157,12 +156,12 @@ Zmienne decyzyjne stanowią wartości kontrolowane przez podmiot podejmujący de
\hline \hline
Nazwa zmiennej & Szczegółowy opis znaczenia \\ Nazwa zmiennej & Szczegółowy opis znaczenia \\
\hline \hline
produce[nMonth][nProdType] & Macierz zawierające ilości wytwarzanych sztuk danego typu produktu w danym miesiącu \\ produce[numberOfMonths][numberOfProductsTypes] & 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 \\ sell[numberOfMonths][numberOfProductsTypes] & 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 \\ stock[numberOfMonths][numberOfProductsTypes] & 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 \\ workTime[numberOfMonths][numberOfMachineTypes][numberOfProductsTypes] & 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)\\ 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[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\\ 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 \hline
\end{tabular} \end{tabular}
\end{table} \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 p \in products}} lowerProfit[i][m][p] >=0
\end{equation} \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} \begin{equation}
\bigforall_{\substack{ \bigforall_{\substack{
m \in months\\ m \in months\\
mc \in machines}} \sum_{p \in products} mc \in machines}} \sum_{p \in products}
(workTime[m][mc][p] <= machineCount[mc]*nHours) (workTime[m][mc][p] <= machineCount[mc]*numberOfHoursInFactory)
\end{equation} \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: \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} \begin{equation}
\bigforall_{\substack{ \bigforall_{\substack{
m \in months\\ m \in months\\
mc \in machines\\ 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} \end{equation}
\item Ograniczenie maksymalnej sprzedaży wynikające z pojemności rynku w danym miesiącu: \item Ograniczenie maksymalnej sprzedaży wynikające z pojemności rynku w danym miesiącu:
\begin{equation} \begin{equation}
\bigforall_{\substack{ \bigforall_{\substack{
m \in months\\ m \in months\\
p \in products}} sell[m][p] == maxInMonth[m][p] p \in products}} sell[m][p] == maxProductsInMonth[m][p]
\end{equation} \end{equation}
\item Warunki definiujące zmienną binarną przy przekroczeniu 80 procent chłonności rynku: \item Warunki definiujące zmienną binarną przy przekroczeniu 80 procent chłonności rynku:
\begin{equation} \begin{equation}
\bigforall_{\substack{ \bigforall_{\substack{
m \in months\\ 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} \end{equation}
\begin{equation} \begin{equation}
\bigforall_{\substack{ \bigforall_{\substack{
m \in months\\ 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} \end{equation}
\item Ograniczenia linearyzujące oddziaływanie zmiennych binarnych na funkcję celu: \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} \end{enumerate}
\subsection{Rozwiązanie} \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} \begin{displaymath}
\mathbf{sell} = \mathbf{sell} =
\begin{pmatrix} \begin{pmatrix}
320 & 0 & 160 & 240 \\ 160 & 0 & 80 & 160 \\
700 & 320 & 500 & 0 \\ 240 & 80 & 160 & 160 \\
0 & 800 & 600 & 320 \\ 0 & 240 & 80 & 160 \\
\end{pmatrix}, \end{pmatrix},
\mathbf{if80prec} = \mathbf{if80prec} =
\begin{pmatrix} \begin{pmatrix}
0 & 1 & 0 & 0 \\ 0 & 1 & 0 & 0 \\
1 & 0 & 1 & 1 \\ 0 & 0 & 0 & 0 \\
1 & 1 & 1 & 0 \\ 1 & 0 & 0 & 0 \\
\end{pmatrix}, \end{pmatrix},
\end{displaymath} \end{displaymath}
\begin{displaymath} \begin{displaymath}
@ -329,9 +330,9 @@ Rozwiązanie optymalne modelu maksymalizacji wartości oczekiwanej zysku został
\end{pmatrix}, \end{pmatrix},
\mathbf{produce} = \mathbf{produce} =
\begin{pmatrix} \begin{pmatrix}
270 & 0 & 110 & 190 \\ 110 & 0 & 30 & 110 \\
700 & 270 & 500 & 0 \\ 240 & 30 & 160 & 160 \\
50 & 850 & 650 & 370 \\ 50 & 290 & 130 & 210 \\
\end{pmatrix} \end{pmatrix}
\end{displaymath} \end{displaymath}
@ -339,29 +340,29 @@ Czasem pracy poszczególnych typów maszyn dla różnych typów produktów w ka
\begin{displaymath} \begin{displaymath}
\mathbf{workTime[1]} = \mathbf{workTime[1]} =
\begin{pmatrix} \begin{pmatrix}
108 & 0 & 0 & 0 \\ 44 & 0 & 0 & 0 \\
54 & 0 & 0 & 114 \\ 22 & 0 & 0 & 66 \\
27 & 0 & 77 & 0 \\ 11 & 0 & 35 & 0 \\
16.2 & 0 & 0 & 9.5 \\ 6.6 & 0 & 0 & 5.5 \\
0 & 0 & 2.2 & 0 \\ 0 & 0 & 1 & 0 \\
\end{pmatrix}, \end{pmatrix},
\mathbf{workTime[2]} = \mathbf{workTime[2]} =
\begin{pmatrix} \begin{pmatrix}
280 & 162 & 0 & 0 \\ 96 & 18 & 0 & 0 \\
140 & 27 & 0 & 0 \\ 48 & 3 & 0 & 96 \\
70 & 0 & 350 & 0 \\ 24 & 0 & 140 & 0 \\
42 & 10.8 & 0 & 0 \\ 14.4 & 1.2 & 0 & 8 \\
0 & 13.5 & 10 & 0 \\ 0 & 1.5 & 4 & 0 \\
\end{pmatrix}, \end{pmatrix},
\end{displaymath} \end{displaymath}
\begin{displaymath} \begin{displaymath}
\mathbf{workTime[3]} = \mathbf{workTime[3]} =
\begin{pmatrix} \begin{pmatrix}
20 & 510 & 0 & 0 \\ 20 & 174 & 0 & 0 \\
10 & 85 & 0 & 222 \\ 10 & 29 & 0 & 126 \\
5 & 0 & 455 & 0 \\ 5 & 0 & 105 & 0 \\
3 & 34 & 0 & 18.5 \\ 3 & 11.6 & 0 & 10.5 \\
0 & 42.5 & 13 & 0 \\ 0 & 14.5 & 3 & 0 \\
\end{pmatrix} \end{pmatrix}
\end{displaymath} \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ć: W kontekście przyjętych w projekcie oznaczeń, wyrażenie definiujące miarę ryzyka przyjmuje następującą postać:
\begin{equation} \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} \end{equation}
\subsection{Model preferencji} \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}. 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!] \begin{figure}[ht!]
\centering \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} \caption{Obraz zbioru rozwiązań efektywnych w przestrzeni ryzyko-zysk}
\label{fig:profit-risk} \label{fig:profit-risk}
\end{figure} \end{figure}
@ -414,7 +415,7 @@ Na wykresie \ref{fig:profit-risk} żółtymi punktami wyznaczono rozwiązania ch
\hline \hline
& Miara zysku & Miara ryzyka \\ & Miara zysku & Miara ryzyka \\
\hline \hline
Maksymalizacja zysku & 26553.9 zł & 796.113\\ Maksymalizacja zysku & 9515.80 zł & 360.18\\
Minimalizacja ryzyka & -600.00 zł & 0.0 zł \\ Minimalizacja ryzyka & -600.00 zł & 0.0 zł \\
\hline \hline
@ -435,19 +436,24 @@ W celu analizy dominacji stochastycznej pierwszego rzędu (FSD) wybrano 3 rozwi
\hline \hline
& A & B & C \\ & A & B & C \\
\hline \hline
Ograniczenie minimalnego zysku & 25488.1 zł & 26020.5 zł & 26552.9 zł\\ Ograniczenie minimalnego zysku & 8450.97 zł & 8983.38 zł & 9515.79 zł\\
Średni zysk & 25488.3 zł & 26020.6 zł & 26553.9\\ Średni zysk & 8451.02 zł & 8983.40 zł & 9515.80\\
Miara ryzyka & 755.133 zł & 774.872 zł & 796.113\\ Miara ryzyka & 306.38 zł & 332.93 zł & 360.18\\
\hline \hline
\end{tabular} \end{tabular}
\end{table} \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!] \begin{figure}[ht!]
\centering \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} \caption{Odwrotna dystrybuanta rozkładu średniego zysku między scenariuszami}
\label{fig:FSD-profit} \label{fig:FSD-profit}
\end{figure} \end{figure}
@ -456,34 +462,10 @@ Rysunek \ref{fig:FSD-risk} przedstawia odwrotną dystrybuantę rozkładu średni
\begin{figure}[ht!] \begin{figure}[ht!]
\centering \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} \caption{Odwrotna dystrybuanta rozkładu średniej różnicy Giniego między scenariuszami}
\label{fig:FSD-risk} \label{fig:FSD-risk}
\end{figure} \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} \end{document}

View File

@ -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)}")

View File

@ -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}")

View File

@ -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}")

View File

@ -5,26 +5,26 @@
*********************************************/ *********************************************/
/***************PARAMETRY********************/ /***************PARAMETRY********************/
nMachType = 5; //ilosc typow maszun numberOfMachineTypes = 5; //ilosc typow maszun
nMonth = 3; //ilosc symulowanych miesiecy numberOfMonths = 3; //ilosc symulowanych miesiecy
nProdType = 4; //ilosc typow produktow numberOfProductsTypes = 4; //ilosc typow produktow
nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 numberOfHoursInFactory = 384; //liczba godzin roboczych w miesiacu 2*8*24=384
nScenarios = 1000; //ilosc scenariuszy w symulacji numberOfScenarios = 1000; //ilosc scenariuszy w symulacji
// Ilosc maszyn poszczegolnych typow // Ilosc maszyn poszczegolnych typow
machineCount = [4 2 3 1 1]; machineCount = [4 2 3 1 1];
// Koszty wykorzystania typow maszyn (wiersze) // Koszty wykorzystania typow maszyn (wiersze)
//w wytwarzaniu poszczegolnych typow produktow (kolumny) //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.2 0.1 0 0.6]
[ 0.1 0 0.7 0] [ 0.1 0 0.7 0]
[ 0.06 0.04 0 0.05] [ 0.06 0.04 0 0.05]
[ 0 0.05 0.02 0]]; [ 0 0.05 0.02 0]];
// Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz) // Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz)
maxInMonth = [[ 200 0 100 200] maxProductsInMonth = [[ 200 0 100 200]
[ 300 100 200 200] [ 300 100 200 200]
[ 0 300 100 200]]; [ 0 300 100 200]];

View File

@ -8,23 +8,23 @@
//Paramatry zostaladniej opisane w pliku .dat oraz raporcie //Paramatry zostaladniej opisane w pliku .dat oraz raporcie
// Parametry liczbowe // Parametry liczbowe
int nMachType = ...; int numberOfMachineTypes = ...;
int nMonth = ...; int numberOfMonths = ...;
int nProdType = ...; int numberOfProductsTypes = ...;
int nHours = ...; int numberOfHoursInFactory = ...;
int nScenarios = ...; int numberOfScenarios = ...;
// Utworzenie wektorow indeksujacych // Utworzenie wektorow indeksujacych
{int} machines = asSet(1..nMachType); {int} machines = asSet(1..numberOfMachineTypes);
{int} months = asSet(1..nMonth); {int} months = asSet(1..numberOfMonths);
{int} products = asSet(1..nProdType); {int} products = asSet(1..numberOfProductsTypes);
{int} scenarios = asSet(1..nScenarios); {int} scenarios = asSet(1..numberOfScenarios);
//Parametry produkcji i sprzedazy //Parametry produkcji i sprzedazy
int machineCount[machines] = ...; int machineCount[machines] = ...;
float prodTime[machines][products] = ...; float timeToProduce[machines][products] = ...;
int maxInMonth[months][products] = ...; int maxProductsInMonth[months][products] = ...;
//Parametry magazynowania //Parametry magazynowania
int storageMax[products] = ...; 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) 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); (sell[m][p]*sellProfit[i][p]-lowerProfit[i][m][p]- stock[m][p]*storageCost);
// wartosc oczekiwana zysku policzona jako srednia // 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 // funkcja celu
maximize avgProfit; maximize avgProfit;
@ -75,20 +75,20 @@ subject to {
} }
// Ogranicznie czasu produkcji maszyn w miesiacu // Ogranicznie czasu produkcji maszyn w miesiacu
forall(m in months, mc in machines) { 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 // Ograniczenie definiujace wykorzystany czas pracy maszyn
forall(m in months, p in products, mc in machines) { 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 // Ogranicznie maksymalnej pojemnosci rynku
forall(m in months, p in products) { 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 // Ogranicznie ustawiajace zmienna binarna po przekroczeniu 80 procent pojemnosci rynku
forall(m in months, p in products) { forall(m in months, p in products) {
sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p]; sell[m][p] <= 0.8*maxProductsInMonth[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] * if80prec[m][p];
} }
// Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu // Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu
forall (i in scenarios,m in months, p in products) { forall (i in scenarios,m in months, p in products) {

View File

@ -5,26 +5,26 @@
*********************************************/ *********************************************/
/***************PARAMETRY********************/ /***************PARAMETRY********************/
nMachType = 5; //ilosc typow maszun numberOfMachineTypes = 5; //ilosc typow maszun
nMonth = 3; //ilosc symulowanych miesiecy numberOfMonths = 3; //ilosc symulowanych miesiecy
nProdType = 4; //ilosc typow produktow numberOfProductsTypes = 4; //ilosc typow produktow
nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 numberOfHoursInFactory = 384; //liczba godzin roboczych w miesiacu 2*8*24=384
nScenarios = 30; //ilosc scenariuszy w symulacji numberOfScenarios = 30; //ilosc scenariuszy w symulacji
// Ilosc maszyn poszczegolnych typow // Ilosc maszyn poszczegolnych typow
machineCount = [4 2 3 1 1]; machineCount = [4 2 3 1 1];
// Koszty wykorzystania typow maszyn (wiersze) // Koszty wykorzystania typow maszyn (wiersze)
//w wytwarzaniu poszczegolnych typow produktow (kolumny) //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.2 0.1 0 0.6]
[ 0.1 0 0.7 0] [ 0.1 0 0.7 0]
[ 0.06 0.04 0 0.05] [ 0.06 0.04 0 0.05]
[ 0 0.05 0.02 0]]; [ 0 0.05 0.02 0]];
// Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz) // Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz)
maxInMonth = [[ 200 0 100 200] maxProductsInMonth = [[ 200 0 100 200]
[ 300 100 200 200] [ 300 100 200 200]
[ 0 300 100 200]]; [ 0 300 100 200]];

View File

@ -8,23 +8,23 @@
//Paramatry zostaladniej opisane w pliku .dat oraz raporcie //Paramatry zostaladniej opisane w pliku .dat oraz raporcie
// Parametry liczbowe // Parametry liczbowe
int nMachType = ...; int numberOfMachineTypes = ...;
int nMonth = ...; int numberOfMonths = ...;
int nProdType = ...; int numberOfProductsTypes = ...;
int nHours = ...; int numberOfHoursInFactory = ...;
int nScenarios = ...; int numberOfScenarios = ...;
// Utworzenie wektorow indeksujacych // Utworzenie wektorow indeksujacych
{int} machines = asSet(1..nMachType); {int} machines = asSet(1..numberOfMachineTypes);
{int} months = asSet(1..nMonth); {int} months = asSet(1..numberOfMonths);
{int} products = asSet(1..nProdType); {int} products = asSet(1..numberOfProductsTypes);
{int} scenarios = asSet(1..nScenarios); {int} scenarios = asSet(1..numberOfScenarios);
//Parametry produkcji i sprzedazy //Parametry produkcji i sprzedazy
int machineCount[machines] = ...; int machineCount[machines] = ...;
float prodTime[machines][products] = ...; float timeToProduce[machines][products] = ...;
int maxInMonth[months][products] = ...; int maxProductsInMonth[months][products] = ...;
//Parametry magazynowania //Parametry magazynowania
int storageMax[products] = ...; 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); (sell[m][p]*sellProfit[i][p]-lowerProfit[i][m][p]- stock[m][p]*storageCost);
// wartosc oczekiwana zysku policzona jako srednia // 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 // RYZYKO zdefiniowane srednia roznica Giniego
dexpr float giniRisk = sum (t1 in scenarios, t2 in scenarios ) ( 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 // funkcja celu
@ -82,20 +82,20 @@ subject to {
} }
// Ogranicznie czasu produkcji maszyn w miesiacu // Ogranicznie czasu produkcji maszyn w miesiacu
forall(m in months, mc in machines) { 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 // Ograniczenie definiujace wykorzystany czas pracy maszyn
forall(m in months, p in products, mc in machines) { 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 // Ogranicznie maksymalnej pojemnosci rynku
forall(m in months, p in products) { 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 // Ogranicznie ustawiajace zmienna binarna po przekroczeniu 80 procent pojemnosci rynku
forall(m in months, p in products) { forall(m in months, p in products) {
sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p]; sell[m][p] <= 0.8*maxProductsInMonth[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] * if80prec[m][p];
} }
// Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu // Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu
forall (i in scenarios,m in months, p in products) { forall (i in scenarios,m in months, p in products) {

View File

@ -5,26 +5,26 @@
*********************************************/ *********************************************/
/***************PARAMETRY********************/ /***************PARAMETRY********************/
nMachType = 5; //ilosc typow maszun numberOfMachineTypes = 5; //ilosc typow maszun
nMonth = 3; //ilosc symulowanych miesiecy numberOfMonths = 3; //ilosc symulowanych miesiecy
nProdType = 4; //ilosc typow produktow numberOfProductsTypes = 4; //ilosc typow produktow
nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 numberOfHoursInFactory = 384; //liczba godzin roboczych w miesiacu 2*8*24=384
nScenarios = 30; //ilosc scenariuszy w symulacji numberOfScenarios = 30; //ilosc scenariuszy w symulacji
// Ilosc maszyn poszczegolnych typow // Ilosc maszyn poszczegolnych typow
machineCount = [4 2 3 1 1]; machineCount = [4 2 3 1 1];
// Koszty wykorzystania typow maszyn (wiersze) // Koszty wykorzystania typow maszyn (wiersze)
//w wytwarzaniu poszczegolnych typow produktow (kolumny) //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.2 0.1 0 0.6]
[ 0.1 0 0.7 0] [ 0.1 0 0.7 0]
[ 0.06 0.04 0 0.05] [ 0.06 0.04 0 0.05]
[ 0 0.05 0.02 0]]; [ 0 0.05 0.02 0]];
// Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz) // Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz)
maxInMonth = [[ 200 0 100 200] maxProductsInMonth = [[ 200 0 100 200]
[ 300 100 200 200] [ 300 100 200 200]
[ 0 300 100 200]]; [ 0 300 100 200]];

View File

@ -8,23 +8,23 @@
//Paramatry zostaladniej opisane w pliku .dat oraz raporcie //Paramatry zostaladniej opisane w pliku .dat oraz raporcie
// Parametry liczbowe // Parametry liczbowe
int nMachType = ...; int numberOfMachineTypes = ...;
int nMonth = ...; int numberOfMonths = ...;
int nProdType = ...; int numberOfProductsTypes = ...;
int nHours = ...; int numberOfHoursInFactory = ...;
int nScenarios = ...; int numberOfScenarios = ...;
// Utworzenie wektorow indeksujacych // Utworzenie wektorow indeksujacych
{int} machines = asSet(1..nMachType); {int} machines = asSet(1..numberOfMachineTypes);
{int} months = asSet(1..nMonth); {int} months = asSet(1..numberOfMonths);
{int} products = asSet(1..nProdType); {int} products = asSet(1..numberOfProductsTypes);
{int} scenarios = asSet(1..nScenarios); {int} scenarios = asSet(1..numberOfScenarios);
//Parametry produkcji i sprzedazy //Parametry produkcji i sprzedazy
int machineCount[machines] = ...; int machineCount[machines] = ...;
float prodTime[machines][products] = ...; float timeToProduce[machines][products] = ...;
int maxInMonth[months][products] = ...; int maxProductsInMonth[months][products] = ...;
//Parametry magazynowania //Parametry magazynowania
int storageMax[products] = ...; 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); (sell[m][p]*sellProfit[i][p]-lowerProfit[i][m][p]- stock[m][p]*storageCost);
// wartosc oczekiwana zysku policzona jako srednia // 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 // RYZYKO zdefiniowane srednia roznica Giniego
dexpr float giniRisk = sum (t1 in scenarios, t2 in scenarios ) ( 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 // funkcja celu
@ -85,20 +85,20 @@ subject to {
} }
// Ogranicznie czasu produkcji maszyn w miesiacu // Ogranicznie czasu produkcji maszyn w miesiacu
forall(m in months, mc in machines) { 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 // Ograniczenie definiujace wykorzystany czas pracy maszyn
forall(m in months, p in products, mc in machines) { 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 // Ogranicznie maksymalnej pojemnosci rynku
forall(m in months, p in products) { 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 // Ogranicznie ustawiajace zmienna binarna po przekroczeniu 80 procent pojemnosci rynku
forall(m in months, p in products) { forall(m in months, p in products) {
sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p]; sell[m][p] <= 0.8*maxProductsInMonth[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] * if80prec[m][p];
} }
// Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu // Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu
forall (i in scenarios,m in months, p in products) { forall (i in scenarios,m in months, p in products) {

View File

@ -5,26 +5,26 @@
*********************************************/ *********************************************/
/***************PARAMETRY********************/ /***************PARAMETRY********************/
nMachType = 5; //ilosc typow maszun numberOfMachineTypes = 5; //ilosc typow maszun
nMonth = 3; //ilosc symulowanych miesiecy numberOfMonths = 3; //ilosc symulowanych miesiecy
nProdType = 4; //ilosc typow produktow numberOfProductsTypes = 4; //ilosc typow produktow
nHours = 384; //liczba godzin roboczych w miesiacu 2*8*24=384 numberOfHoursInFactory = 384; //liczba godzin roboczych w miesiacu 2*8*24=384
nScenarios = 30; //ilosc scenariuszy w symulacji numberOfScenarios = 30; //ilosc scenariuszy w symulacji
// Ilosc maszyn poszczegolnych typow // Ilosc maszyn poszczegolnych typow
machineCount = [4 2 3 1 1]; machineCount = [4 2 3 1 1];
// Koszty wykorzystania typow maszyn (wiersze) // Koszty wykorzystania typow maszyn (wiersze)
//w wytwarzaniu poszczegolnych typow produktow (kolumny) //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.2 0.1 0 0.6]
[ 0.1 0 0.7 0] [ 0.1 0 0.7 0]
[ 0.06 0.04 0 0.05] [ 0.06 0.04 0 0.05]
[ 0 0.05 0.02 0]]; [ 0 0.05 0.02 0]];
// Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz) // Pojemnosc rynku - typ produktu(kolumny) w miesiacu(wiersz)
maxInMonth = [[ 200 0 100 200] maxProductsInMonth = [[ 200 0 100 200]
[ 300 100 200 200] [ 300 100 200 200]
[ 0 300 100 200]]; [ 0 300 100 200]];

View File

@ -8,23 +8,23 @@
//Paramatry zostaladniej opisane w pliku .dat oraz raporcie //Paramatry zostaladniej opisane w pliku .dat oraz raporcie
// Parametry liczbowe // Parametry liczbowe
int nMachType = ...; int numberOfMachineTypes = ...;
int nMonth = ...; int numberOfMonths = ...;
int nProdType = ...; int numberOfProductsTypes = ...;
int nHours = ...; int numberOfHoursInFactory = ...;
int nScenarios = ...; int numberOfScenarios = ...;
// Utworzenie wektorow indeksujacych // Utworzenie wektorow indeksujacych
{int} machines = asSet(1..nMachType); {int} machines = asSet(1..numberOfMachineTypes);
{int} months = asSet(1..nMonth); {int} months = asSet(1..numberOfMonths);
{int} products = asSet(1..nProdType); {int} products = asSet(1..numberOfProductsTypes);
{int} scenarios = asSet(1..nScenarios); {int} scenarios = asSet(1..numberOfScenarios);
//Parametry produkcji i sprzedazy //Parametry produkcji i sprzedazy
int machineCount[machines] = ...; int machineCount[machines] = ...;
float prodTime[machines][products] = ...; float timeToProduce[machines][products] = ...;
int maxInMonth[months][products] = ...; int maxProductsInMonth[months][products] = ...;
//Parametry magazynowania //Parametry magazynowania
int storageMax[products] = ...; 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); (sell[m][p]*sellProfit[i][p]-lowerProfit[i][m][p]- stock[m][p]*storageCost);
// wartosc oczekiwana zysku policzona jako srednia // 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 // DODATKOWE OBLICZNIE RYZYKA DLA KAZDEGO SCENARIUSZA - POTRZEBNE DO ANALIZY FSD
dexpr float risk[i in scenarios] = sum (t in scenarios) ( 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 // RYZYKO zdefiniowane srednia roznica Giniego
dexpr float giniRisk = sum (t1 in scenarios, t2 in scenarios ) ( 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 // funkcja celu
@ -90,20 +90,20 @@ subject to {
} }
// Ogranicznie czasu produkcji maszyn w miesiacu // Ogranicznie czasu produkcji maszyn w miesiacu
forall(m in months, mc in machines) { 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 // Ograniczenie definiujace wykorzystany czas pracy maszyn
forall(m in months, p in products, mc in machines) { 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 // Ogranicznie maksymalnej pojemnosci rynku
forall(m in months, p in products) { 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 // Ogranicznie ustawiajace zmienna binarna po przekroczeniu 80 procent pojemnosci rynku
forall(m in months, p in products) { forall(m in months, p in products) {
sell[m][p] <= 0.8*maxInMonth[m][p] + 1000000 * if80prec[m][p]; sell[m][p] <= 0.8*maxProductsInMonth[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] * if80prec[m][p];
} }
// Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu // Ograniczenia linearyzujace wplyw zmiennej binarnej na funkcje celu
forall (i in scenarios,m in months, p in products) { forall (i in scenarios,m in months, p in products) {
@ -165,14 +165,14 @@ main {
i = 1;4 i = 1;4
fileProfit.writeln("avgProfit: "); fileProfit.writeln("avgProfit: ");
while (i<=data.nScenarios) { while (i<=data.numberOfScenarios) {
fileProfit.writeln(mod.profit[i]); fileProfit.writeln(mod.profit[i]);
i++; i++;
}; };
i = 1; i = 1;
fileRisk.writeln("Risk: "); fileRisk.writeln("Risk: ");
while (i<=data.nScenarios) { while (i<=data.numberOfScenarios) {
fileRisk.writeln(mod.risk[i]); fileRisk.writeln(mod.risk[i]);
i++; i++;
}; };
@ -197,14 +197,14 @@ main {
i = 1; i = 1;
fileProfit.writeln("avgProfit: "); fileProfit.writeln("avgProfit: ");
while (i<=data.nScenarios) { while (i<=data.numberOfScenarios) {
fileProfit.writeln(mod.profit[i]); fileProfit.writeln(mod.profit[i]);
i++; i++;
}; };
i = 1; i = 1;
fileRisk.writeln("Risk: "); fileRisk.writeln("Risk: ");
while (i<=data.nScenarios) { while (i<=data.numberOfScenarios) {
fileRisk.writeln(mod.risk[i]); fileRisk.writeln(mod.risk[i]);
i++; i++;
}; };
@ -228,14 +228,14 @@ main {
i = 1; i = 1;
fileProfit.writeln("avgProfit: "); fileProfit.writeln("avgProfit: ");
while (i<=data.nScenarios) { while (i<=data.numberOfScenarios) {
fileProfit.writeln(mod.profit[i]); fileProfit.writeln(mod.profit[i]);
i++; i++;
}; };
i = 1; i = 1;
fileRisk.writeln("Risk: "); fileRisk.writeln("Risk: ");
while (i<=data.nScenarios) { while (i<=data.numberOfScenarios) {
fileRisk.writeln(mod.risk[i]); fileRisk.writeln(mod.risk[i]);
i++; i++;
}; };