public void newGeneration(){		
		List<Chromo<T>> freshPop = new ArrayList<Chromo<T>>(size);
		
		freshPop.addAll(getElite());
		
		
		while (freshPop.size() < size){		
			Chromo<T> offspring1 = rouletteSelection();
			Chromo<T> offspring2 = rouletteSelection();
	    	
	    	crossOver(offspring1, offspring2);
	    	
	    	freshPop.add(mutateGenes.apply(rand, offspring1));
	    	if (freshPop.size() == size)
	    		break;
	    	freshPop.add(mutateGenes.apply(rand, offspring2));
		}
		
		this.individuals = freshPop;
		setFitnessValues();
		this.generation_num++;
	}