Optimalizace průchodu skladem - GUI pro testování vytvořené knihovny
===
## Autor
jméno: Jan Holáň \
login: xholan11 \
email: xholan11@vutbr.cz

# Intro
Kód implementuje GUI pro testování funkčnosti knihovny řešící optimalizaci průchodu skladem.

Jako spouštěcí prostředí se předpokládá OS Linux (testována byla Fedora a Ubuntu)

# Závislosti
Kód je závislý na knihovnách **python3.11**, **nlohmann/json** a frameworku Qt verze 6.4.3 (k tomu použit QMake verze 3.1).

Framework Qt lze nainstalovat z https://www.qt.io/

Knihovnu **python3.11** lze nainstalovat na systému
- Fedora Linux pomocí <pre>$ dnf install python3.11 python3.11-devel</pre>
- Ubuntu Linux pomocí <pre>$ apt install python3.11 python3.11-dev</pre>

Knihovna **nlohmann/json** slouží pro práci se soubory typu JSON. Lze stáhnout z https://github.com/nlohmann/json, případně lze využít nějakou z možností viz https://json.nlohmann.me/integration/package_managers (oficiální stránky knihovny). Následně by měla být tato knihovna umístěna do adresáře */usr/include*.

# Překlad a spuštění
Kód lze přeložit a spustit sekvencí příkazů zadaných v kořenovém adresáři (tedy nad složkou se zdrojovými kódy programu *./src*).
<pre>
$ qmake
$ make
$ ./warehouse_visualizer
</pre>

## Upozornění
Některé verze g++ nemusí podporovat parametr -std=c++20. V tom případě je nutné tento parametr nahradit za -std=c++2a. 

Stejně tak může v některých případech selhat překlad kvůli parametru -pedantic či -Werror. V takovém případě je nezbytné tyto parametry odebrat.

# Popis a použití
Pro názornější práci s implementovaným algoritmem a možnost vizuálního testování toho, jak byly položky seskupeny do vozíků, bylo vytvořeno jednoduché grafické rozhraní. V něm je možné načíst vstupní soubor, a to jak s originálními daty, tak s daty reprezentujícími finální seskupení položek. Rozhraní dále přímo využívá zde vyvinutou knihovnu pro možnost přímého spuštění vytváření vozíků z dat načtených na vstupu. 

Aplikace se skládá ze dvou hlavních oken - v prvním lze načíst vstupní i finální soubor dat (oba ve formátu JSON, tlačítka **Load original JSON** a **Load final JSON**). Po korektním načtení je možné data vizualizovat po kliknutí na tlačítka **Show original** a **Show final**. Finální data není třeba mít připravená - lze je získat spuštěním knihovní funkce
**loadingCartsRun()** třídy *CartsLoader* po načtení vstupních dat kliknutím na tlačítko **START CREATING CARTS**. Algoritmy, které budou použité pro výpočet, je možné ručně nastavit vybráním z rozbalitelných seznamů nebo lze ponechat základní nastavení algoritmů tak, jak jsou vybrány po startu aplikace. Pro metodu K-Means clustering je navíc možno specifikovat počet iterací pro vytváření clusterů a jejich centroidů. Dále je nezbytné zvolit rozměry jedné či více přepravek, které budou během výpočtu využity. Po startu aplikace se v polích objeví hodnoty odpovídající těm, které jsou v této práci využívány jako referenční pro Firmu. Nedostatek zde spočívá v tom, že rozměry vozíku určit nelze - je fixně nastaven na celkový počet tří polic o šířce devadesát centimetrů. 

V rámci vizualizace vstupních dat je možné vidět rozmístění položek po skladě ve 2D prostoru, kde každému zákazníkovi je přiřazena jedna barva. Pro lepší orientaci lze vybrat konkrétního zákazníka, který je následně označen výraznou žlutou barvou. U finálních dat jsou opět položky rozlišeny, tentokrát podle jejich náležitosti k danému vozíku - každému patří jedna barva. Zaškrtávacími poli je potom možné nechat si zobrazit jenom jeden vozík, rozlišit barevně zákazníky ve vozíku či graficky pospojovat všechny položky tak, jak jsou za sebou řazeny (tzn. výsledek algoritmů Greedy nebo Nearest Neighbor). Je třeba upozornit, že vizualizace následnosti položek je pouze orientační co do reálného tvaru výsledné cesty - je to dáno tím, že dvojice položek jsou jednoduše spojeny *„vzdušnými přímkami“*.Tlačítkem **RESTORE** je možno navrátit původní podobu vizualizovaných dat.
<img src="gui.png"/>

# Příklad spuštění
1. Nahrání dat kliknutím na tlačítko **Loading original JSON** a výběrem některé z *"vln"* v adresáři *testovací data*
2. Ponechání základního výběru algoritmů nebo změna za vlastní konfiguraci
3. Kliknutí na tlačítko **ADD BOX** - přidání jednoho boxu o rozměrech uvedených vedle tlačítka. Bez explicitního přidání boxu nedojde ke spuštění výpočtu!
4. Kliknutí na tlačítko **START CREATING CARTS**, čímž dojde ke spuštění algoritmu. Aplikace se *"zamrazí"* po dobu výpočtu a po jeho dokončení se pod tlačítkem **START CREATING CARTS** objeví upozorňující zpráva.
5. Kliknutím na tlačítka **Show original** a **Show final** lze vizualizovat data před a po provedení výpočtu.

**Doporučení** - spouštět z terminálu pro možnost sledování debugovacích výpisů informujících o práci programu.

**Upozornění** - při testování 3D algoritmů pro balení položek do boxů je nezbytné zadat dostatečné množství boxů, které bude mít knihovna k dispozici (pro všechny vlny dodané k testování je takovým dostatečným množstvím 1000 boxů).

# Testovací data
Jako data pro otestování správného běhu aplikace lze využít data umístěná v adresáři *./testovací data*, nebo ta, která se nacházejí u zdrojových kódu knihovny (viz README ke knihovně).
