Class: Pso::Solver

Inherits:
Object
  • Object
show all
Defined in:
lib/pso/solver.rb

Instance Method Summary collapse

Constructor Details

#initialize(din: 5, density: 50, f: Pso::Rastrigin, center: ZeroVector[0,0,0,0,0], radius: 5.12, method: :min_by) ⇒ Solver

Returns a new instance of Solver.



8
9
10
11
12
13
14
15
16
17
# File 'lib/pso/solver.rb', line 8

def initialize(din: 5, density: 50, f: Pso::Rastrigin, center: ZeroVector[0,0,0,0,0], radius: 5.12, method: :min_by)
  @f = f.new
  @din = din
  @center = center
  @radius = radius
  @method = method
  @density = density

  generate_swarm
end

Instance Method Details

#generate_random_noise_particleObject



26
27
28
# File 'lib/pso/solver.rb', line 26

def generate_random_noise_particle
  @center.map { rand * 2 - 1 }
end

#generate_random_particleObject



30
31
32
# File 'lib/pso/solver.rb', line 30

def generate_random_particle
  @center + (generate_random_noise_particle * (@radius * rand))
end

#generate_swarmObject



19
20
21
22
23
24
# File 'lib/pso/solver.rb', line 19

def generate_swarm
  Array.new(@density)
  @swarm = Array.new(@density) { generate_random_particle }
  @swarm_best = @swarm.map { |particle| [@f.f(particle), particle] }
  @swarm_speed = @swarm.map { generate_random_particle }
end

#perfect_particleObject



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/pso/solver.rb', line 34

def perfect_particle
  if @method == :min_by
    @swarm.min_by do |element|
      @f.f(element)
    end
  else
    @swarm.max_by do |element|
      @f.f(element)
    end
  end
end

#solve(precision: 200000, threads: 1) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/pso/solver.rb', line 46

def solve(precision: 200000, threads: 1)
  Array.new(threads).map do
    Thread.new do
      ((precision / @swarm.size) / threads).times do |interation_number|
        for index in 0...@density
          perfect = perfect_particle
          puts @f.f perfect
          new_vector = normalize(interate(@swarm[index], @swarm_best[index].last, perfect, @swarm_speed[index]))
          @swarm_best[index] = [@f.f(new_vector), new_vector] if is_best(@swarm_best[index].first, @f.f(new_vector))
          @swarm_speed[index] = (new_vector - @swarm[index]).normalize
          @swarm[index] = new_vector
        end
      end
    end
  end.each do |thread|
    thread.join
  end

  perfect = perfect_particle
  [@f.f(perfect), perfect]
end