%Multikriteriální rozhodování - metoda váženého součtu
close all, clear all, clc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Zadejte kriteriální matici Y a vektor vah v, např. následovně:
% Y=[14 90 4 4.3 0 5;
%     29 58 8 0 7 1;
%     11 60 6 2.5 6 7;
%     54 80 0 2.2 1 10;
%     42 72 4 7.7 5 8;
%     0 96 3 6.1 3 6]
% 
% v=[0.07 0.24 0.33 0.19 0.09 0.08]

%Všechna kritéria musí být maximalizačního typu.
%Vektor vah v musí obsahovat tolik prvků, kolik má matice Y sloupců a
%celkový součet všech vah musí nabývat hodnoty 1.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Příklad vstupních parametrů:

% příklad z [15]:
% Y=[9500 3 40 2;
%    13000 1.5 20 3;
%    12000 1.5 40 1;
%    16000 0 20 0;
%    0 4 80 4]
% 
% v=[0.55 0.25 0.12 0.08]

%příklad z diplomové práce
% Y=[9500 500 16 19700 19500;
%     12000 1000 16 17500 19500;
%     3000 2000 32 20000 20000;
%     5000 1000 32 19000 21000;
%     12000 500 16 18000 19750;
%     0 2000 64 19750 21400;
%     2000 1000 32 20000 22000]
% 
% v=[0.40 0.1 0.1 0.15 0.25]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Zadejte vstupní parametry:




%kód algoritmu:
size_check=1;
[m,n]=size(Y);
v_check=1;
[~,length_v] = size(v);
%kontrola velikosti matice Y
if (m>=2 && n>=2)
    size_check=1;
end

%kontrola, zda ma vahovy vektor v soucet==1 a stejny pocet prvku jako ma
%kriterialni matice Y pocet sloupcu n
if sum(v)~=1
    disp('Chyba: součet všech vah ve vektoru v musí být roven 1.');
    fprintf('součet vektoru váh v=%g\n',sum(v));
    v_check=0;
end

if length_v~=n
    disp('Chyba: počet prvků ve vektoru v musí byt roven počtu sloupců v matici Y.');
    v_check=0;
end
if (size_check==1 && v_check==1)
    
    H=max(Y)
    D=min(Y)
    Y_normalized=zeros(m,n);
    for i=1:m
        for j=1:n
            Y_normalized(i,j)=(Y(i,j)-D(j))/(H(j)-D(j));
        end
    end
    
    
    disp('________________________________________________');
    disp('Normalizovaná kriteriální matice:');
    Y_normalized
    
    utility_function=zeros(1,m);
    for i=1:m
        for j=1:n
            utility_function(i)=utility_function(i)+(Y_normalized(i,j)*v(j));
        end
    end
    
    fprintf('Podle metody váženého součtu je optimální varianta a_%d s hodnotami kritérií: \n',find(utility_function==max(utility_function)));
    Y_normalized_a_optimal=Y_normalized(find(utility_function==max(utility_function)),:);
    fprintf('%g ',Y_normalized_a_optimal);
    fprintf('\n');
    fprintf('s maximální funkční hodnotou užitkové funkce: %g\n',max(utility_function));
    disp('________________________________________________');
    %pridani posledniho sloupce s funkcni hodnotou kriterialni funkce:
    Y_normalized(:,[end+1])=999; %placeholder pro rozsireni posledniho sloupce normalizovane kriterialni matice
    for i=1:m
        Y_normalized(i,end)=utility_function(i);
    end
    %serazeni kriterialni matice sestupne podle funkcni hodnoty kriterialni funkce:
    Y_normalized_sorted=sortrows(Y_normalized,n+1,'descend');
    
    fprintf('Normalizovaná kriteriální matice seřazená sestupně podle funkční hodnoty užitkové funkce (poslední sloupec): \n');
    Y_normalized_sorted
else
    if(size_check==0)
        disp('Chyba: Matice Y musí mít rozměry alespoň 2x2.');
    end
end



