public void Run()
        {
            int     i          = 0;
            double  totalError = Double.PositiveInfinity;
            double  oldError   = Double.PositiveInfinity;
            double  totalGeneralisationError = Double.PositiveInfinity;
            double  oldGeneralisationError   = Double.PositiveInfinity;
            Boolean betterGeneralisation     = true;

            while (i < maxIterations && totalError > maxError && betterGeneralisation)
            {
                /* On met à jour les erreurs de l’itération précédente et on initialise les erreurs pour
                 * cette itération.*/
                oldError                 = totalError;
                totalError               = 0;
                oldGeneralisationError   = totalGeneralisationError;
                totalGeneralisationError = 0;

                // Evaluation
                foreach (DataPoint point in data.Points())
                {
                    /* Pour chaque point d’apprentissage, on calcule sa sortie et l’erreur commise,
                     * et on adapte les poids du réseau.*/
                    double[] outputs = network.Evaluate(point); // Tableau des sorties des différents neurones de sortie.
                    for (int outNb = 0; outNb < outputs.Length; outNb++)
                    {
                        // Calcal de l'erreur globale dans l'ensemble d'Apprentissage.
                        double error = point.Outputs[outNb] - outputs[outNb];
                        totalError += (error * error);
                    }

                    // Calcul des nouveaux poids par rétropropagation
                    network.AdjustWeights(point, learningRate);
                }

                // Généralisation
                foreach (DataPoint point in data.GeneralisationPoints())
                {
                    /*Pour chaque point de généralisation, on calcule la sortie et l’erreur.*/
                    double[] outputs = network.Evaluate(point);
                    for (int outNb = 0; outNb < outputs.Length; outNb++)
                    {
                        // Calcal de l'erreur globale dans l'ensemble de Généralisation.
                        double error = point.Outputs[outNb] - outputs[outNb];
                        totalGeneralisationError += (error * error);
                    }
                }
                if (totalGeneralisationError > oldGeneralisationError)
                {
                    betterGeneralisation = false; // Surapprentissage.
                }

                // Changer le taux
                if (totalError >= oldError)
                {
                    /* Si l’erreur en apprentissage augmente, c’est que le taux d’apprentissage est trop fort,
                     * on le divise alors par deux.*/
                    learningRate = learningRate / 2.0;
                }

                // Information et incrément
                ihm.PrintMsg("Iteration n°" + i + " - Total error : " + totalError + " - Gener Error : " + totalGeneralisationError + " - Rate : " + learningRate + " - Mean : " + String.Format("{0:0.00}", Math.Sqrt(totalError / data.Points().Length), "%2"));
                i++;
                // Affichage des valeurs sur l’itération en cours (erreurs et taux).
            }
        }