package opt; import dist.Distribution; import shared.Instance; /** * A simulated annealing hill climbing algorithm * @author Andrew Guillory gtg008g@mail.gatech.edu * @version 1.0 */ public class SimulatedAnnealing extends OptimizationAlgorithm { /** * The current optimiation data */ private Instance cur; /** * The current optimization value */ private double curVal; /** * The current temperature */ private double t; /** * The cooling parameter */ private double cooling; /** * Make a new simulated annealing hill climbing * @param t the starting temperature * @param cooling the cooling exponent * @param hcp the problem to solve */ public SimulatedAnnealing(double t, double cooling, HillClimbingProblem hcp) { super(hcp); this.t = t; this.cooling = cooling; this.cur = hcp.random(); this.curVal = hcp.value(cur); } /** * @see shared.Trainer#train() */ public double train() { HillClimbingProblem p = (HillClimbingProblem) getOptimizationProblem(); Instance neigh = p.neighbor(cur); double neighVal = p.value(neigh); if (neighVal > curVal || Distribution.random.nextDouble() < Math.exp((neighVal - curVal) / t)) { curVal = neighVal; cur = neigh; } t *= cooling; return curVal; } /** * @see opt.OptimizationAlgorithm#getOptimal() */ public Instance getOptimal() { return cur; } }