public void runIteration(final int iterations) {
		Schedule schedule = best;
		for(int i=0;i<iterations;i++) {
			// perturb
			final Schedule perturbed = (Schedule)schedule.clone();
			// number of changes to be made
			final int changes = (int)(Random.generateDouble() * cachedSortedSectionIds.length * PERTURB) + 1;
			for(int j=0;j<changes;j++) {
				// randomly select a section
				final String section = cachedSortedSectionIds[(int) (Random.generateDouble() * cachedSortedSectionIds.length)];
				// randomly reassign it
				perturbed.move(section, (int) (Random.generateDouble() * Schedule.SLOTS));
			}
			// delta OF1
			final double change = perturbed.getRank() - schedule.getRank();
			// if better, accept
			if(change < 0)
				schedule = perturbed;
			// otherwise accept with probability
			else if(Random.generateDouble() < Math.pow(Math.E, -change / temperature))
				schedule = perturbed;
			//save best so far
			if (schedule.getRank() < best.getRank())
				best = schedule;
		}
		// decrease temperature
		temperature *= PHI;
	}