%Hry proti přírodě - rozhodování za rizika
close all, clear all, clc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Zadejte matici plateb A a vektor pravděpodobností p, obsahující pravděpodobnosti 
%volby některého ze stavů přírody. 
%Např. v následujícím tvaru:
% A=[1 -1 2 3; 2 -2 3 1;4 5 -1 2]
% p=[0.1 0.5 0.2 0.2]

%Vektor p musí obsahovat tolik prvků, kolik má matice A sloupců.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Příklady vstupních parametrů:
%příklad z [6]
% A=[1 -1 2 3; 2 -2 3 1;4 5 -1 2]
% p=[0.1 0.5 0.2 0.2]

%Priklad z [14]:
% A=[0 50 80 150 300;50 80 100 120 150 ; -100 0 50 300 500]
% p=[0.15 0.35 0.3 0.15 0.05]

%Priklad z [12]:
% A=[160 160 160;-40 480 480; -240 280 800]
% p=[0.3 0.5 0.2]

% A=[230 300;270 290]
% p=[1/8 7/8]

% A=[500 500 500; 220 580 580; 200 560 972]
% p=[0.3 0.1 0.6]

% A=[95 120 120 120; 90 115 140 140; 85 110 135 160]
% p=[0.2 0.3 0.3 0.2]

% A=[11 -0.5; 101 -50]
% p=[0.6 0.4]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Zadejte vstupní parametry:




%kód algoritmu:
size_check=1;
p_check=1;
[~,length_p] = size(p);
[m,n]=size(A);
%kontrola velikosti matice
if (m>=2 && n>=2)
    size_check=1;
end

%kontrola, zda vektor pravdepodobnosti ma soucet==1 a stejny pocet prvku, jako ma matice A pocet sloupcu n
if sum(p)~=1
    disp('Chyba: součet všech pravděpodobností ve vektoru p musí být roven 1.');
    p_check=0;
end

if length_p~=n
    disp('Chyba: počet prvků ve vektoru p musí byt roven počtu sloupců v matici A.');
    p_check=0;
end
E_payoff=zeros(1,m);
if (size_check==1 && p_check==1)
    for i=1:m
        for j=1:n
            E_payoff(1,i)=E_payoff(1,i)+A(i,j)*p(j);
        end
    end
    %prilis mala desetinna cisla, ktera vznikaji scitanim sum(A(i,j)*p(j)) nejsou exaktne reprezentovany v binarni
    %forme. Pro porovnavani se pouziva zaokrouhleni na velmi male hodnoty:
    E_payoff=round(E_payoff,10);
    max_E_payoff=max(E_payoff);
    max_payoff_indices=find(ismember(E_payoff,max_E_payoff));
    
    disp('..........................................................................');
    disp('Rozhodování za rizika - pravidlo očekávané (střední) hodnoty:');
    for i=1:m
        fprintf('Střední hodnota výhry prvního hráče při volbě strategie x%g je:E(x(%g))=%g\n',i,i,E_payoff(1,i));
    end
    %pokud je vic stejnych maximalnich strednich hodnot vyher:
    if (length(max_payoff_indices)>1)
        disp('Maximální střední hodnoty výhry prvního hrače:');
        for i=1:length(max_payoff_indices)
            fprintf('Střední hodnota výhry prvního hráče při volbě strategie x%g je: E(x(%g))=%g\n',max_payoff_indices(i),max_payoff_indices(i),E_payoff(1,max_payoff_indices(i)));
        end
        disp('Očekávané střední hodnoty výher jsou si rovny. Nelze tímto pravidlem tedy jednoznačně určit optimální strategii.');
        %pokud je jedna maximalni stredni hodnota vyher:
    else
        fprintf('První hráč zvolí optimální strategii x%g, neboť tato strategie mu zajistí nejvyšší hodnotu střední výhry: E(x(%g))=%g.\n',max_payoff_indices,max_payoff_indices,E_payoff(1,max_payoff_indices));
    end
    
    disp('..........................................................................');
    disp('Rozhodování za rizika - pravidlo očekávané (střední) výhry a rozptylu:');
    var=zeros(1,m);
    for i=1:m
        for j=1:n
            var(1,i)=var(1,i)+((A(i,j)-E_payoff(1,i))^2)*p(j);
        end
    end
    %zaokrouhleni pro velmi male hodnoty
    var=round(var,10);
    
    for i=1:m
        fprintf('Střední hodnota výhry prvního hráče při volbě strategie x%g je: E(x(%g))=%g s rozptylem: Var(x(%g))=%g \n',i,i,E_payoff(1,i),i,var(1,i));
    end
    
    disp('......');
    disp('Vyhledání nedominovaných strategií:');
    %vyhledani hodnot s nejvyssi stredni vyhrou a nejnizsim rozptylem
    %a odstraneni dominovanych strategii
    
    %zaznamenani nedominovanych strategii, pro ktere plati:
    %  EX1 >= EX2 && VX1 < VX2 nebo jestli EX1 > EX2 && VX1 <= VX2
    
    nondominated_indices_1_count=1;
    for i=1:m
        for j=1:m
            if ((E_payoff(1,i)>=E_payoff(1,j) && var(1,i)<var(1,j)))
                fprintf('E(x(%g)=%g >= E(x(%g))=%g a současně Var(x(%g))=%g < Var(x(%g))=%g \n',i,E_payoff(1,i),j,E_payoff(1,j),i,var(1,i),j,var(1,j));
                nondominated_indices_1(nondominated_indices_1_count)=i;
                nondominated_indices_1_count=nondominated_indices_1_count+1;
            end
        end
    end
    disp('......');
    nondominated_indices_2_count=1;
    for i=1:m
        for j=1:m
            if ((E_payoff(1,i)>E_payoff(1,j) && var(1,i)<=var(1,j)))
                fprintf('E(x(%g)=%g > E(x(%g))=%g a současně Var(x(%g))=%g <= Var(x(%g))=%g \n',i,E_payoff(1,i),j,E_payoff(1,j),i,var(1,i),j,var(1,j));
                nondominated_indices_2(nondominated_indices_2_count)=i;
                nondominated_indices_2_count=nondominated_indices_2_count+1;
            end
        end
    end
    nondominated_indices_1_count=nondominated_indices_1_count-1;
    nondominated_indices_2_count=nondominated_indices_2_count-1;
    if (nondominated_indices_1_count>=1 && nondominated_indices_2_count>=1)
        nondominated_indices=union(nondominated_indices_1,nondominated_indices_2);
        
    else
        if (nondominated_indices_1_count>=1)
            nondominated_indices=nondominated_indices_1;
        end
        
        if (nondominated_indices_2_count>=1)
            nondominated_indices=nondominated_indices_2;
        end
        disp('..........................................................................');
        if (nondominated_indices_1_count==0 && nondominated_indices_2_count==0)
            disp('Nepodařilo se najít žádné dominující strategie.');
            for i=1:m
                A_nondominated(i,1)=E_payoff(i);
                A_nondominated(i,2)=var(i);
                A_nondominated(i,3)=i;
                A_nondominated_sortedby_E=sortrows(A_nondominated,1,'descend');
                A_nondominated_sortedby_var=sortrows(A_nondominated,2);
            end
            disp('Strategie uspořádané podle nejvyšší očekávané výhry:´');
            for i=1:m
                fprintf('x%g: E(x(%g))=%g s rozptylem: V(x(%g))=%g \n',A_nondominated_sortedby_E(i,3),A_nondominated_sortedby_E(i,3),A_nondominated_sortedby_E(i,1),A_nondominated_sortedby_E(i,3),A_nondominated_sortedby_E(i,2));
            end
            disp('...');
            disp('Strategie uspořádané podle nejnižšího rozpytlu (nejmenšího rizika):´');
            for i=1:m
                fprintf('x%g: E(x(%g))=%g s rozptylem: V(x(%g))=%g \n',A_nondominated_sortedby_var(i,3),A_nondominated_sortedby_var(i,3),A_nondominated_sortedby_var(i,1),A_nondominated_sortedby_var(i,3),A_nondominated_sortedby_var(i,2));
            end
            return;
        end
    end
    for i=1:length(nondominated_indices)
        A_nondominated(i,1)=E_payoff(nondominated_indices(i));
        A_nondominated(i,2)=var(nondominated_indices(i));
        A_nondominated_sortedby_E=sortrows(A_nondominated,1,'descend');
        A_nondominated_sortedby_var=sortrows(A_nondominated,2);
    end
    
    disp('Nedominované strategie uspořádané podle nejvyšší očekávané výhry:')
    for i=1:length(nondominated_indices)
        fprintf('x%g: E(x(%g))=%g s rozptylem: V(x(%g))=%g \n',nondominated_indices(i),nondominated_indices(i),A_nondominated_sortedby_E(i,1),nondominated_indices(i),A_nondominated_sortedby_E(i,2));
    end
    
     fprintf('\n');
    
    disp('Strategie uspořádané podle nejnižšího rozpytlu (nejmenšího rizika):´');
    for i=1:length(nondominated_indices)
        fprintf('x%g: E(x(%g))=%g s rozptylem: V(x(%g))=%g \n',nondominated_indices(i),nondominated_indices(i),A_nondominated_sortedby_var(i,1),nondominated_indices(i),A_nondominated_sortedby_var(i,2));
    end
else
    if(size_check==0)
        disp('Chyba: Matice A musí mít rozměry alespoň 2x2.');
    end
end



