class Algorithmically::Stochastic::AdaptiveRandomSearch

Public Class Methods

new(max_iter, bounds, init_factor, s_factor, l_factor, iter_mult, max_no_impr) click to toggle source
# File lib/Algorithmically/Stochastic/adaptive_random_search.rb, line 6
def initialize(max_iter, bounds, init_factor, s_factor, l_factor, iter_mult, max_no_impr)
  problem_size = bounds
  @bounds1 = Array.new(problem_size) { |i| [-5, +5] }
  @max_iter = max_iter
  @init_factor = init_factor
  @s_factor = s_factor
  @l_factor = l_factor
  @iter_mult = iter_mult
  @max_no_impr = max_no_impr
  @best = search(@max_iter, @bounds1, @init_factor, @s_factor, @l_factor, @iter_mult, @max_no_impr)
  puts "Done. Best Solution: c=#{@best[:cost]}, v=#{@best[:vector].inspect}"
end

Public Instance Methods

large_step_size(iter, step_size, s_factor, l_factor, iter_mult) click to toggle source
# File lib/Algorithmically/Stochastic/adaptive_random_search.rb, line 43
def large_step_size(iter, step_size, s_factor, l_factor, iter_mult)
  step_size * l_factor if iter > 0 and iter.modulo(iter_mult) == 0
  step_size * s_factor
end
objective_function(vector) click to toggle source
# File lib/Algorithmically/Stochastic/adaptive_random_search.rb, line 19
def objective_function(vector)
  vector.inject(0) { |sum, x| sum + (x ** 2.0) }
end
rand_in_bounds(min, max) click to toggle source
# File lib/Algorithmically/Stochastic/adaptive_random_search.rb, line 23
def rand_in_bounds(min, max)
  min + ((max-min) * rand())
end
random_vector(minmax) click to toggle source
# File lib/Algorithmically/Stochastic/adaptive_random_search.rb, line 27
def random_vector(minmax)
  Array.new(minmax.size) do |i|
    rand_in_bounds(minmax[i][0], minmax[i][1])
  end
end
take_step(minmax, current, step_size) click to toggle source
# File lib/Algorithmically/Stochastic/adaptive_random_search.rb, line 33
def take_step(minmax, current, step_size)
  position = Array.new(current.size)
  position.size.times do |i|
    min = [minmax[i][0], current[i]-step_size].max
    max = [minmax[i][1], current[i]+step_size].min
    position[i] = rand_in_bounds(min, max)
  end
  position
end
take_steps(bounds, current, step_size, big_stepsize) click to toggle source
# File lib/Algorithmically/Stochastic/adaptive_random_search.rb, line 48
def take_steps(bounds, current, step_size, big_stepsize)
  step, big_step = {}, {}
  step[:vector] = take_step(bounds, current[:vector], step_size)
  step[:cost] = objective_function(step[:vector])
  big_step[:vector] = take_step(bounds, current[:vector], big_stepsize)
  big_step[:cost] = objective_function(big_step[:vector])
  return step, big_step
end