public void generateNewGeneration() {
        //Halt all of the ImageManager threads from the previous generation to prevent slow-downs in the current
        // generation
        ImageManager.interruptThreads();

        //Add the old generation to the Stack of old generations if this is not the first generation
        if (fractals != null) {
            previous.push(fractals);
        }

        //Increment the generation count
        generation++;

        //Find all of the Fractals that the user has selected
        for (int i = 0; i < GraphicalInterface.selectedFractals.length; i++) {
            if (GraphicalInterface.selectedFractals[i]) {
                selectedFractals.add(fractals.get(i));
            }
        }

        //Clear out the old Fractals
        fractals = new ArrayList<>(9);

        //Generate the new Fractals one by one
        Fractal newFractal;
        for (int i = 0; i < 9; i++) {
            //If there were no selected parents in the previous generation, just generate a new random Fractal
            if (selectedFractals.isEmpty()) {
                newFractal = new Fractal();
            }
            else {
                //Choose a random parent for the new Fractal from the pool of user-selected Fractals
                Fractal parent1 = selectedFractals.get((int) (Math.random() * selectedFractals.size()));
                //For the first row of Fractals, perform Cross-over
                if (i < 3) {
                        /*
                        Cross-over requires a second parent. Choose this second parent from the pool of user-selected
                         Fractals.
                        parent1 and parent2 can refer to the same Fractal.
                         */
                    Fractal parent2 = selectedFractals.get((int) (Math.random() * selectedFractals.size()));
                    newFractal = parent1.cross(parent2);
                    //Fill in information about the Fractal's creation
                    newFractal.setOperation("cross");
                    newFractal.setParents(parent1, parent2);
                }
                else if (i < 6) {
                    //For the second row of Fractals, perform mutation
                    newFractal = parent1.mutate();
                    newFractal.setOperation("mutate");
                }
                else {
                    //For the third row of Fractals, perform introduction
                    newFractal = parent1.introduce();
                    newFractal.setOperation("introduce");
                    newFractal.setParents(parent1, null);
                }
            }
            //Add the new Fractal to the new generation
            fractals.add(newFractal);
        }

        //Clear the list of selected Fractals
        selectedFractals.clear();
    }