private ArrayList<ArrayList<Integer>> createGen() {

        ArrayList<ArrayList<Integer>> nextGen = new ArrayList<ArrayList<Integer>>();
        double fitSum = getFitSum();
        for (int i = 0; i < currGen.size(); i++) {
            nextGen.add(new ArrayList<Integer>());
            int parentOne = getIndividual(fitSum);
            int parentTwo = getIndividual(fitSum);
            int crossOverPoint = rand.nextInt() % currGen.get(i).size();

            double shouldCross = rand.nextDouble();
            if (shouldCross <= crossRate) {
                for (int j = 0; j < currGen.get(i).size(); j++) {
                    
                    double shouldMutate = rand.nextDouble();
                    if (shouldMutate <= mutRate) {
                        nextGen.get(i).add(individual.mutate(j));
                    } else {
                        if (j < crossOverPoint) {
                            nextGen.get(i).add(currGen.get(parentOne).get(j));
                        } else {
                            nextGen.get(i).add(currGen.get(parentTwo).get(j));
                        }
                    }
                }
            } else {
                for (int j = 0; j < currGen.get(i).size(); j++) {
                    
                    double shouldMutate = rand.nextDouble();
                    if (shouldMutate <= mutRate) {
                        nextGen.get(i).add(individual.mutate(j));
                    } else {
                        nextGen.get(i).add(currGen.get(parentOne).get(j));

                    }
                }
            }

        }

        return nextGen;
    }