public void kickStartSimulatedAnnealing(){
		OutputWriter.println(SA_START_MSG);
		AnnealedProgramsGatherer gatherer = new AnnealedProgramsGatherer();
		List<Thread> annealedSimulators = new ArrayList<Thread>();
		List<Program> toAnneal = selectionCrossoverOp.select(population, populationSize/2 + 1);
		List<Thread> threads = new ArrayList<Thread>();
		for(final Program program: toAnneal) {
			Thread t = new Thread(new SimulatedAnnealingThread(program.clone(), gatherer, population.getFitnessFunction()));
			threads.add(t);
			t.start();
		}
		try {
			for(Thread t: threads)
				t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		population.clear();
		population.addAllPrograms(gatherer.getAnnealed());
		doIteration();
	}