https://thecode.media/simulated-annealing/