public static void main(String[] args) throws InstantiationException, IllegalAccessException
    {
        Organism.mutationMethod = MUTATION_MODE.newInstance();
        Organism.perfectOrganism = new Organism(GOAL_ORGANISM_COLOR);
        
        final ArrayList<Organism> organism = new ArrayList<Organism>();
        final Random rnd = new Random();
        
        System.out.println("Starting Simulation...");
        
        System.out.print("Building Random Population... ");
        for (int i = 0; i < POPULATION; i++)
        {
            organism.add(new Organism(rnd.nextInt(255), rnd.nextInt(255), rnd.nextInt(255)));
        }
        System.out.println("Done.");
        
        
        System.out.println();
        
        System.out.println("Initial Set: ");
        for (int i = 0; i < POPULATION; i++)
        {
            System.out.println(organism.get(i).toString());
        }
        printAverageFitness(organism);
        System.out.println();
        
        
        for (int g = 1; g <= GENERATIONS; g++)
        {
            //System.out.print("Simulating Generation #" + g + "... ");
            
            // Some Organisms Die
            for (int i = 0; i < POPULATION * DECAY_RATE; i++)
            {
                Organism lowestOrg = null;
                int lowestScore = Integer.MIN_VALUE;
                
                for (Organism org : organism)
                {
                    int score = org.rollWeightedDie();
                    
                    if (score > lowestScore)
                    {
                        lowestOrg = org;
                        lowestScore = score;
                    }
                }
                
                organism.remove(lowestOrg);
            }
            
            // Reproduction to fill the open slots in population
            for (int i = organism.size(); i < POPULATION; i++)
            {
                int p1 = rnd.nextInt(organism.size());
                int p2 = p1;
                while (p2 == p1) p2 = rnd.nextInt(organism.size());
                
                organism.add(new Organism(organism.get(p1), organism.get(p2)));
            }
            //System.out.println("Done.");
        }
        
        System.out.println("Ending Set: ");
        for (int i = 0; i < POPULATION; i++)
        {
            System.out.println(organism.get(i).toString());
        }
        printAverageFitness(organism);
        System.out.println("End of Simulation.");
    }