class Annealing::Simulator

It runs simulated annealing

Attributes

cooling_rate[R]
temperature[R]

Public Class Methods

new(temperature: nil, cooling_rate: nil) click to toggle source
# File lib/annealing/simulator.rb, line 8
def initialize(temperature: nil, cooling_rate: nil)
  @temperature = temperature || Annealing.configuration.temperature
  @cooling_rate = cooling_rate || Annealing.configuration.cooling_rate

  raise 'Invalid initial temperature' if @temperature.negative?

  normalize_cooling_rate
end

Public Instance Methods

run(collection, calculator = nil) click to toggle source
# File lib/annealing/simulator.rb, line 17
def run(collection, calculator = nil)
  best = current = Pool.new(collection.shuffle, calculator)
  Annealing.logger.debug(" Original: #{current}")
  cool_down do |temp|
    current = current.solution_at(temp)
    best = current if current.better_than?(best)
  end
  Annealing.logger.debug("Optimized: #{best}")
  best
end

Private Instance Methods

cool_down() { |temp| ... } click to toggle source
# File lib/annealing/simulator.rb, line 30
def cool_down
  (temperature..0).step(cooling_rate).each { |temp| yield temp }
end
normalize_cooling_rate() click to toggle source
# File lib/annealing/simulator.rb, line 34
def normalize_cooling_rate
  @cooling_rate = -1.0 * cooling_rate if cooling_rate.positive?
end