% Preprocessing für den Partitionsschätzer. Hier werden die Daten
% dimensionsweise auf das Intervall [0,1] gelegt. Nur die Extrema an beiden
% Rändern (in 1/100) werden aus dem Intervall gefiltert.

function [result] = neural_networks(X_l, Y_l, X_t, Y_t, X_eval, Y_eval , neurons_list)
    
    number_neurons=length(neurons_list);
    % und uebferfluessige Variablen loeschen
    clear X Y;
    
    
    networks=cell(number_neurons,1);
    errors=zeros(number_neurons,1);
    
    %best choice
    parfor nn=1:number_neurons
        
        net = newfit(X_l',Y_l',neurons_list(nn));
        net.divideParam.trainRatio=75/100;
        net.divideParam.valRatio=25/100;
        net.trainParam.showWindow=false;

        net=train(net,X_l',Y_l');
        Y_calc=max(sim(net,X_t'),0);
        networks{nn}=net;
        
        errors(nn)=sum((Y_calc'-Y_t).^2);       
        
    end
    
    [~, best_nn]=min(errors);
    Y_calc=max(sim(networks{best_nn},X_eval'),0);
    result.mse=mean((Y_calc'-Y_eval).^2);
    result.res=Y_calc'-Y_eval;
    result.param=neurons_list(best_nn);
    
    
end

