%% ABOUT
% Tento skript sluzi na zadanie vsetkych vstupnych parametrov, ktore budu
% vyuzivane a volane vo funkciach pre zostavenie optimalizacnej ulohy 
% pripadne vo funkciach pre zostavenie zavaznych ci nezavaznych obmedzeni.

% V sekcii VSTUPNE DATA, je potrebne zadat parametre pre ulohu, ich popisky
% su vzdy vedla kazdej neznamej. Nasledne si zvolime maximalne naklady na
% smenu a nechame si vytvorit maticu nakladov pomocou funkcie randi()

% Sekcia RIESIC sluzi na zostavenie optimalizacnej ulohy pomocou funkcie 
% MBKS_zostav_optimalizacnu_ulohu, jej vystupy budeme potrebovat pre 
% najdenie optimalne riesenia a to za pomoci funkcie selectMIPsolver.
% Optimalne riesenie nasledne pretransformuje do citatelnejsie podoby, 
% nakolko riesenie xopt2 je v podobe dlheho vektoru, teda do matice XOPT2. 
% Tato posluzi ako vstup pre zostavenie grafickych funkcii.

% Sekcia ZOBRAZENIA, ako uz bolo spomenute sluzi na zobrazenie vysledkov z
% optimalneho riesenia. 

%% VSTUPNE DATA
n = 20; % pocet sestier
mesiace = 1; % pocet planovanych mesiacov
dni = 7; % pocet planovanych dni 
m = mesiace * dni; % pocet planovanych dni za jeden tyzden
w = 2; % pocet vikendovych dni za periodu m
z = 3; % pocet smien za den
a = 4; % maximalny pocet po sebe iducich pracovnych dni pre sestru za m 
max_wknd_den = 1; % max pocet vikendovych pracovnych dni za periodu m
min_poc_den = 2; % min pocet pracovnych dni
max_poc_den = 6; % max pocet pracovnych dni 
l = 4; % optimalny pocet pracovnych dni 
delta = 0.25; % koeficient nocnej smeny
weekend_indx_init = [];
for i = 6:7:m
    weekend_indx_init(i,1) = i;
end
for i = 7:7:m
    weekend_indx_init(i,1) = i;
end
weekend_indx = weekend_indx_init(weekend_indx_init(:) > 0); % vikend index
KN = [3]; % mnozina nocnych smien
w1 = ones(n,1); % vaha pre prve nezavazne obmedzenie
w2 = ones(n,1)*(100); % vaha pre druhe nezavazne obmedzenie


%% POPULOVANIE NAKLADOV A POCTU SMIEN SESTIER
load dataDp;
p = pR50(1:n,1:m,:); % Matica nakladov
D = DR(1:m,:); % Matica minimalneho predpisaneho poctu smien sestier

%% ZOSTAVENIE OPTIMALIZACNEJ ULOHY
[c, A, b, lb, ub, ctype, vartype, sense, param] = ...
    MBKS_zostav_optimalizacnu_ulohu(n, m, z, w, a, max_wknd_den, ... 
    min_poc_den, max_poc_den, l, delta, weekend_indx, p, D, KN, w1, w2);

%% RIESIC
[XOPT, fpls, fmns, gpls, gmns, cas_vypoctu,fmin,errnum,extra] = ... 
    MBKS_riesenie(n, m, z, c, A, b, lb, ub, ctype, vartype, sense, ...
    param,false);

%% GRAFICKE FUNKCIE
% Graficke zobrazenia z riesenia xopt2
figure(2); MBKS_zobraz_priradenie_sluzieb(n, m, z, weekend_indx, XOPT)
figure(3); MBKS_zobraz_obsadenost_zmien(n, m, z, D, XOPT)
figure(4); MBKS_zobraz_pocty_zmien(n, m, z, min_poc_den, max_poc_den,...
    KN, delta, l, XOPT)
figure(5); MBKS_zobraz_pocty_vikendovych_zmien(n, m, z, w, max_wknd_den, ...
    weekend_indx, XOPT)
figure(6); MBKS_zobraz_pocty_turnusov(n, m, z, a, XOPT)
figure(7); MBKS_zobraz_odchylky_nezavaznych_poziadavok( fpls, fmns, gpls, gmns)


