%Multikriteriální rozhodování - ordinální informace, metoda váhové kriteriální funkce
close all, clear all, clc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Zadejte kriteriální matici Y a vektor vah v, např. následovně:
% Y=[6 8 4 5;4 12 3 4;5 10 2 12]
% v=[1/4 1/8 1/2 1/8]

%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říklady vstupních parametrů:

%Příklad z [9]:
% Y=[6 8 4 5;4 12 3 4;5 10 2 12]
% v=[1/4 1/8 1/2 1/8]

% Y=[6 8 4 5;9 12 5 4;17 4 6 4; 8 6 10 5; 12 1 3 2]
% v=[1/4 1/4 1/4 1/4]

% Y=[6 8 4; 9 12 4; 17 6 4; 8 10 5; 1 3 2; 2 5 6; 7 8 9; 2 1 5]
% v=[1/3 1/3 1/3]

% Y=[6 8; 1 6; 2 4; 1 5]
% v=[1/8 7/8]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%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 vahovy vektor v ma 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)
    weighted_sum_function=zeros(1,m);
    for i=1:m
        for j=1:n
            weighted_sum_function(i)=weighted_sum_function(i)+(v(j)*Y(i,j));
        end
    end
    disp('________________________________________________');
    fprintf('Podle metody váhové kriteriální funkce je optimální varianta a_%d: \n',find(weighted_sum_function==max(weighted_sum_function)));
    Y_a_optimal=Y(find(weighted_sum_function==max(weighted_sum_function)),:)
    fprintf('s funkční hodnotou: %g\n',max(weighted_sum_function));
    disp('________________________________________________');
    %pridani posledniho sloupce s funkcni hodnotou kriterialni funkce:
    Y(:,[end+1])=999; %placeholder pro rozsireni posledniho sloupce matice
    for i=1:m
        Y(i,end)=weighted_sum_function(i);
    end
    %serazeni kriterialni matice sestupne podle funkcni hodnoty kriterialni funkce:
    Y_sorted=sortrows(Y,n+1,'descend');
    
    fprintf('Kriteriální matice seřazená sestupně podle funkční hodnoty kriteriální funkce (poslední sloupec):');
    Y_sorted
    
else
    if(size_check==0)
        disp('Chyba: Matice Y musí mít rozměry alespoň 2x2.');
    end
end



