public GCPPopulation nextGeneration() 
	{
		GCPPopulation newPop = (GCPPopulation) factory(false);
		
		int size = conf.getInt( "population_size" );
		GCPIndividual[] children = new GCPIndividual[size];

		int[] selected = this.selectIndividuals();
		newPop.minValidColor = this.minValidColor;

		for(int i = 0 ; i < children.length; i++)
		{
			Individual parent1 = this.generation[ selected[selectParent()] ];
			Individual parent2 = this.generation[ selected[selectParent()] ];
			children[i] = (GCPIndividual) parent1.reproduce( parent2 );
			
			if( children[i].isValid() && children[i].getMaxColor() < this.minValidColor )
				minValidColor = children[i].getMaxColor();
		}
		
		newPop.setIndividuals(children);
		return newPop;
	}