
clear all;
close all;
clc;

% numero de execuções
nexec = 5;

% Definir problema [optP] e numero de objetivos [nobj]
% optP: 1 - DTLZ1 / 2 - DTLZ2 / Outros - DTLZ3
% nobj: 3 ou 5 objetivos

for optP = [1 2]
    for nobj = [3 5]
        
        % define número de cálculos (baseado no artigo Deb & Jain)
        if (optP == 1)
            if (nobj == 3)
                naval = 91 * 400;
            else
                naval = 210 * 600;
            end
        elseif (optP == 2)
            if (nobj == 3)
                naval = 91 * 250;
            else
                naval = 210 * 350;
            end
        else
            if (nobj == 3)
                naval = 91 * 1000;
            else
                naval = 210 * 1200;
            end
        end
        
        % chamada da função
        t = cputime();
        
        [xbest, ybest, IGDbest, IGDmean, IGDworst] = arthuramf(naval, optP, nobj, nexec);
        
        t = cputime() - t;
        
        % imprime resultados
        fprintf('Problema %d (%d objetivos) IGD - mínimo: %2.2e\tmédio: %2.2e\tmáximo: %2.2e\t\t (%2.2f segundos/exec)\n',optP,nobj,IGDbest,IGDmean,IGDworst,t/nexec);
        
        % carrega fronteira pareto real do problema
        prob = strcat('dtlz',num2str(optP),'_',num2str(nobj),'D.mat');
        load(prob);
        
        % plota gráfico dos resultados
        if (nobj == 3)
            figure();
            hold on;
            plot3(fronteiraReal(:,1),fronteiraReal(:,2),fronteiraReal(:,3),'.b','linewidth',2);
            plot3(ybest(:,1),ybest(:,2),ybest(:,3),'or');
            grid on;
            view(60,30);
            if (optP == 1)
                axis(0.5 * [0 1 0 1 0 1]);
            else
                axis([0 1 0 1 0 1]);
            end
            drawnow();
            legend('Fronteira Pareto', 'Soluções Não Dominadas')
            xlabel('f1');
            ylabel('f2');            
            zlabel('f3');            
        else
            ymax = max(ybest);
            ymin = min(ybest);
            yn = ybest-repmat(ymin,size(ybest,1),1);
            yn = yn./repmat((ymax-ymin),size(ybest,1),1);
            figure();
            parallelcoords(yn);
            xlabel('Objetivo');
            ylabel('Valor Normalizado');            
        end
    end
end

              
