public List< List<Double>> backPropagation(List<Organism> chromosomes) throws Exception {
        /**
         * Прогонять выборку надо несколько эпох. Чем больше номер генерации ГА,
         * тем больше эпох.
         */
        int numIterations = getNumIterations();

        // for every organism in population (at the begining)
        // and for every chromosome on the next steps
        for (Organism organ : chromosomes) {
            // errors on this organism for all samples for calculated number of Iterations
            List< List<Double>> curErrorOrgan = new ArrayList< List<Double>>();
            curErrorOrgan.add(new ArrayList<Double>()); //trainig
            curErrorOrgan.add(new ArrayList<Double>()); //testing
            curErrorOrgan.add(new ArrayList<Double>()); //validation

            for (int e = 0; e < numIterations; e++) {
                //take sous - Datas
                for (int i = 0; i < samples.size(); i++) {
                    double curErr = 0;
                    for (int j = 0; j < samples.get(i).size(); j++) {

                        //count fitness and error for every data line
                        List<Double> outNodes = new ArrayList<Double>();
                        outNodes.add(answers.get(samples.get(i).get(j)));
                        organ.setInputData(datas.get(samples.get(i).get(j)), outNodes);
                        // count fitness only for testing sample
                        if (i == 1) {
                            organ.countFitnessOut(j + 1);
                        } else {
                            organ.countFitnessOut();
                        }
                        //change weigths
                        organ.getNet().ajustmentWeigth();
                        curErr += organ.getError();
                    }
                    //error = avarege for all patients in this sample on current iteration
                    curErrorOrgan.get(i).add(curErr / samples.get(i).size());
                }
            }
            organ.setAverErrors(curErrorOrgan);
        }
        /**
         * explicit fitness sharing for species in population
         */
        //population.explicitFitness();

        /**
         * find best organism in population
         */
        boolean changed = population.setBestOrganism();
        if (changed) {
            return population.getBestOrganism().getAverErrors();
        }
        return null;
    }