Class: Pso::Solver
- Inherits:
-
Object
- Object
- Pso::Solver
- Defined in:
- lib/pso/solver.rb
Instance Method Summary collapse
- #generate_random_noise_particle ⇒ Object
- #generate_random_particle ⇒ Object
- #generate_swarm ⇒ Object
-
#initialize(din: 5, density: 50, f: Pso::Rastrigin, center: ZeroVector[0,0,0,0,0], radius: 5.12, method: :min_by) ⇒ Solver
constructor
A new instance of Solver.
- #perfect_particle ⇒ Object
- #solve(precision: 200000, threads: 1) ⇒ Object
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_particle ⇒ Object
26 27 28 |
# File 'lib/pso/solver.rb', line 26 def generate_random_noise_particle @center.map { rand * 2 - 1 } end |
#generate_random_particle ⇒ Object
30 31 32 |
# File 'lib/pso/solver.rb', line 30 def generate_random_particle @center + (generate_random_noise_particle * (@radius * rand)) end |
#generate_swarm ⇒ Object
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_particle ⇒ Object
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 |