@Override
	public void run() {

		initialize();
				
		newGeneration = new Chromosome[popsize];

		for (int k = 0; k < nGenerations; k++) {
			
			evaluate(population);
			Arrays.sort(population);
			
			System.out.println(
				"Iter: " + k + " Dur: " + population[0].getActualDuration()
			);

			// Elitism
			for (int i = 0; i < elitism; i++)
				newGeneration[i] = (Chromosome) population[i].clone();

			for (int i = elitism; i < popsize; i++) {
				
				Chromosome child = crossover(tourPick(), randomChoice());
				mutate(child);
				newGeneration[i] = child;
				
			}

			Chromosome[] pom = population;
			population = newGeneration;
			newGeneration = pom;
			
			if (configuration != null) configuration.increase();

		}
		
		evaluate(population);
		Arrays.sort(population);
		
		this.bestIndividual = (Individual) population[0];
		System.out.println("GA Best Project Duration: " + 
				this.bestIndividual.getActualDuration()
		);
		
		
	}