public Program anneal(){
		int cycles = 1; Random randomizer = new Random();
		while(temperature > minTemperature){
			Program clone = program.clone();
			int selectedReaction = randomizer.nextInt(program.getReactionNo());
			int sign = 0;
			Double newKineticRate =randomizer.nextDouble() + sign;
			
			clone.getReactions().get(selectedReaction).updateKineticRate(newKineticRate);
			double newFitness = fct.computeFitness(clone);
			if(newFitness < fitness || Math.random() < Math.exp(-(newFitness - fitness)/temperature)){ 
				fitness = newFitness;
				program = clone;
				if(plotter != null){
					plotter.newGenerationCreatedNotification(fitness, program);
				}
			} else {
				//System.out.println("Dismissed: " + newFitness);
			}
			if(cycles % maxCyclesPerTemperature == 0) {
				temperature = ratio(cycles) * temperature;
			}
			
			cycles++;
		}
		program.setFitness(fitness);
	    gatherer.addProgram(program);
		//System.out.println(log);
		return program;
	}