% Traineren und Validierung
tic  %Measure performance using stopwatch timer. Am Ende des Programm muss toc stehen.
% Anzahl der zu bestimmenden erfolgreichen Netze.
grenze_erfolg = 20;
% Anzahl der der insgesamt zu bestimmenden Netze.
grenze_gesamt = 300;
P0 = val.P;
T0 = val.T;

% l1= Anzahl der Neuronen in der ersten verbogenen Schichte.Die Iteration läuft von 1 bis 10
for l1 = 1:1:10
    
    %l2= Anzahl der Neuronen in der zweiten verbogenen Schicht. Die
    %Iteration läuft von 1 bis 10.
    
    for l2= 1:1:10
        
        %{
          
        
        Definition eines Netzes mit: 
        7 Neuronen in der Eingabeschicht,
        l1 Neuronen in der ersten verborgenen Schicht
        l2 Neuronen in der zweiten verborgenen Schicht
        1 Neuron in der Ausgabe Schicht
               
        %}
                   
           
         
        net = newff (P0,T0,[l1,l2,1],{'tansig','tansig','purelin'},...
        'trainlm','learngdm',...
        {'fixunknowns','removeconstantrows','mapminmax'},...
        {'removeconstantrows','mapminmax'},'dividerand' );
        
        
      % Levenberg-Marquadt als Trainingsfunktion. Bei grossen Lernmengen
      % nicht anwenden
      net.trainFcn= 'trainlm'; 
      
      % Alternativen
      % net.trainFcn = 'traingdm'; %Gradientenabstieg mit konst. Lernrate
      % und Momentum.
      % net.trainParam.lr = 0.5; % Lernrate
      % net.trainparam.mc = 0.9;% Momentum
      
      %net.trainFcn = 'traingdx'; Gradientenabstieg  mit aaptive Lernrate
      %und momentuum
      % net.trainParam.lr = 0.5; % Lernrate
      % net.trainparam.mc = 0.9;% Momentum
      
      % net.trainFcn = 'trainrp'; % Resilien Backpropagation
      
      net.performFcn = 'sse';% Performance-Fkt des Netzes ist sum Squared error
      % Alternativen
      
      % net.performFcn = 'mse'; % mean squared error
      
      % net.performFcn = 'mae'; % mean absolute error
      
      % net.performFcn = 'msereg'; % mean squared error with regularization.
      % net.performParam.ratio = 0.5;
      
    
      % Beeinflussung der Initialisierungsfunktion
      % Zufällige Initialisierung von Layern mit dem
      % Nguyen-Widrow-Algorithmus
      
      %{
      net.InitFcn = 'initlay';
       net.layers{1}.netInputFcn='netsum';
       net.layers{2}.netInputFcn='netsum';
       net.layers{3}.netInputFcn='netsum';
       net.layer{1}.InitFcn = 'Initnw';
       net.layer{2}.InitFcn = 'Initnw';
       net.layer{3}.InitFcn = 'Initnw';
      
       %}
       
      
      
     
      
      % Maximal TrainingszyklenZahl
      net.trainParam.epochs =500;
      %Keine Ausgabe
      net.trainParam.show = NaN;
      %Netzfehler
      net.trainParam.goal = 1;
      % Abbruch bei einem Wert unter dem minimalen Gradient
      net.trainParam.min_grad = 1e-10;
      
      % Erflog zum Aufzählen der Anzahl der erfolgreich berechneten Netze
      erfolg = 0;
      
      % Gesamtzahl der berechneten Netze
      gesamt = 0;
      
      % Fortstrittsbalken
      bar = waitbar(0,['Dimension',int2str(l1),'-', int2str(l2),'-1']);
      
     % Array der MSE der erfolgreichen Netze
     error =[];
     
     % Trainieren der Netze um die Grundlage zu schaffen
     while( erfolg < grenze_erfolg && gesamt < grenze_gesamt)
        
         % Das Netz wird mit Zufallsvariablen initialisiert
         net = init(net);
         
         %{ 
         Trainieren des Netzes
         
         Eingabewerte:
           net: Untrainiertes Netz
           traininput: Eingabe-Trainingsdaten
           traintarget: Ausgabe-/Ziel-Trainingsdaten
         Rueckgabewerte:
           net: Trainiertes Netz
           tr: Training record
           Y: Netzausgabe
           E: Netzfehler
           
          %}
         [net,tr,Y,E,Pf,Af] = train(net,traininput',traintarget') %,[],[],val);
         
         % FortschrittsBalken weiter
         waitbar( grenze/grenze_gesamt,bar);
         
        %Zähler vom "grenze erhöhen"
        grenze = grenze+1;
        
      
            
        
           
         
                
         
       
         
         
         
         
         
         
     end
         
      
      
       
      % Fortschrittsbalken schliessen
      close(bar);
 end
    
    
    
    
end
toc
    
    
    