function [vyslednyNavrh] = VyslednyNavrh(delka, BW, jednotkaBW, cenaza1m, cenaza1b, BWpl,cenaza1pa, cenaza1pb,pocatek, konec, pocetuzlu,limit,presah, upravaToku) 

%m-file pro vytvoreni navrhu struktury site na zaklade kompromisu mezi
%vsemi drive ziskanymi hodnotami jednotlivych optimalizaci. Snaha je
%minimalozovat cenu, pri zachovani zadanych parametru
%[vyslednyNavrh] = VyslednyNavrh(delka, BW, jednotkaBW, cenaza1m, cenaza1b,BWpl,cenaza1pa, cenaza1pb,pocatek, konec, pocetuzlu,limit,presah, upravaToku)

%jednotkaBW - Bps, Mbps, Gbps
%BW - kapacita jednotlivych linek
%pocatek - vektor pocatecnich uzlu spoju
%konec - vektor koncovych uzlu spoju
%pocetuzlu - pocet uzlu v siti
%cenaza1pa - zadejte jednotkovou cenu za prepojeny paket
%cenaza1pb - zadejte jednotkovou cenu za pametovy blok
%delka - delka spoje, zadavejte v metrech
%cenaza1m, cenaza1b - zadejte jednotkovou cenu delky a kapacity
%upravaToku - hodnota zmeny toku toku ve spoji pri poddimenzovani(yadavat ve tvaru 1.15 pro 15 procent)
%presah - hodnata zmeny kapacity ve spoji pri nedodrzeni hodnoty zpozdeni(zadavat ve tvaru 1.15 pro 15 procent). Vzyahuje se ke sloupci matice a danemu uzlu v ceste
%BWpl - kapacita spoje pristupove linky, zadavejte v Bps, Mbps, Gbps
%limit - hodnota maximalniho zpozdeni v ceste mezi 2 koncovymi uzly (0.1 pro 100ms)

%[vyslednyNavrh] = VyslednyNavrh(delka, BW, jednotkaBW, cenaza1m, cenaza1b, BWpl,cenaza1pa, cenaza1pb,pocatek, konec, pocetuzlu,limit,presah, upravaToku)

if nargin ~= 14
    error('Spatny pocet vstupu')
end

delkaPocatek = length(pocatek);
delkaKonec = length(konec);
delkaDelka = length(delka);
delkaBW = length(BW');
delkaBWpl = length(BWpl');

if delkaPocatek ~= delkaKonec || delkaPocatek ~= delkaDelka || delkaPocatek ~= delkaBW
    error('Pocet prvku vektoru pocatek, konec, delka a BW musi byt stejny')
elseif delkaBWpl ~= pocetuzlu
    error('Pocet prvku vektoru BWpl musi byt stejny jako pocet uzlu')
end


%Nejprve si nactu vystupy jednotlivych funkci
[BWcel] = CelkovaBWdoUzlu(pocatek, konec, BW, pocetuzlu); %funkce vypoctu celkove kapacity v uzlech
[celkovacena,cenalinek,cenauzlu] = CelCenaSpoje (BW, BWcel, jednotkaBW, pocetuzlu, cenaza1m, cenaza1b, BWpl, cenaza1pa, cenaza1pb, delka); %cena za spoj
[maticeSpojuDleCeny,VsechnySpojeDleCeny] = OptDleCeny (BW, BWcel, jednotkaBW, pocatek, konec, pocetuzlu, cenaza1m, cenaza1b, BWpl, cenaza1pa, cenaza1pb, delka, limit); %optimalizace dle ceny a vysledna matice spoju
[maticeSpojuDleToku,VsechnySpojeDletoku, UT, alternativaToku] = OptDleToku (pocatek, konec, BW, BWcel, pocetuzlu, BWpl,cenaza1pa, cenaza1pb, jednotkaBW, delka, cenaza1m, cenaza1b, upravaToku); %optimal dle toku
[maticeSpojuDleZpozdeni,VsechnySpojeDleZpozdeni,zpozdeniPL,serializacniZpozdeni] = OptDleZpozdeni(delka, pocatek, konec, BW, BWcel, BWpl, jednotkaBW, pocetuzlu, limit, cenaza1m, cenaza1b, cenaza1pa, cenaza1pb, presah); %optimal dle zpozdeni
[spolehlivosttLinek, absolutniVyjadreniSpol] = OpdDleChybovosti(jednotkaBW, BW, pocatek, konec, pocetuzlu); %opt dle chybovosti, amtice sloupcove vektory

disp('******************PARAMETRY VYSLEDNEHO NAVRHU*************************')

%prochazet matice spojdleCeny,Toku,zpozdeny a
%prvky, ktere budou vsude stejne ulozit do jedne vysledne matice

%pomocne promenne
A = maticeSpojuDleCeny;
B = maticeSpojuDleZpozdeni;
C = maticeSpojuDleToku;
maticeSpoju = zeros(pocetuzlu,pocetuzlu);

%prvky vetsi nez 0 se rovnaji 1
A(A > 0) = ones(size(find(A > 0 )));
B(B > 0) = ones(size(find(B > 0 )));
C(C > 0) = ones(size(find(C > 0 )));

%hledam v souctovych maticich prvky rovnajici se 2 a jejich pozice
Az = A+B;
Az2 = Az == 2;
hledejAz2 = find(Az2);
[w, x] = size(hledejAz2);

At = A+C;
At2 = At == 2;
hledejAt2 = find(At2);
[y, z] = size(hledejAt2);

%dle vetsi schody urcuji vyslednou matici spolecnych spoju. Vztahuji k
%matici opt dle ceny pro snizeni nakladu
if w > y
    maticeSpoju(hledejAz2) = maticeSpojuDleCeny(hledejAz2);
elseif w < y
    maticeSpoju(hledejAt2) = maticeSpojuDleCeny(hledejAt2);
elseif w == y
    maticeSpoju = maticeSpojuDleCeny(hledejAz2);
end

maticeNevyuzSpoju = VsechnySpojeDleCeny - maticeSpoju; %rozdilova matice pouzita pro doplneni chybejici spoje

%urcit chybejici spoje a doplnit. pak testovat
for j = 1:2
for i = 1:pocetuzlu
    %hledam uzly se stupnem mensim nez 2 a tem doplnuji spoje
    NNr = maticeSpoju(i,:) > 0;
    NNs = maticeSpoju(:,i) > 0;
    %podle velikosti vektoru indexu urcuji stupen
    hledejNNr = find(NNr);
    [a,b] = size(hledejNNr);
    hledejNNs = find(NNs);
    [c,d] = size(hledejNNs);
    
    %pokud je stupen mensi nez 2, zmen prvky=0 v matici nevyuz spoju na
    %Inf, najdi minimum v radju a sloupci. Porovnej je a vyber mensi. To
    %dopln do matice spoju na prislusnou pozici. Vymaz jej z matice nevyuz
    %spoju a zmen prvky = Inf na 0
    if b+c < 2
       maticeNevyuzSpoju(maticeNevyuzSpoju==0) = Inf * ones(size(find(maticeNevyuzSpoju==0)));
       minR = min(maticeNevyuzSpoju(i,:));
       hlminR = find(maticeNevyuzSpoju == minR);
       minS = min(maticeNevyuzSpoju(:,i));
       hlminS = find(maticeNevyuzSpoju == minS);
       
       if minR > minS
           maticeSpoju(hlminS) = maticeNevyuzSpoju(hlminS);
           maticeNevyuzSpoju(hlminS) = 0*maticeNevyuzSpoju(hlminS);
       elseif minR < minS
           maticeSpoju(hlminR) = maticeNevyuzSpoju(hlminR);
           maticeNevyuzSpoju(hlminR) = 0*maticeNevyuzSpoju(hlminR);
       end
       maticeNevyuzSpoju(maticeNevyuzSpoju==Inf) = 0 * ones(size(find(maticeNevyuzSpoju==Inf)));
       
       
    end
end
end


disp('Spoje pouzite v konecnem navrhu:')
finalSpoje = sparse(maticeSpoju);
NNfS = finalSpoje > 0;
hledejNNfS = find(NNfS);
[x y] = size(hledejNNfS);
znaceni = (1:1:x);
znaceni = znaceni';
finalSpoje(hledejNNfS) =  znaceni %Spoje konecneho navrhu

disp('-------Hodnoty toku-------')

%test na kapacitu 
maticeSpojuDT = maticeSpoju;
NNdt = maticeSpojuDT > 0;
hledejNNdt = find(NNdt);
maticeSpojuDT(hledejNNdt) = maticeSpojuDleToku(hledejNNdt); %matice spoju s hodnotami toku. Pozor, jde o hodnoty toku po optimalizaci, proto nutno doplnit pripadne chyb. spoje
NNSdT = maticeSpojuDT > 0;%hledam prvky > 0
hledejNNSdT = find(NNSdT);

%hledam zbyle spoje pro doplneni
NNmS = maticeSpoju > 0;
hledejNNmS = find(NNmS);
maticeTodkuDleMatSpoju = zeros(pocetuzlu,pocetuzlu);
maticeTodkuDleMatSpoju(hledejNNmS) = VsechnySpojeDletoku(hledejNNmS);%matice vsech toku dle matice spoju
maticeTodkuDleMatSpoju(hledejNNSdT) = 0; %odstraneni hodnot dle maticeSpojuDT a tim nam zustanou jen hodnoty pro doplneni
maticeSpojuDT = maticeSpojuDT + maticeTodkuDleMatSpoju; %vysledna matice spoju dle toku

disp(sprintf('Toky v pouzitych spojich v %s',jednotkaBW))
ridkamaticeSpojuDT = sparse(maticeSpojuDT)

zdroje = pocetuzlu - 1;
tok = zeros(pocetuzlu,pocetuzlu); %budouci matice max. toku
for i = 1:zdroje
    [MaxTok,TokVeSpoji,Rez] = graphmaxflow(ridkamaticeSpojuDT,i,pocetuzlu); %hleda max. toky
    tok = tok + TokVeSpoji; % a vytvari novou matici spoju na zaklade souctu nalezenych max. toku
end

disp(sprintf('Toky ve spojich po vypoctu max. toku v %s (Cim vyssi posledni hodnota, ti vyssi je propustnost cele site)',jednotkaBW ))
toky = sparse(tok) %zobrazeni matice souctu max. toku

%%%alternativni reseni

%test na kapacitu 
maticeSpojuDTalter = maticeSpoju;
NNdt = maticeSpojuDTalter > 0;
hledejNNdt = find(NNdt);
maticeSpojuDTalter(hledejNNdt) = alternativaToku(hledejNNdt); %matice spoju s hodnotami toku. Pozor, jde o hodnoty toku po optimalizaci, protonutno doplnit pripadne chybspoje
NNSdT = maticeSpojuDTalter > 0;%hledam prvky > 0
hledejNNSdtaleter = find(NNSdT);

%hledam zbyle spoje pro doplneni
NNmS = maticeSpoju > 0;
hledejNNmS = find(NNmS);
maticeTodkuDleMatSpoju = zeros(pocetuzlu,pocetuzlu);
maticeTodkuDleMatSpoju(hledejNNmS) = VsechnySpojeDletoku(hledejNNmS);%matice vsech toku dle matice spoju
maticeTodkuDleMatSpoju(hledejNNSdtaleter) = 0; %odstraneni hodnot dle maticeSpojuDT a tim nam zustanou jen hodnoty pro doplneni
maticeSpojuDTalter = maticeSpojuDTalter + maticeTodkuDleMatSpoju; %vysledna matice spoju dle toku

disp(sprintf('Toky v pouzitych spojich, pri navyseni poddimenzovanych toku, v %s',jednotkaBW))
ridkamaticeSpojuDTalternativni = sparse(maticeSpojuDTalter)%pro alternativni zpozdeni

zdroje = pocetuzlu - 1;
tok = zeros(pocetuzlu,pocetuzlu); %budouci matice max. toku
for i = 1:zdroje
    [MaxTok,TokVeSpoji,Rez] = graphmaxflow(ridkamaticeSpojuDTalternativni,i,pocetuzlu); %hleda max. toky
    tok = tok + TokVeSpoji; % a vytvari novou matici spoju na zaklade souctu nalezenych max. toku
end

disp(sprintf('Toky ve spojich, pri navyseni poddimenzovanych toku, po vypoctu max. toku v %s (Cim vyssi posledni hodnota, ti vyssi je propustnost cele site)',jednotkaBW ))
toky = sparse(tok) %zobrazeni matice souctu max. toku


%test na zpozdeni !!!!nutno brat v potaz nove hodnoty kapacit
%nejprve nahradim hodnoty v matici spoju hodnoutou zpozdeni
disp('-------Hodnoty zpozdeni-------')
fixnizpozdeni = 1.4*(10^-3); % fixni zpozdeni v uzlech pro paket velikosti 1500B

maticeSpojuSZ = maticeSpoju;
NNpz = maticeSpojuSZ > 0;
hledejNNpz = find(NNpz);

%kontrola, zda doslo ke zmene toku a pokud ano, tak se provede prepocet

disp ('Zpozdeni jednotlivych spoju v siti v [s]:')
maticeSpojuSZ(hledejNNpz) = VsechnySpojeDleZpozdeni(hledejNNpz); %matice spoju s hodnotami zpozdeni
maticeSpojuSZ = sparse(maticeSpojuSZ) %prevod na ridkou matici

maticeSpojuSZ = tril(maticeSpojuSZ + maticeSpojuSZ'); %prevod na dolni trojuhelnikovou matici, nutnost pro dalsi vypocet
ZpozdeniVNavrhu = graphallshortestpaths(maticeSpojuSZ,'directed',false); %matice sousednosti na zaklade doby celkoveho zpozdeni kazde cesty v transport. siti návrhu dle min kostry s redundanci

for i = 1:pocetuzlu
    
    ZpozdeniVNavrhu(i,:) = (ZpozdeniVNavrhu(i,:) + zpozdeniPL(1,i)) + zpozdeniPL(1,:); %cyklus pro pricteni zpozdeni pristupovych linek a vytvoreni matice celkoveho zpozdeni. Pricte zpozdeni vstupu a ynovu ypoydeni vsech vystupu
    ZpozdeniVNavrhu(i,i) = 0;
    
end

%musim urcit, pres kolik uzlu to jde a podle toho pricist fixni zpozdeni

for i = 1:(pocetuzlu) %opakovani pro zdrojove uzly
    
    for j = 1: pocetuzlu %opakovani pro cilove uzly
        [dist,path,pred] = graphshortestpath(maticeSpojuSZ,i,'directed',false); %hledani vsech nejkratsich tras ze zdrojoveho uzlu
        nejrychlejsiTrasa = path{j}; % nejrzchlejsi cesta k cili trasa k danemu cili
        pocetMezUzlu = length(nejrychlejsiTrasa);%pocet mezilehlych uzlu
        ZpozdeniVNavrhu(i,j) = ZpozdeniVNavrhu(i,j) + (pocetMezUzlu * fixnizpozdeni);%podle poctu mezilehlych uzlu prictu fixni zpozdeni
        
    end
end

%odstanim cesty k uzlum samotnym 1 do 1 atd
for i = 1:pocetuzlu
    ZpozdeniVNavrhu(i,i) = 0;
end


disp('Zpozdeni na dane trase mezi koncovymi ucastniky v [s]:')
ZpozdeniVNavrhu = triu(ZpozdeniVNavrhu);
zpozdeni = sparse(ZpozdeniVNavrhu)

% V pripade ze nastane hodnota presahujici limit zpozdeni, tak urcit co to je za spoj, o kolik a
% jak to resit
zpozdeneLinkySRedun = zeros(pocetuzlu, pocetuzlu);
Delay = ZpozdeniVNavrhu > limit; %hledej hodnoty presahujici limit
najdiDelay = find(Delay); %hledej pozice v matici zpozdeni linek
zpozdeneLinkySRedun(najdiDelay) = ZpozdeniVNavrhu(najdiDelay) - limit; %prirazeni hodnoty do matice zpozdenych linek a jeji zmena na hodnotu o kterou je prekrocen limit

disp('Linky, ktere prekracuji maximalni limit zpozdeni a jakym rozdilem.')
zpozdeneLinkySRedun = sparse(zpozdeneLinkySRedun)

%pokud se nektery prvke matice zpozdenych nerovna nula, probejne uprave
%zpozdeni
NNzps = zpozdeneLinkySRedun > 0;
hledejNNzps = find(NNzps);
kontrolaPraz = isempty(hledejNNzps);

if kontrolaPraz == 0
for i = 1:pocetuzlu %na zaklade poctu uzlu definuji pocet opakovani
    
    if zpozdeneLinkySRedun(i,:) == 0 %kontrola zde radek obsahuje poze nuly
        continue %pokud ano, pokracuj v dalsi iteraci
        
    else
    
    [x,y] = find(zpozdeneLinkySRedun(i,:) > 0);%hledej pozice nenulovyzch prvku matice
    xs = i;
    ys = y;
    delkaYs = length(ys);
    
    [dist,path,pred] = graphshortestpath(maticeSpojuSZ,xs,'directed',false); %najdi vsechny nejkratsi trasy z vychoziho bodu xs
    
    for q = 1 : delkaYs
    trasa = path{ys(1,q)} %trase k ys, tedy zjistena s prekrocenym limitem
    
    dilciZpozdeni = dist(path{ys(1,q)}) %zpozdeni jednotlivych usek na trase
    
    [a,b] = size(dilciZpozdeni); %rozmery matice
    for j = 1:b-1
        
       dilciZpozdeni(1,j) =  dilciZpozdeni(1,j+1) - dilciZpozdeni(1,j); %hledej rozdily mezi zpozdenimi na trase
               
    end
    
    limitZmeny = min(dilciZpozdeni); %najdi minimalni hodnotu rozdilu
    maxim = max(dilciZpozdeni); %najdi maximalni hodnotu rozdilu
    dilciZpozdeni(dilciZpozdeni == maxim) = 0 * ones(size(find(dilciZpozdeni == maxim))); %maximalni hodnotu zmen na 0
    Q = dilciZpozdeni >= (limitZmeny *presah); %hledane prvky budou ty, ktere presahuji limit o zvolena procenta
    najdi = find(Q); %vyhledej hodnoty  ktere presahuji minimum a zvolena procenta
    TP = isempty(najdi); %test, zda-li je prazdna matice najdi
    if TP == 1
        disp('Zvysit rovnomerne kapacitu cele trasy. O procenta presahu rozpocteno na useky')
        
    elseif TP == 0
        disp('Zvysit kapacitu spuju vzhledem ke sloupcum matice a danemu uzlu v trase:')
        najdi
    end
    end
    
    end
end

elseif kontrolaPraz == 1
    disp('Nedoslo k prekroceni hodnoty zpozdeni')
end

ZpozdeniVNavrhu = ZpozdeniVNavrhu(:);
NNzpvn = ZpozdeniVNavrhu > 0;%hledam nenulove prvky a temi budu delit
hledejNNzpvn = find(NNzpvn);
[x,y] = size(hledejNNzpvn);
averageSredun = sum(ZpozdeniVNavrhu)/x; %prumerna doba zpozdeni linky
maximumSredun = max(ZpozdeniVNavrhu);

disp(sprintf('Prumerna doba zpozdeni navrhu = %9.9f s \n',averageSredun(1,1)));
disp(sprintf('Maximalni doba zpozdeni navrhu = %9.9f s \n',maximumSredun(1,1)));


%Nutno upravit serializacni zpozdeni linek(odectu puvodni zpozdeni, vypocitam nova a prictu je)
if UT == 1
maticeSpojuSZ = maticeSpoju;
NNpz = maticeSpojuSZ > 0;
hledejNNpz = find(NNpz);
    
maticeSpojuSZ(hledejNNpz) = VsechnySpojeDleZpozdeni(hledejNNpz); %matice spoju s hodnotami zpozdeni
maticePovdnichPakZpoz = sparse(pocatek,konec,serializacniZpozdeni,pocetuzlu,pocetuzlu);
maticePovdnichPakZpoz = maticePovdnichPakZpoz + zeros(pocetuzlu,pocetuzlu);
maticeSpojuSZ = maticeSpojuSZ - maticePovdnichPakZpoz;
maticeSpojuSZ(maticeSpojuSZ < 0) = 0 * ones(size(find(maticeSpojuSZ < 0))); %matice spoju po decteni puvodniho zpozdeni

%nove serializacni
packet = 1500*8;
switch jednotkaBW
    case 'Bps'
    ridkamaticeSpojuDTalternativni = (ridkamaticeSpojuDTalternativni.\packet).*2; %serializacni zpozdeni na zdrojovem a cilovem uzlu transportni site
       
    case 'Mbps'
    ridkamaticeSpojuDTalternativni = ((ridkamaticeSpojuDTalternativni.*10^6).\packet).*2;
        
    case 'Gbps'
    ridkamaticeSpojuDTalternativni = ((ridkamaticeSpojuDTalternativni.*10^9).\packet).*2;
       
    otherwise
        disp('zadej spravnou jednotku BW> Bps, Mbps, Gbps')
      
end
ridkamaticeSpojuDTalternativni(ridkamaticeSpojuDTalternativni == Inf) = 0 * ones(size(find(ridkamaticeSpojuDTalternativni == Inf))); %nova matice serializacnich zpozdeni
maticeSpojuSZ = maticeSpojuSZ + ridkamaticeSpojuDTalternativni; %nova matice spoju dle zpozdeni
end

disp ('Zpozdeni jednotlivych spoju v siti po uprave kapacit spoju v [s]:')
maticeSpojuSZ = sparse(maticeSpojuSZ) %prevod na ridkou matici

maticeSpojuSZ = tril(maticeSpojuSZ + maticeSpojuSZ'); %prevod na dolni trojuhelnikovou matici, nutnost pro dalsi vypocet
ZpozdeniVNavrhu = graphallshortestpaths(maticeSpojuSZ,'directed',false); %matice sousednosti na zaklade doby celkoveho zpozdeni kazde cesty v transport. siti návrhu dle min kostry s redundanci

for i = 1:pocetuzlu
    
    ZpozdeniVNavrhu(i,:) = (ZpozdeniVNavrhu(i,:) + zpozdeniPL(1,i)) + zpozdeniPL(1,:); %cyklus pro pricteni zpozdeni pristupovych linek a vytvoreni matice celkoveho zpozdeni. Pricte zpozdeni vstupu a ynovu ypoydeni vsech vystupu
    ZpozdeniVNavrhu(i,i) = 0;
    
end

%musim urcit, pres kolik uzlu to jde a podle toho pricist fixni zpozdeni

for i = 1:(pocetuzlu) %opakovani pro zdrojove uzly
    
    for j = 1: pocetuzlu %opakovani pro cilove uzly
        [dist,path,pred] = graphshortestpath(maticeSpojuSZ,i,'directed',false); %hledani vsech nejkratsich tras ze zdrojoveho uzlu
        nejrychlejsiTrasa = path{j}; % nejrzchlejsi cesta k cili trasa k danemu cili
        pocetMezUzlu = length(nejrychlejsiTrasa);%pocet mezilehlych uzlu
        ZpozdeniVNavrhu(i,j) = ZpozdeniVNavrhu(i,j) + (pocetMezUzlu * fixnizpozdeni);%podle poctu mezilehlych uzlu prictu fixni zpozdeni
        
    end
end

%odstanim cesty k uzlum samotnym 1 do 1 atd
for i = 1:pocetuzlu
    ZpozdeniVNavrhu(i,i) = 0;
end


disp('Zpozdeni na dane trase mezi koncovymi ucastniky pri zmene toku v siti v [s]:')
ZpozdeniVNavrhu = triu(ZpozdeniVNavrhu);
zpozdeni = sparse(ZpozdeniVNavrhu)

ZpozdeniVNavrhu = ZpozdeniVNavrhu(:);
NNzpvn = ZpozdeniVNavrhu > 0;%hledam nenulove prvky a temi budu delit
hledejNNzpvn = find(NNzpvn);
[x,y] = size(hledejNNzpvn);
averageSredun = sum(ZpozdeniVNavrhu)/x; %prumerna doba zpozdeni linky
maximumSredun = max(ZpozdeniVNavrhu);

disp(sprintf('Prumerna doba zpozdeni navrhu pri uprave kapacit spoju = %9.9f s \n',averageSredun(1,1)));
disp(sprintf('Maximalni doba zpozdeni navrhu pri uprave kapacit spoju = %9.9f s \n',maximumSredun(1,1)));


disp('-------Hodnoty chybovosti-------')

%pokud nebyl pouzit koeficient upravy toku
    maticeSpojuDChyb = maticeSpoju;
    NNmaticeSdCh = maticeSpojuDChyb > 0;
    hledejNNmaticeSdCh = find(NNmaticeSdCh);
    spolehlivosttLinek = sparse(pocatek,konec,spolehlivosttLinek,pocetuzlu,pocetuzlu);
    spolehlivosttLinek = spolehlivosttLinek + zeros(pocetuzlu,pocetuzlu);
    maticeSpojuDChyb(hledejNNmaticeSdCh) = spolehlivosttLinek(hledejNNmaticeSdCh); %matice spoju s hodnotami chybovost
    maticeSpojuDChyb = sparse(maticeSpojuDChyb);
    
    disp('Spolehlivost jednotlivych spoju v %')
    maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh).*100
    maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh)./100;
    maticeSpojuDChyb(hledejNNmaticeSdCh) = log10((maticeSpojuDChyb(hledejNNmaticeSdCh)));
    maticeSpojuDChyb(hledejNNmaticeSdCh) = abs(maticeSpojuDChyb(hledejNNmaticeSdCh)); %vyjadreni spolehlivost po loratimovani v absolutni hodnote
    
    maticeSpojuDChyb = sparse(maticeSpojuDChyb);
    UG = tril(maticeSpojuDChyb + maticeSpojuDChyb');
    
    nejspolehlivejsi = graphallshortestpaths(UG,'directed',false); %hledani vsech nejkratsich tras
    nejspolehlivejsi = triu(nejspolehlivejsi);

    disp('Vyjadreni pravdepodobnosti v % s jakou nastane na dane trase chyba pri prenosu')
    nejspolehlivejsi = sparse(nejspolehlivejsi).*100 %celkove hodnoty pravdepodobnosti s jakou nastane pri prenosu po dane trase chyba
    
%alternativni moznost
if UT == 1 %pouzit koeficient UT
%urceni spolehlivosti
chybovostVychozi = 0.00005; %vychozi chybovost
prepocet = 100/(1*10^9); %pepocet na procenta
maticeSpojuDChyb = sparse(maticeSpojuDTalter);
NNmaticeSdCh = maticeSpojuDChyb > 0;
hledejNNmaticeSdCh = find(NNmaticeSdCh);

%misto BW pozit novou matici spoju s akt hodnotami toku
switch jednotkaBW
    case 'Bps'
    maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh).*prepocet; %procentualni vyjadrivni vuci vychozimu toku
               
    case 'Mbps'
    maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh).*10^6;
    maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh).*prepocet;
               
    case 'Gbps'
    maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh).*10^9;
    maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh).*prepocet;
        
    otherwise
        error('zadej spravnou jednotku BW: Bps, Mbps, Gbps')
        
end

maticeSpojuDChyb(hledejNNmaticeSdCh) = ((100 - maticeSpojuDChyb(hledejNNmaticeSdCh))./100)+1; %urceni rozdilu chybovosti
maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh).*chybovostVychozi; %chybovost jednotlivych linek
maticeSpojuDChyb(hledejNNmaticeSdCh) = 1 - maticeSpojuDChyb(hledejNNmaticeSdCh); %spolehlivost linek
end

disp('Spolehlivost jednotlivych spoju v % pri zmene kapacit')
maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh).*100
maticeSpojuDChyb(hledejNNmaticeSdCh) = maticeSpojuDChyb(hledejNNmaticeSdCh)./100;

maticeSpojuDChyb(hledejNNmaticeSdCh) = log10((maticeSpojuDChyb(hledejNNmaticeSdCh)));
maticeSpojuDChyb(hledejNNmaticeSdCh) = abs(maticeSpojuDChyb(hledejNNmaticeSdCh)); %vyjadreni spolehlivost po loratimovani v absolutni hodnote

UG = tril(maticeSpojuDChyb + maticeSpojuDChyb');

%for i = 1:(pocetuzlu) %opakovani pro zdrojove uzly
    
 %   for j = 1: pocetuzlu %opakovani pro cilove uzly
  %      [dist,path,pred] = graphshortestpath(UG,i,'directed',false); %hledani vsech nejkratsich tras ze zdrojoveho uzlu
   %     disp(sprintf('Nejspolehlivejsi trasa z uzlu: %i do %i', i, j));
    %    nejspolTrasa = path{j} % nejkratsi trasa k danemu cili
        
    %end
%end
nejspolehlivejsi = graphallshortestpaths(UG,'directed',false); %hledani vsech nejkratsich tras
nejspolehlivejsi = triu(nejspolehlivejsi);

disp('Vyjadreni pravdepodobnosti v % s jakou nastane na dane trase chyba pri prenosu po uprave kapacit')
nejspolehlivejsi = sparse(nejspolehlivejsi).*100 %celkove hodnoty pravdepodobnosti s jakou nastane pri prenosu po dane trase chyba

disp('-------Hodnoty nakladu-------')

%nova celkova kapacita ve spojich

for i = 1:pocetuzlu
    
    BWcel(i,1) = sum(maticeSpojuDT(i,:)) + sum(maticeSpojuDT(:,i)); %nove hodnoty toku do uzlu
    
end
   

%vypocet novych hodnot cen uzlu
[cenapaketu, cenapambloku, cenacelkemuzlu] = CenaZaUzel (BWpl, BWcel, cenaza1pa, cenaza1pb, jednotkaBW); %vypocet cen uzlu v danem navrhu
disp('Naklady na jednotlive uzly jsou:')
cenacelkemuzluPuvodni = cenacelkemuzlu
cenacelkemuzluPuvodni = sum(cenacelkemuzlu);


if UT == 1
for i = 1:pocetuzlu
    
    BWcelalter(i,1) = sum(maticeSpojuDTalter(i,:)) + sum(maticeSpojuDTalter(:,i)); %nove hodnoty toku do uzlu
    
end


[cenapaketu, cenapambloku, cenacelkemuzlu] = CenaZaUzel (BWpl, BWcelalter, cenaza1pa, cenaza1pb, jednotkaBW); %vypocet cen uzlu v danem navrhu
disp('Naklady na jednotlive uzly po zmene kapacity jsou:')
cenacelkemuzluAlter = cenacelkemuzlu
cenacelkemuzluAlter = sum(cenacelkemuzlu);
end

delkaOptNavrhu = sparse(pocatek,konec,delka,pocetuzlu,pocetuzlu); %ridka matice ohodnocena delkou
ind = find(maticeNevyuzSpoju > 0); %najdi prvky vetsi nez nula v matici nadbytecnych spoju
delkaOptNavrhu(ind) = 0*(ind); %pomoci malezenych indexu vynuluj prislusne delky
delkaOptNavrhu = delkaOptNavrhu + zeros(pocetuzlu,pocetuzlu);
delkaOptNavrhu = delkaOptNavrhu';
delkaOptNavrhu = delkaOptNavrhu(:);
ind2 = find(delkaOptNavrhu > 0); %najdi prvky vetsi nez 0 v matici novych delek
[x,y] = size(ind2);

for i=1:x %na zaklade indexu ind2 vytor novou matici delek pro vypocet cen
delkaPoOpt(i,1)=delkaOptNavrhu(ind2(i,1));
end 

BWOptNavrhu = maticeSpojuDT;
BWOptNavrhu = BWOptNavrhu';
BWOptNavrhu = BWOptNavrhu(:);
ind3 = find(BWOptNavrhu > 0);
[x,y] = size(ind3);

for i=1:x
BWPoOpt(i,1)=BWOptNavrhu(ind3(i,1));%potrebuji sloupcovy vektor bez nul 
end 

[cenalinky] = CenaLinky (delkaPoOpt, BWPoOpt, jednotkaBW, cenaza1m, cenaza1b); %vypocet ceny linky
disp('Naklady na jednotlive linky jsou:')
cenalinky = cenalinky
cenalinkyPuvodni = sum(cenalinky);

if UT == 1
BWOptNavrhu = maticeSpojuDTalter;
BWOptNavrhu = BWOptNavrhu';
BWOptNavrhu = BWOptNavrhu(:);
ind3 = find(BWOptNavrhu > 0);
[x,y] = size(ind3);

for i=1:x
BWPoOptalter(i,1)=BWOptNavrhu(ind3(i,1));%potrebuji sloupcovy vektor bez nul 
end 

[cenalinky] = CenaLinky (delkaPoOpt, BWPoOptalter, jednotkaBW, cenaza1m, cenaza1b); %vypocet ceny linky
disp('Naklady na jednotlive linky po zmene kapaci jsou:')
cenalinkyalter = cenalinky
cenalinkyalter = sum(cenalinky);
end

SumaCenySredDleToku = cenalinkyPuvodni + cenacelkemuzluPuvodni;
disp(sprintf('Celkove naklady navrhu jsou: %9.9f\n',SumaCenySredDleToku))

if UT == 1
SumaCenySredDleTokuAlter = cenalinkyalter + cenacelkemuzluAlter;
disp(sprintf('Celkove naklady navrhu po zmene kapacit jsou: %9.9f\n',SumaCenySredDleTokuAlter))

RozdilAlternativ = SumaCenySredDleTokuAlter - SumaCenySredDleToku;
disp(sprintf('Rozdil nakladu obou moznosti: %9.9f\n',RozdilAlternativ))
end

celkovacena = sum(celkovacena);
rozdilNakladu = SumaCenySredDleToku - celkovacena;
disp(sprintf('Rozdil v nakladech proti vychozimu stavu je: %9.9f\n',rozdilNakladu))

if UT == 1
rozdilNakladualter = SumaCenySredDleTokuAlter - celkovacena;
disp(sprintf('Rozdil v nakladech proti vychozimu stavu po zmene kapacit je: %9.9f\n',rozdilNakladualter))
end

%konecne vykresleni
vyslednyGraf = sparse(maticeSpojuDT);

grafCelk = biograph(vyslednyGraf,[], 'Label', 'Celkovy navrh struktury site','Description', 'CelkovyNavrh','EdgeType', 'curved','ShowArrows','off','LayoutScale', 3.0);
view(grafCelk)

vyslednyNavrh = SumaCenySredDleToku;
end