feat: working on implementation3 mom

This commit is contained in:
Krzysztof R. 2024-01-23 22:19:11 +01:00
parent 003c013ef0
commit 8806e6adf8
24 changed files with 836 additions and 156 deletions

Binary file not shown.

View File

@ -0,0 +1,19 @@
#!/bin/bash
FILE="esej"
INTERVAL=2 # seconds between updates
PREV_COUNT=0
while true; do
pdflatex -interaction=nonstopmode $FILE.tex > /dev/null 2>&1
CURRENT_COUNT=$(pdftotext $FILE.pdf - | wc -m)
if [ "$CURRENT_COUNT" -ne "$PREV_COUNT" ]; then
clear
echo "Character count: $CURRENT_COUNT"
PREV_COUNT=$CURRENT_COUNT
fi
sleep $INTERVAL
done

BIN
NotProgramming/DPZ/esej.pdf Normal file

Binary file not shown.

View File

@ -0,0 +1,77 @@
\documentclass{article}[12pt]
\usepackage[T1]{fontenc}
\usepackage[polish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage[table]{xcolor}
\usepackage{enumitem}
\usepackage{tabularx}
\title{Doskonała Praca Zespołowa esej}
\author{Krzysztof Rudnicki, 307585}
\begin{document}
\definecolor{lightgreen}{rgb}{0.9, 1, 0.9}
\definecolor{lightred}{rgb}{1, 0.9, 0.9}
\maketitle
\paragraph{Wstęp}
W ramach tego eseju opiszę działanie zespołu zajmującego się zarządzaniem Kołem Naukowym Twórców Gier Polygon (dalej KNTG Polygon lub Polygon), największym studenckim kołem twórców gier w Polsce, którego byłem przez rok wiceprezesem i przez rok prezesem.
\paragraph{Zespół}
KNTG Polygon jest zarządzany przez dwie grupy w hierarchii: niższą i liczniejszą, tak zwanych „magów”. oraz wyższą i mniej liczną, tak zwaną „kapitułą”, istnieje również specjalna grupa „emerytowanych” magów oraz członków kapituły - valhalla, pełniąca właściwie tylko funkcję doradczą średnio na Polygonie jest aktywnych około 20-25 magów oraz 5-7 członków kapituły
\paragraph{Role}
\begin{itemize}
\item Socjal Media - Ta osoba zajmuje się tworzeniem treści na media społecznościowe koła - facebook, discord, twitter itp.
\item „Ogarniacz” w dniu wykładu - co tydzień w środę, koło spotyka się na wykładzie, ta osoba jest odpowiedzialna za zdobycie karty do sali, przygotowanie sprzętu do prezentacji oraz zapowiadanie kolejnych wykładowców
\item Rezerwacja barów - Po wykładach Polygon udaje się na integrację w liczbie około 30-50 osób, zadaniem tej osoby jest znalezienie i zarezerwowanie baru na tyle osób
\item Załatwianie wykładów - Kontaktuje się z wykładowcami, szuka potencjalnych wykładowców, ustala terminy wykładów
\item Nadzór projektów mentorskich - Polygon organizuje projekty gdzie w ciągu jednego semestru w grupie losowych osób tworzy się grę, ta osoba zajmuje się przydzielaniem osób do grup i odpowiadaniem na ich potrzeby
\item Wolontariusz - Koło organizuje Game Jamy - imprezy podczas których w ciągu 1-3 dni tworzy się grę, podstawą udanej organizacji jest praca wolontariuszy, przenoszenie rzeczy z miejsca na miejsce, sprzątanie, rozdawanie koszulek, pilnowanie wejśc i reagowanie na potrzeby uczestników
\item Organizator - Zajmuje się przydzielaniem i nadzorowaniem wolontariuszy
\item Prezes - Najważniesza osoba w kole, zajmuje się nadzorowaniem całego koła i kontaktami z uczelnią
\end{itemize}
\begin{figure}[h]
\caption{Uproszczona struktura Polygonu}
\includegraphics[width=\textwidth]{polygon_org.drawio.png}
\end{figure}
\paragraph{Struktura}
Pomimo podziału na magów, kapitułę i prezesa, struktura Polygonu jest bardzo płaska, każdy, również zwykły członek może wyjść z dowolną propozycją i bardzo często może ją od razu realizować, maksymalizuje to kreatywność, kosztem produktywności
\paragraph{Rozwój zespołu}
Zespół magów i kapituły jest już rozwinięty i nowi członkowie dołączają do niego poprzez integrację z obecnymi magami i członkami kapituły, pozwala to na bardzo naturalne integrowanie zamiast tworzenia zupełnie nowego zespołu co semestr.
\paragraph{Cel}
Celem koła jest jego rozwój na wszystkich płaszczyznach, tworzenia większych wydarzeń, zapraszania bardziej prestiżowych wykładowców, zbierania więcej ludzi na wykłady, tworzenie lepszych projektów mentorskich, konkretny plan na dany semestr ustala Kapituła.
\paragraph{Normy zespołowe}
Członkowie Polygonu ubierają się w lużny sposób, typowy dla branży programistycznej, nie ma narzuconego stylu ubierania się, komunikacja odbywa się na równej, przyjacielskiej zasadzie (domyślnie przechodzi się na „Ty”), unikalną cechą Polygonu jest posługiwanie się przede wszystkim pseudonimami (podobnymi do "nicków" z gier), jedyną narzuconą regułą jest właśnie potrzeba posiadania pseudonimu.
\paragraph{Integracja}
Co tydzień w środę po wykładzie następuje integracja nazywana „Piwem”, pomimo swojej nazwy można w niej uczestniczyć również nie pijąc piwa, przez wielu uczestników uważana za najważniejszą część spotkania, niektórzy chodzą tylko na piwo, poza tym Polygon organizuje również ogniska i game jamy. W obrębie kapituły oraz magów organizuje się również regularne spotkania
\begin{table}[h]
\caption{Porównanie mocnych i słabych stron Polygonu}
\centering
\begin{tabularx}{\textwidth}{|X|X|}
\hline
\cellcolor{lightgreen}\textbf{Mocne} & \cellcolor{lightred}\textbf{Słabe} \\ \hline
\begin{itemize}[leftmargin=*]
\item Brak konkurencji wewnątrz zespołu
\item Pozycja lidera - Prezesa
\item Szczera komunikacja
\item Dostęp do informacji
\item Szacunek
\item Przyjazna atmosfera
\item Dobre normy zespołowe
\item Dobre, sprawdzone metody integracji
\end{itemize} &
\begin{itemize}[leftmargin=*]
\item Często mało konkretne cele
\item Często brak jasności w podziale ról
\item Brak jakichkolwiek kosztów wejścia
\item Pełny wolontariat, często prowadzący do wyboru innych priorytetów przez członków zespołu
\item Powolna wymiana na średnim szczeblu (magów)
\item Brak zastosowania jakichkolwiek metod heurestycznych
\item Brak badania ról zadaniowych poszczególnych członków
\end{itemize} \\ \hline
\end{tabularx}
\label{table:comparison}
\end{table}
\end{document}

View File

@ -0,0 +1,31 @@
<mxfile host="app.diagrams.net" modified="2024-01-15T18:34:01.630Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" etag="xj5fHrKVoOuyaQVJKMTq" version="22.1.17" type="device">
<diagram id="prtHgNgQTEPvFCAcTncT" name="Page-1">
<mxGraphModel dx="1434" dy="830" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="H9RlH3mpdmWu4w8tDecj-2" value="Członek" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;" vertex="1" parent="1">
<mxGeometry x="414" y="330" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="H9RlH3mpdmWu4w8tDecj-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=16;" edge="1" parent="1" source="H9RlH3mpdmWu4w8tDecj-3" target="H9RlH3mpdmWu4w8tDecj-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="H9RlH3mpdmWu4w8tDecj-3" value="Mag" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;" vertex="1" parent="1">
<mxGeometry x="414" y="240" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="H9RlH3mpdmWu4w8tDecj-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=16;" edge="1" parent="1" source="H9RlH3mpdmWu4w8tDecj-4" target="H9RlH3mpdmWu4w8tDecj-3">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="H9RlH3mpdmWu4w8tDecj-4" value="Kapituła" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;" vertex="1" parent="1">
<mxGeometry x="414" y="150" width="120" height="60" as="geometry" />
</mxCell>
<mxCell id="H9RlH3mpdmWu4w8tDecj-6" value="Prezes" style="rounded=1;whiteSpace=wrap;html=1;fontSize=16;" vertex="1" parent="1">
<mxGeometry x="434" y="130" width="80" height="40" as="geometry" />
</mxCell>
<mxCell id="H9RlH3mpdmWu4w8tDecj-9" value="Valhalla" style="rounded=1;whiteSpace=wrap;html=1;dashed=1;fontSize=16;" vertex="1" parent="1">
<mxGeometry x="260" y="240" width="120" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,43 @@
data;
set Samochody := s1, s2, s3, s4, s5, s6, s7;
set Ladowarki := l1, l2, l3, l4;
param E :=
s1 l1 6 s1 l2 6 s1 l3 6 s1 l4 6
s2 l1 6 s2 l2 6 s2 l3 6 s2 l4 6
s3 l1 6 s3 l2 6 s3 l3 6 s3 l4 6
s4 l1 6 s4 l2 6 s4 l3 6 s4 l4 6
s5 l1 6 s5 l2 6 s5 l3 6 s5 l4 6
s6 l1 6 s6 l2 6 s6 l3 6 s6 l4 6
s7 l1 6 s7 l2 6 s7 l3 6 s7 l4 6 ;
param D :=
s1 l1 4 s1 l2 2 s1 l3 2 s1 l4 1
s2 l1 6 s2 l2 3 s2 l3 3 s2 l4 1.5
s3 l1 1 s3 l2 0.5 s3 l3 0.5 s3 l4 0.25
s4 l1 8 s4 l2 4 s4 l3 4 s4 l4 2
s5 l1 10 s5 l2 5 s5 l3 5 s5 l4 2.5
s6 l1 18 s6 l2 9 s6 l3 9 s6 l4 4.5
s7 l1 12 s7 l2 6 s7 l3 6 s7 l4 3;
param O :=
s1 10
s2 10
s3 12
s4 14
s5 12
s6 12
s7 10;
param Z :=
s1 25
s2 25
s3 50
s4 100
s5 25
s6 50
s7 100;
end;

View File

@ -4,122 +4,46 @@ set Ladowarki;
# 2. Parametery
# Najwczesniejszy mozliwy czas rozpoczecia ladowania samochodu s na ladowarce l
param E{s in Samochody, l in Ladowarki};
param E{s in Samochody};
# Czas ladowania samochodu s na ladowarce l
param D{s in Samochody, l in Ladowarki};
# Czas odjazdu samochodu s
param O{s in Samochody};
# Zysk z realizacji kursu przez samochd s
# Zysk z realizacji kursu przez samochod s
param Z{s in Samochody};
# Zmienna decyzyjna
# zmienna okreslajaca godzine rozpoczecia ladowania samochodu s na ladowarce l
var u{s in Samochody, l in Ladowarki}, >= 0, <= 24;
# zmienna okreslajaca godzine rozpoczecia ladowania samochodu s
var u{s in Samochody}, >= 0, <= 24;
# zmienna binarna okreslajaca czy kurs zostanie wykonany
var y{s in Samochody}, binary;
# zmienna binarna okreslajaca czy samochd i jest ladowany po samochodzie j na ladowarce l
var v{i in Samochody, j in Samochody, l in Ladowarki}, binary;
# zmienna binarna okreslajaca czy samochd s jest ladowany jako pierwszy na ladowarce l
var p{s in Samochody, l in Ladowarki}, binary;
# zmienna binarna okreslajacy czy samochd s jest ladowany na ladowarce l
# zmienna binarna okreslajaca czy samochod i jest ladowany po samochodzie j na ladowarce l
var v{i in Samochody, j in Samochody}, binary;
# zmienna binarna okreslajacy czy samochod s jest ladowany na ladowarce l
var k{s in Samochody, l in Ladowarki}, binary;
var z{i in Samochody, l in Ladowarki}, >= 0, <= 24;
var x{i in Samochody, j in Samochody, l in Ladowarki}, >= 0, <= 24;
var a{i in Samochody, l in Ladowarki}, >= 0, <= 24;
# a = (u[s, l] + D[s, l]) * k[s, l]
# Funkcja celu
maximize Q: sum {s in Samochody} y[s]*Z[s];
# Ograniczenia
subject to
# Samochd nie moze rozpoczac swojego ladownia przed najwczesniejszym mozliwym czasie ladowania.
Ogr_1{s in Samochody, l in Ladowarki}:
u[s,l] >= E[s, l];
# Samochd moze byc ladowany maksymalnie na jednej ladowarce
# Samochod nie moze rozpoczac swojego ladownia przed najwczesniejszym mozliwym czasie ladowania.
Ogr_1{s in Samochody}:
u[s] >= E[s] * y[s];
# Samochod moze byc ladowany maksymalnie na jednej ladowarce
Ogr_2{s in Samochody}:
sum {l in Ladowarki} k[s, l] = y[s];
# Ladowanie danego samochodu na danej ladowarce moze rozpoczac sie tylko po zakonczeniu poprzedniego ladowania.
Ogr_3{i in Samochody, j in Samochody, l in Ladowarki: (i != j)}:
z[i,l] >= x[i, j, l];
# k[i, l] * u[i, l] >= [u[j, l] + D[j, l]) * v[i, j, l])
Ogr_4{i in Samochody, l in Ladowarki}:
v[i, i, l] = 0;
# k[i, l] * u[i, l] >= [u[j, l] + D[j, l]) * v[i, j, l])
# Samochd realizujacy dostawe musi ukonczyc ladowanie przed godzina odjazdu
Ogr_3{i in Samochody, j in Samochody, l in Ladowarki: i != j}:
u[i] + 24 * (1 - v[i, j]) >= (u[j] + D[j, l]) - 48 * (2 - k[j, l] - k[i, l]);
Ogr_4{i in Samochody, j in Samochody, l in Ladowarki: i != j}:
v[i, j] + v[j, i] >= k[i, l] + k[j, l] - 1;
# Samochod realizujacy dostawe musi ukonczyc ladowanie przed godzina odjazdu
Ogr_5{s in Samochody}:
sum {l in Ladowarki} a[s, l] <= O[s];
# (u[s, l] + D[s, l]) * k[s, l] <= O[s];
Ogr_6{j in Samochody}:
sum {i in Samochody, l in Ladowarki} v[i, j, l] <= 1;
Ogr_7{i in Samochody}:
sum {j in Samochody, l in Ladowarki} v[i, j, l] <= 1;
# Samochd musi byc albo ladowany jako pierwszy albo byc ktryms w kolejnosci ladowania albo nie byc w ogle ladowanym.
Ogr_8{j in Samochody, l in Ladowarki}:
p[j, l] + sum {i in Samochody} v[i, j, l] = k[j, l];
# Samochd w danej kolejnosci, moze byc tylko raz na wszystkich ladowarkach
Ogr_9{l in Ladowarki}:
sum {s in Samochody} p[s, l] <= 1;
### Linearyzacja z
Ogr_z1{i in Samochody, l in Ladowarki}:
z[i,l] <= 24*k[i,l];
Ogr_z2{i in Samochody, l in Ladowarki}:
z[i,l] <= u[i,l];
Ogr_z3{i in Samochody, j in Samochody, l in Ladowarki}:
z[i,l] >= u[i,l]-24*(1-k[i,l]);
### Linearyzacja x
Ogr_x1{i in Samochody, j in Samochody, l in Ladowarki}:
x[i, j, l] <= 24*v[i, j, l];
Ogr_x2{i in Samochody, j in Samochody, l in Ladowarki}:
x[i, j, l] <= (u[j,l] + D[j, l]);
Ogr_x3{i in Samochody, j in Samochody, l in Ladowarki}:
x[i, j, l] >= (u[j,l] + D[j, l])-24*(1-v[i, j, l]);
### Linearyzacja a
Ogr_a1{s in Samochody, l in Ladowarki}:
a[s, l] <= 24*k[s, l];
Ogr_a2{s in Samochody, l in Ladowarki}:
a[s, l] <= (u[s, l] + D[s, l]);
Ogr_a3{s in Samochody, l in Ladowarki}:
a[s, l] >= (u[s, l] + D[s, l]) - 24*(1-k[s, l]);
u[s] + sum {l in Ladowarki} (D[s, l] * k[s, l]) <= O[s] * y[s];
solve;
display Q;
display {s in Samochody, l in Ladowarki: k[s, l] > 0}: u[s, l];
display {s in Samochody, l in Ladowarki: k[s, l] > 0}: u[s];
display {s in Samochody}: y[s];
display {i in Samochody, j in Samochody, l in Ladowarki: v[i, j, l] > 0}: v[i, j, l];
display {s in Samochody, l in Ladowarki}: k[s, l];
data;
set Samochody := s1, s2, s3, s4, s5;
set Ladowarki := l1, l2, l3;
param E :=
s1 l1 0 s1 l2 0 s1 l3 0
s2 l1 0 s2 l2 0 s2 l3 0
s3 l1 0 s3 l2 0 s3 l3 0
s4 l1 0 s4 l2 0 s4 l3 0
s5 l1 2 s5 l2 2 s5 l3 2;
param D :=
s1 l1 4 s1 l2 4 s1 l3 8
s2 l1 1 s2 l2 1 s2 l3 2
s3 l1 5 s3 l2 5 s3 l3 10
s4 l1 3 s4 l2 3 s4 l3 6
s5 l1 6 s5 l2 6 s5 l3 12;
param O :=
s1 8
s2 5
s3 6
s4 4
s5 9;
param Z :=
s1 100
s2 10
s3 200
s4 20
s5 330;
end;
display {i in Samochody, j in Samochody: v[i, j] > 0}: v[i, j];
display {s in Samochody, l in Ladowarki: k[s, l] > 0}: k[s, l];

View File

@ -9,7 +9,7 @@ param E{s in Samochody};
param D{s in Samochody, l in Ladowarki};
# Czas odjazdu samochodu s
param O{s in Samochody};
# Zysk z realizacji kursu przez samochód s
# Zysk z realizacji kursu przez samochod s
param Z{s in Samochody};
# Zmienna decyzyjna
@ -17,40 +17,29 @@ param Z{s in Samochody};
var u{s in Samochody}, >= 0, <= 24;
# zmienna binarna okreslajaca czy kurs zostanie wykonany
var y{s in Samochody}, binary;
# zmienna binarna okreslajaca czy samochód i jest ladowany po samochodzie j na ladowarce l
# zmienna binarna okreslajaca czy samochod i jest ladowany po samochodzie j na ladowarce l
var v{i in Samochody, j in Samochody}, binary;
# zmienna binarna okreslajacy czy samochód s jest ladowany na ladowarce l
# zmienna binarna okreslajacy czy samochod s jest ladowany na ladowarce l
var k{s in Samochody, l in Ladowarki}, binary;
# Funkcja celu
maximize Q: sum {s in Samochody} y[s]*Z[s];
# Ograniczenia
subject to
# Samochód nie moze rozpoczac swojego ladownia przed najwczesniejszym mozliwym czasie ladowania.
# Samochod nie moze rozpoczac swojego ladownia przed najwczesniejszym mozliwym czasie ladowania.
Ogr_1{s in Samochody}:
u[s] >= E[s] * y[s];
# Samochód moze byc ladowany maksymalnie na jednej ladowarce
# Samochod moze byc ladowany maksymalnie na jednej ladowarce
Ogr_2{s in Samochody}:
sum {l in Ladowarki} k[s, l] = y[s];
# Ladowanie danego samochodu na danej ladowarce moze rozpoczac sie tylko po zakonczeniu poprzedniego ladowania.
Ogr_3{i in Samochody, j in Samochody, l in Ladowarki: i != j}:
u[i] + 24 * (1 - v[i, j]) >= (u[j] + D[j, l] * v[i, j]);
# ???
u[i] + 24 * (1 - v[i, j]) >= (u[j] + D[j, l] - 2 * 24 * (2 = k[j, l] - k[i, l]);
Ogr_4{i in Samochody, j in Samochody, l in Ladowarki: i != j}:
v[i, j] + v[j, i] >= k[i, l] + k[j, l] - 1;
# Samochód realizujacy dostawe musi ukonczyc ladowanie przed godzina odjazdu
Ogr_6{s in Samochody}:
# Samochod realizujacy dostawe musi ukonczyc ladowanie przed godzina odjazdu
Ogr_5{s in Samochody}:
u[s] + sum {l in Ladowarki} (D[s, l] * k[s, l]) <= O[s] * y[s];
# Ladowanie samochodu nie bedzie nastepowalo po ladowaniu dowolnego samochodu wiecej niz raz na danej ladowarce
#Ogr_7_temp{j in Samochody}:
# sum {i in Samochody} v[i, j] <= 1;
# Ladowanie samochodu nie bedzie poprzedzalo ladowania dowolnego samochodu wiecej niz raz na danej ladowarce
#Ogr_8_temp{i in Samochody}:
# sum {j in Samochody} v[i, j] <= 1;
Ogr_temp:
u['s4'] = 0;
Ogr_temp_2:
k['s4', 'l2'] = 1;
solve;
display Q;
@ -58,39 +47,3 @@ display {s in Samochody, l in Ladowarki: k[s, l] > 0}: u[s];
display {s in Samochody}: y[s];
display {i in Samochody, j in Samochody: v[i, j] > 0}: v[i, j];
display {s in Samochody, l in Ladowarki: k[s, l] > 0}: k[s, l];
data;
set Samochody := s1, s2, s3, s4, s5;
set Ladowarki := l1, l2, l3;
param E :=
s1 0
s2 0
s3 0
s4 0
s5 2;
param D :=
s1 l1 4 s1 l2 4 s1 l3 8
s2 l1 1 s2 l2 1 s2 l3 2
s3 l1 5 s3 l2 5 s3 l3 10
s4 l1 3 s4 l2 3 s4 l3 6
s5 l1 6 s5 l2 6 s5 l3 12;
param O :=
s1 8
s2 5
s3 6
s4 4
s5 8;
param Z :=
s1 100
s2 10
s3 200
s4 20
s5 330;
end;

View File

@ -0,0 +1,50 @@
#1. Zbiory
set Samochody;
set Ladowarki;
set Kwanty; # 1 kwant czasu - 15 min = 1/4 h
# 2. Parametery
# Najwczesniejszy mozliwy czas rozpoczecia ladowania samochodu s na ladowarce l
param E{s in Samochody};
# Czas ladowania samochodu s na ladowarce l
param D{s in Samochody, l in Ladowarki};
# Czas odjazdu samochodu s
param O{s in Samochody};
# Zysk z realizacji kursu przez samochód s
param Z{s in Samochody};
# Zmienna decyzyjna
# zmienna binarna okreslajaca czy kurs zostanie wykonany
var y{s in Samochody}, binary;
# zmienna binarna okreslajaca czy samochód i jest ladowany na ladowarce l w kwancie czasu k
var v{i in Samochody, l in Ladowarki, k in Kwanty}, binary;
# zmienna służąca do minimalizowania ogolnego czasu ladowania w symulacji (na wszystkich ladowarkach)
var z;
maximize Q: sum {s in Samochody} y[s]*Z[s] - test * 0.01;
#3. Ograniczenia
subject to
# Samochód nie moze rozpoczac swojego ladownia przed najwczesniejszym mozliwym czasie ladowania.
Ogr_1{s in Samochody, l in Ladowarki, k in Kwanty}: #
v[s, l, k] * k >= E[s] * 4 * v[s, l, k];
# Ladowanie danego samochodu na danej ladowarce moze rozpoczac sie tylko po zakonczeniu poprzedniego ladowania.
Ogr_2{s in Samochody, k in Kwanty}:
sum {l in Ladowarki} v[s, l, k] <=1;
# Ladowanie danego samochodu na danej ladowarce moze rozpoczac sie tylko po zakonczeniu poprzedniego ladowania.
Ogr_3{l in Ladowarki, k in Kwanty}:
sum {s in Samochody} v[s, l, k] <=1;
# Uzależnienie k od v
Ogr_4{s in Samochody}:
sum {l in Ladowarki, k in Kwanty} v[s, l, k] * 1/(D[s, l]*4) >= y[s];
# Samochód realizujący dostawę musi ukończyć ładowanie przed godziną odjazdu
Ogr_5{s in Samochody, l in Ladowarki, k in Kwanty}:
v[s, l, k] * k <= (O[s]*4 -1) * y[s];
#
Ogr_6{s in Samochody, l in Ladowarki, k in Kwanty}:
z >= v[s, l, k] * k;
solve;
display Q;
display {s in Samochody}: y[s];
display {l in Ladowarki, s in Samochody, k in Kwanty}: v[s, l, k];

View File

@ -0,0 +1,35 @@
data;
set Samochody := s1, s2, s3, s4, s5;
set Ladowarki := l1, l2, l3;
param E :=
s1 0
s2 0
s3 0
s4 0
s5 2;
param D :=
s1 l1 4 s1 l2 4 s1 l3 8
s2 l1 1 s2 l2 1 s2 l3 2
s3 l1 5 s3 l2 5 s3 l3 10
s4 l1 3 s4 l2 3 s4 l3 6
s5 l1 6 s5 l2 6 s5 l3 12;
param O :=
s1 8
s2 5
s3 6
s4 4
s5 9;
param Z :=
s1 100
s2 10
s3 200
s4 20
s5 330;
end;

View File

@ -0,0 +1,96 @@
import pulp
import matplotlib.pyplot as plt
import sys
# Create a problem variable:
model = pulp.LpProblem("Optimal_Distribution", pulp.LpMinimize)
# Define providers (Factories and Warehouses)
factories = ['F1', 'F2']
warehouses = ['M1', 'M2', 'M3', 'M4']
providers = factories + warehouses # Combining both lists
# Define customers
customers = ['K1', 'K2', 'K3', 'K4', 'K5', 'K6']
cost = {
'F1': {'M1': 0.3, 'M2': 0.5, 'M3': 1.2, 'M4': 0.8, 'K1': 1.2, 'K2': 999, 'K3': 1.2, 'K4': 2.0, 'K5': 999, 'K6': 1.1},
'F2': {'M1': 999, 'M2': 0.4, 'M3': 0.5, 'M4': 0.3, 'K1': 1.8, 'K2': 999, 'K3': 999, 'K4': 999, 'K5': 999, 'K6': 999},
'M1': {'K1': 999, 'K2': 1.2, 'K3': 0.2, 'K4': 1.7, 'K5': 999, 'K6': 2.0},
'M2': {'K1': 1.4, 'K2': 0.3, 'K3': 1.8, 'K4': 1.3, 'K5': 0.5, 'K6': 999},
'M3': {'K1': 999, 'K2': 1.3, 'K3': 2.0, 'K4': 999, 'K5': 0.3, 'K6': 1.4},
'M4': {'K1': 999, 'K2': 999, 'K3': 0.4, 'K4': 2.0, 'K5': 0.5, 'K6': 1.6}
}
# Decision variables
x = pulp.LpVariable.dicts("x", [(i, j) for i in providers for j in customers], lowBound=0, cat='Integer')
y = pulp.LpVariable.dicts("y", [(i, k) for i in factories for k in warehouses], lowBound=0, cat='Integer')
# Objective function components
cost_distribution = pulp.lpSum([cost[i][j] * x[(i, j)] for i in providers for j in customers])
cost_warehouse = pulp.lpSum([cost[i][k] * y[(i, k)] for i in factories for k in warehouses])
alpha = 0.5
beta = 0.5
# Binary variables for meeting preferences
P = pulp.LpVariable.dicts("P", [(i, j) for i in providers for j in customers], cat='Binary')
max_order = 60
satisfaction_scores = {'K1': 50 / max_order, 'K2': 10 / max_order, 'K3': 40 / max_order, 'K4': 35 / max_order, 'K5': 60 / max_order, 'K6': 20 / max_order}
customer_preferences = {'K1': ['F2'], 'K2': ['M1'], 'K3': ['M2', 'M3'], 'K4': ['F1'], 'K5': [], 'K6': ['M3', 'M4']}
# Satisfaction component
satisfaction_component = pulp.lpSum([satisfaction_scores[j] * P[(i, j)] for i in providers for j in customers])
# Define objective
model += alpha * (cost_distribution + cost_warehouse) - beta * satisfaction_component
# Factory production capacity constraints
factory_capacity = {'F1': 150, 'F2': 200}
warehouse_capacity = {'M1': 70, 'M2': 50 , 'M3': 100, 'M4': 40 }
customer_demand = {'K1': 50, 'K2': 10, 'K3': 40, 'K4': 35, 'K5': 60, 'K6': 20}
for i in factories:
model += pulp.lpSum([x[(i, j)] for j in customers] + [y[(i, k)] for k in warehouses]) <= factory_capacity[i]
# Warehouse handling capacity constraints
for k in warehouses:
model += pulp.lpSum([x[(k, j)] for j in customers]) <= warehouse_capacity[k]
# Customer demand fulfillment constraints
for j in customers:
model += pulp.lpSum([x[(i, j)] for i in providers]) == customer_demand[j]
# Other constraints like preferences can be added similarly
# Solve the problem
# Output results
for v in model.variables():
print(v.name, "=", v.varValue)
# Assuming definitions of the model as previously discussed
cost_results = []
satisfaction_results = []
# Varying alpha and beta
for alpha in range(10):
beta = 10 - alpha + sys.float_info.epsilon
alpha /= 10.0
beta /= 10.0
# Update objective function
model.objective = alpha * cost_distribution - beta * satisfaction_component
# Solve the model
model.solve()
print(alpha)
# Record the results
# Record the results
total_cost = pulp.value(cost_distribution)
total_satisfaction = pulp.value(satisfaction_component)
cost_results.append(total_cost)
satisfaction_results.append(total_satisfaction)
print(cost_results, satisfaction_results)
# Plotting the results
plt.plot(cost_results, satisfaction_results, marker='o')
plt.xlabel('Total Cost')
plt.ylabel('Customer Satisfaction')
plt.title('Trade-off between Cost and Customer Satisfaction')
plt.show()

Binary file not shown.

View File

@ -0,0 +1,198 @@
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[polish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{listings}
\title{Modelowanie Matematyczne, Projekt 3, Dane nr 1.6}
\author{Krzysztof Rudnicki, 307585}
\setcounter{section}{-1}
\begin{document}
\maketitle
\section{Wstęp}
2 Fabryki, F1, F2 \\
4 Magazyny, M1, M2, M3, M4 \\
6 Klientów, K1, K2, K3, K4, K5, K6 \\
\paragraph{Koszty dystrybucji towaru}
\begin{center}
\begin{tabular}{ | c | c | c | c | c | c | c | }
\hline
zaopatruje & F1 & F2 & M1 & M2 & M3 & M4 \\
\hline
Magazyny & & & & & & \\
\hline
M1 & 0.3 & - & & & & \\
\hline
M2 & 0.5 & 0.4 & & & & \\
\hline
M3 & 1.2 & 0.5 & & & & \\
\hline
M4 & 0.8 & 0.3 & & & & \\
\hline
Klientów & & & & & & \\
\hline
K1 & 1.2 & 1.8 & - & 1.4 & - & - \\
\hline
K2 & - & - & 1.2 & 0.3 & 1.3 & - \\
\hline
K3 & 1.2 & - & 0.2 & 1.8 & 2.0 & 0.4 \\
\hline
K4 & 2.0 & - & 1.7 & 1.3 & - & 2.0 \\
\hline
K5 & - & - & - & 0.5 & 0.3 & 0.5 \\
\hline
K6 & 1.1 & - & 2.0 & - & 1.4 & 1.5 \\
\hline
\end{tabular}
\end{center}
\section{Model Dwukryterialny}
\paragraph{Zbiory}
\begin{itemize}
\item $i, k \in F$ - Fabryki
\item $i, l \in M$ - Magazyny
\item $j \in K$ - Klienci
\end{itemize}
\paragraph{Parametery}
\begin{itemize}
\item $C_{i, j}$ - Koszty transportu dóbr z punktów $i$ (fabryka lub magazyn) do klienta $j$
\item $C_{k, l}$ - Koszty transportu dóbr z fabryki $i$ do magazynu $k$
\item $P_{i, j}$ - Binarnie określa czy preferencja klienta zostąła spełniona (1) czy nie (0)
\item $S_j$ - Poziom satysfakcji klienta $j$
\item $D_j$ - Zapotrzebowanie klienta $j$
\end{itemize}
\paragraph{Zmienne decyzyjne}
\begin{itemize}
\item $x_{i,j}$ - Liczba dóbr (w tys. ton) przetransportowana z punktu $i$ (fabryka lub magazyn) do klienta $j$
\item $y_{k, l}$ - Liczba dóbr (w tys. ton) przetransportowana z fabryki $k$ do magazynu $l$
\end{itemize}
\paragraph{Funkcja celu}
\begin{enumerate}
\item Minimalizacja kosztów dystrybucji \\
\[ Min(\sum_{i, j} C_{i, j} * x_{i, j} + \sum{i, k} C_{i, k} * y_{i, k}) \]
\item Maksymalizacja satysfakcja klienta \\
W celu maksymalizacji satysfakcji klienta policzymy ile z dostaw do klientów odbyło się z preferencyjnych źródeł \\
\[ Max(\sum_{j} S_j * P_{i,j} * x_{i, j}) \]
\end{enumerate}
\paragraph{Ograniczenia}
Miesięczne możliwości produkcyjne fabryk
\begin{equation}
\sum_j x_{F1, j} + \sum_k y_{F1, k} \leq 150
\end{equation}
\begin{equation}
\sum_j x_{F2, j} + \sum_k y_{F2, k} \leq 200
\end{equation}
Miesięczna ilośc obsługiwanego towaru przez magazyny
\begin{equation}
\sum_j x_{M1, j} \leq 70
\end{equation}
\begin{equation}
\sum_j x_{M2, j} \leq 50
\end{equation}
\begin{equation}
\sum_j x_{M3, j} \leq 100
\end{equation}
\begin{equation}
\sum_j x_{M4, j} \leq 40
\end{equation}
Spełnienie preferencji klienta
\begin{equation}
\sum_i x_{i, j} = D_j
\end{equation}
Wartości niezerowe
\begin{equation}
x_{i, j}, y_{i, k} \geq 0
\end{equation}
\section{Implementacja}
Do implementacji użyty został python z biblioteką pulp \href{https://coin-or.github.io/pulp/index.html}{https://coin-or.github.io/pulp/index.html} \\
Dzięki temu wykorzystujemy zarówno łatwość pythona jak i możliwości używania różnych solverów (CBC, GLPK, CPLEX, Gurobi...) przez pulpa \\
\begin{lstlisting}[language=Python, caption={Import bilbioteki pulp}]
import pulp
\end{lstlisting}
\begin{lstlisting}[language=Python, caption={Iniicjalizacja modelu}]
model = pulp.LpProblem("Optimal_Distribution", pulp.LpMinimize)
\end{lstlisting}
\begin{lstlisting}[language=Python, caption={Zmienne decyzyjne}]
x =
pulp.LpVariable.dicts("x",
[(i, j) for i in punkty for j in klienci],
lowBound=0,
cat='Integer')
y
pulp.LpVariable.dicts("y",
[(i, k) for i in fabryki for k in magazyny],
lowBound=0,
cat='Integer')
\end{lstlisting}
\begin{lstlisting}[language=Python, caption={Funkcje celu}]
# Objective function components
koszt_dystrybucji =
pulp.lpSum(
[cost[i][j] * x[(i, j)] for i in punkty for j in klienci]
)
koszt_magazynowania =
pulp.lpSum(
[cost[i][k] * y[(i, k)] for i in fabryki for k in magazyny]
)
# Define objective
model +=
alpha
* (koszt_dystrybucji + koszt_magazynowania)
- beta * poziom_satysfakcji
\end{lstlisting}
\begin{lstlisting}[language=Python, caption={Ograniczenia}]
for i in fabryki:
model +=
pulp.lpSum([x[(i, j)] for j in klienci]
+ [y[(i, k)] for k in magazyny])
<= mozliwosci_fabryki[i]
for k in magazyny:
model +=
pulp.lpSum([x[(k, j)] for j in klienci])
<= mozliwosci_magazynu[k]
for j in klienci:
model +=
pulp.lpSum([x[(i, j)] for i in punkty]) == wymagania_klienta[j]
\end{lstlisting}
\begin{lstlisting}[language=Python, caption={Rozwiązanie problemu}]
model.solve()
\end{lstlisting}
\
\begin{lstlisting}[language=Python, caption={Przedstawienie wyników}]
for v in model.variables():
print(v.name, "=", v.varValue)
\end{lstlisting}
\section{Rozwiązanie efektywne}
Aby zdefiniować rozwiązanie efektywne sprawdzamy sumaryczy obu funkcji celu dla wartości $\alpha$ i $beta$ od 1 do 10 \\
w tym celu napisany został kod który modyfikuje wartości $\alpha$ i $\beta$ w pętli
\begin{lstlisting}[language=Python, caption={Wyznaczanie alpha i beta}]
# Varying alpha and beta
for alpha in range(0, 11):
beta = 10 - alpha
alpha /= 10.0
beta /= 10.0
# Update objective function
model.objective = alpha * cost_distribution - beta * satisfaction_component
# Solve the model
model.solve()
# Record the results
total_cost = value(cost_distribution)
total_satisfaction = value(satisfaction_component)
cost_results.append(total_cost)
satisfaction_results.append(total_satisfaction)
\end{lstlisting}
\end{document}

View File

View File

@ -0,0 +1,47 @@
# Model szeregowania zada� podzielnych na m procesorach r�wnoleg�ych
# Faza I
#======================================================================
set Procesory;
set Zadania;
#set ZadaniaSpec;
#======================================================================
param Czas_wyk{Procesory, Zadania} >= 0;
# Wymiar tabeli i kolumna z której bÄ™dziemy czytać wartoÅci
table T_Czas_wyk IN "CSV" "Czas_wyk.csv":
[Procesor, Zadanie], Czas_wyk~Czas_wyk;
#======================================================================
var Tmax >= 0;
var t{Procesory, Zadania}>=0;
#======================================================================
minimize FC_Czas_obslugi:
Tmax;
#======================================================================
subject to
Ogr_Praca_procesora{l in Procesory}:
sum {i in Zadania} t[l,i]<=Tmax;
Ogr_Obsluga_zadania{i in Zadania}:# i not in ZadaniaSpec}:
sum{l in Procesory} t[l,i]<=Tmax;
Ogr_Rozdzial_zadan{i in Zadania}:#i not in ZadaniaSpec}:
sum{l in Procesory} (t[l,i]/Czas_wyk[l,i])=1;
solve;
#printf ";;;;%s;%s\n", 'Data', time2str(gmtime()+2*3600,'%F %H:%M') >> "FazaIout.csv";
#printf ";;%s;%3.1f", 'Tmin', Tmax >> "FazaIout.csv";
printf "Procesor,Zadanie,t" >> "FazaIout.csv";
for {l in Procesory, i in Zadania} {
printf "\n%s,%s,%3.1f", l, i, round(t[l,i],3)>> "FazaIout.csv";
}
display{l in Procesory, i in Zadania: t[l,i]>0}: l, i, round(t[l,i],3);
#======================================================================
end;

View File

@ -0,0 +1,44 @@
#======================================================================
set Procesory;
set Zadania;
#set ZadaniaSpec;
#======================================================================
param Czas_wyk{Procesory, Zadania} >= 0;
table T_Czas_wyk IN "CSV" "Czas_wyk.csv":
[Procesor, Zadanie], Czas_wyk~Czas_wyk;
#======================================================================
var Tmax >= 0;
var t{Procesory, Zadania}>=0;
#======================================================================
minimize FC_Czas_obslugi:
Tmax;
#======================================================================
subject to
Ogr_Praca_procesora{l in Procesory}:
sum {i in Zadania} t[l,i]<=Tmax;
Ogr_Obsluga_zadania{i in Zadania}:# i not in ZadaniaSpec}:
sum{l in Procesory} t[l,i]<=Tmax;
Ogr_Rozdzial_zadan{i in Zadania}:#i not in ZadaniaSpec}:
sum{l in Procesory} (t[l,i]/Czas_wyk[l,i])=1;
solve;
#printf ";;;;%s;%s\n", 'Data', time2str(gmtime()+2*3600,'%F %H:%M') >> "FazaIout.csv";
#printf ";;%s;%3.1f\n", 'Tmin', Tmax >> "FazaIout.csv";
printf "Procesor,Zadanie,t" >> "FazaIout.csv";
for {l in Procesory, i in Zadania} {
printf "\n%s,%s,%3.1f", l, i, round(t[l,i],3)>> "FazaIout.csv";
}
display{l in Procesory, i in Zadania: t[l,i]>0}: l, i, round(t[l,i],3);
#======================================================================
end;

View File

@ -0,0 +1,14 @@
data;
set Procesory := ProcA ProcB ProcC;
set Zadania := z1 z2 z3 z4 z5 z6;
#set ZadaniaSpec := z3 z5;
# Define 2D array time[Procesory, Zadania]
param time :=
ProcA z1 5 ProcA z2 7 ProcA z3 9 ProcA z4 2 ProcA z5 4 ProcA z6 1
ProcB z1 3 ProcB z2 6 ProcB z3 1 ProcB z4 8 ProcB z5 2 ProcB z6 3
ProcC z1 4 ProcC z2 5 ProcC z3 6 ProcC z4 7 ProcC z5 3 ProcC z6 2
;
end;

View File

@ -0,0 +1,14 @@
data;
set Procesory := ProcA ProcB ProcC;
set Zadania := z1 z2 z3 z4 z5 z6;
#set ZadaniaSpec := z3 z5;
# Define 2D array time[Procesory, Zadania]
param Pracownik :=
ProcA z1 2 ProcA z2 2 ProcA z3 2 ProcA z4 1 ProcA z5 1 ProcA z6 2
ProcB z1 1 ProcB z2 1 ProcB z3 2 ProcB z4 2 ProcB z5 2 ProcB z6 1
ProcC z1 2 ProcC z2 2 ProcC z3 3 ProcC z4 2 ProcC z5 1 ProcC z6 2
;
end;

View File

@ -0,0 +1,8 @@
param Pracownik{Procesory, Zadania} >=0;
param Pracownik : ProcA ProcB ProcC:=
z1 2 1 2
z2 2 1 2
z3 2 2 3
z4 1 2 2
z5 1 2 1
z6 2 1 2;

View File

@ -0,0 +1,18 @@
set ORIG;
set DEST;
param LINKS{ORIG, DEST} default 0;
for {i in ORIG, j in DEST} printf "LINKS[%s,%s] = %g \n",i,j,LINKS[i,j];
data;
set ORIG := GARY CLEV PITT;
set DEST := FRA DET LAN WIN STL FRE LAF;
param LINKS : FRA DET LAN WIN STL FRE LAF :=
GARY 1 2 3 4 5 6 .
CLEV . 2 . 4 . 6 .
PITT 1 2 3 4 5 6 7;
end;

View File

@ -0,0 +1,43 @@
# 1. Zbiory
set Samochody;
set Ladowarki;
# 2. Parametery
# Najwczesniejszy mozliwy czas rozpoczecia ladowania samochodu s na ladowarce l
param E{s in Samochody, l in Ladowarki};
# Czas ladowania samochodu s na ladowarce l
param D{s in Samochody, l in Ladowarki};
# Czas odjazdu samochodu s
param O{s in Samochody};
# Zysk z realizacji kursu przez samochód s
param Z{s in Samochody};
# Zmienna decyzyjna
# zmienna okreslajaca godzine rozpoczecia ladowania samochodu s na ladowarce l
var u{s in Samochody, l in Ladowarki}, >= 0 and <= 24;
# zmienna binarna okreslajaca czy kurs zostanie wykonany
var y{s in Samochody}, binary;
# zmienna binarna okreslajaca czy samochód i jest ladowany po samochodzie j na ladowarce l
var v{i in Samochody, j in Samochody, l in Ladowarki}, binary;
# zmienna binarna okreslajaca czy samochód s jest ladowany jako pierwszy na ladowarce l
var p{s in Samochody, l in Ladowarki}, binary;
# zmienna binarna okreslajacy czy samochód s jest ladowany na ladowarce l
var k{s in Samochody, l in Ladowarki}, binary;
# Funkcja celu
maximize Q: sum {s in Samochody} y[s]*Z[s];
# Ograniczenia
subject to
# Samochód nie moze rozpoczac swojego ladownia przed najwczesniejszym mozliwym czasie ladowania.
Ogr_1{s in Samochody, l in Ladowarki}:
u[s,l] >= E[s, l];
# Samochód moze byc ladowany maksymalnie na jednej ladowarce
Ogr_2{s in Samochody, l in Ladowarki}:
sum {l in Ladowarki} k[s, l] == y[s]
Ogr_3{n in Budynki}:
sum {i in Budynki} f[n,i] <= sum {j in BudynkiNaStart} f[j,n];
solve;
display {i in Budynki, j in Budynki: f[i,j] > 0}: f[i,j];
display: Q;

View File

@ -0,0 +1,40 @@
data;
set Samochody := s1, s2, s3, s4, s5;
set Ladowarki := l1, l2, l3;
param E{s in Samochody, l in Ladowarki};
param D{s in Samochody, l in Ladowarki};
param O{s in Samochody};
param Z{s in Samochody};
param E :=
s1 l1 0 s1 l2 0 s1 l3 0
s2 l1 0 s2 l2 0 s2 l3 0
s3 l1 0 s3 l2 0 s3 l3 0
s4 l1 0 s4 l2 0 s4 l3 0
s5 l1 2 s5 l2 2 s5 l3 2;
param D :=
s1 l1 4 s1 l2 4 s1 l3 8
s2 l1 1 s2 l2 1 s2 l3 2
s3 l1 5 s3 l2 5 s3 l3 10
s4 l1 3 s4 l2 3 s4 l3 6
s5 l1 6 s5 l2 6 s5 l3 12;
param O :=
s1 8
s2 5
s3 6
s4 4
s5 9;
param Z :=
s1 100
s2 10
s3 200
s4 20
s5 330;
end;

View File

@ -0,0 +1,26 @@
Przeszukać:
1. Leon [x] -> znazłem naszego gitlaba xdd
https://gitlab-stud.elka.pw.edu.pl/wsienkie/zbop_2023z_ladowarki_elektryczne.git
2. Google Drive [x]
3. Teams [x]
4. Discord
Discord archiwa:
https://discord.com/channels/@me/1158794290080788600/1180913384280051732 [pierwszy kod projektowy]
https://discord.com/channels/@me/1158794290080788600/1180913901228003368 [pierwsze dane]
Model matematyczny I (podstawowy)
Kod:
Dane:
Model rozszerzony
Kod:
Dane:
Model 2-fazowy
Kod:
Dane: