Class: MHL::PSOSwarm

Inherits:
GenericSwarmBehavior show all
Defined in:
lib/mhl/pso_swarm.rb

Constant Summary

Constants inherited from GenericSwarmBehavior

GenericSwarmBehavior::DEFAULT_ALPHA, GenericSwarmBehavior::DEFAULT_C1, GenericSwarmBehavior::DEFAULT_C2, GenericSwarmBehavior::DEFAULT_CHI, GenericSwarmBehavior::PHI

Instance Method Summary collapse

Methods inherited from GenericSwarmBehavior

#update_attractor

Constructor Details

#initialize(size:, initial_positions:, initial_velocities:, c1: nil, c2: nil, chi: nil, constraints: nil, logger: nil) ⇒ PSOSwarm

Returns a new instance of PSOSwarm.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/mhl/pso_swarm.rb', line 8

def initialize(size:, initial_positions:, initial_velocities:, 
               c1: nil, c2: nil, chi: nil, constraints: nil, logger: nil)
  @size      = size
  @particles = Array.new(@size) do |index|
    Particle.new(initial_positions[index], initial_velocities[index])
  end

  @iteration = 1

  # get values for parameters C1 and C2
  @c1 = (c1 || DEFAULT_C1).to_f
  @c2 = (c2 || DEFAULT_C2).to_f

  # define procedure to get dynamic value for chi
  @get_chi = if chi and chi.respond_to? :call
    chi
  else
    ->(iter) { (chi || DEFAULT_CHI).to_f }
  end

  @constraints = constraints
  @logger = logger

  if @constraints and @logger
    @logger.info "PSOSwarm called w/ constraints: #{@constraints}"
  end
end

Instance Method Details

#mutate(params = {}) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/mhl/pso_swarm.rb', line 36

def mutate(params={})
  # get chi parameter
  chi = @get_chi.call(@iteration)

  # move particles
  @particles.each_with_index do |p,i|
    p.move(chi, @c1, @c2, @swarm_attractor)
    if @constraints
      p.remain_within(@constraints)
    end
  end

  @iteration += 1
end