Home | Read Online | Amazon | GoodReads | Google Books | PDF (code) | GitHub
Particle Swarm Optimization, PSO.
Particle Swarm Optimization belongs to the field of Swarm Intelligence and Collective Intelligence and is a sub-field of Computational Intelligence. Particle Swarm Optimization is related to other Swarm Intelligence algorithms such as Ant Colony Optimization and it is a baseline algorithm for many variations, too numerous to list.
Particle Swarm Optimization is inspired by the social foraging behavior of some animals such as flocking behavior of birds and the schooling behavior of fish.
Particles in the swarm fly through an environment following the fitter members of the swarm and generally biasing their movement toward historically good areas of their environment.
The goal of the algorithm is to have all the particles locate the optima in a multi-dimensional hyper-volume. This is achieved by assigning initially random positions to all particles in the space and small initial random velocities. The algorithm is executed like a simulation, advancing the position of each particle in turn based on its velocity, the best known global position in the problem space and the best position known to a particle. The objective function is sampled after each position update. Over time, through a combination of exploration and exploitation of known good positions in the search space, the particles cluster or converge together around an optima, or several optima.
The Particle Swarm Optimization algorithm is comprised of a collection of particles that move around the search space influenced by their own best past location and the best past location of the whole swarm or a close neighbor. Each iteration a particle's velocity is updated using:
$v_{i}(t+1) = v_{i}(t) + \big( c_1 \times rand() \times (p_{i}^{best} - p_{i}(t)) \big) + \big( c_2 \times rand() \times (p_{gbest} - p_{i}(t)) \big)$where $v_{i}(t+1)$ is the new velocity for the $i^{th}$ particle, $c_1$ and $c_2$ are the weighting coefficients for the personal best and global best positions respectively, $p_{i}(t)$ is the $i^{th}$ particle's position at time $t$, $p_{i}^{best}$ is the $i^{th}$ particle's best known position, and $p_{gbest}$ is the best position known to the swarm. The $rand$ function generate a uniformly random variable $\in [0,1]$. Variants on this update equation consider best positions within a particles local neighborhood at time $t$.
A particle's position is updated using:
$p_{i}(t+1) = p_{i}(t) + v_{i}(t)$Algorithm (below) provides a pseudocode listing of the Particle Swarm Optimization algorithm for minimizing a cost function.
Input
:
ProblemSize
, $Population_{size}$
Output
:
$P_{g\_best}$
Population
$\leftarrow$ $\emptyset$For
($i=1$ To
$Population_{size}$)RandomVelocity
()RandomPosition
{$Population_{size}$}If
(Cost
{$P_{p\_best}$} $\leq$ Cost
{$P_{g\_best}$})End
End
While
($\neg$StopCondition
())For
($P$ $\in$ Population
)UpdateVelocity
{$P_{velocity}$, $P_{g\_best}$, $P_{p\_best}$}UpdatePosition
{$P_{position}$, $P_{velocity}$}If
(Cost
{$P_{position}$} $\leq$ Cost
{$P_{p\_best}$})If
(Cost
{$P_{p\_best}$} $\leq$ Cost
{$P_{g\_best}$})End
End
End
End
Return
($P_{g\_best}$)Listing (below) provides an example of the Particle Swarm Optimization algorithm implemented in the Ruby Programming Language. The demonstration problem is an instance of a continuous function optimization that seeks $\min f(x)$ where $f=\sum_{i=1}^n x_{i}^2$, $-5.0\leq x_i \leq 5.0$ and $n=3$. The optimal solution for this basin function is $(v_0,\ldots,v_{n-1})=0.0$. The algorithm is a conservative version of Particle Swarm Optimization based on the seminal papers. The implementation limits the velocity at a pre-defined maximum, and bounds particles to the search space, reflecting their movement and velocity if the bounds of the space are exceeded. Particles are influenced by the best position found as well as their own personal best position. Natural extensions may consider limiting velocity with an inertia coefficient and including a neighborhood function for the particles.
def objective_function(vector) return vector.inject(0.0) {|sum, x| sum + (x ** 2.0)} end def random_vector(minmax) return Array.new(minmax.size) do |i| minmax[i][0] + ((minmax[i][1] - minmax[i][0]) * rand()) end end def create_particle(search_space, vel_space) particle = {} particle[:position] = random_vector(search_space) particle[:cost] = objective_function(particle[:position]) particle[:b_position] = Array.new(particle[:position]) particle[:b_cost] = particle[:cost] particle[:velocity] = random_vector(vel_space) return particle end def get_global_best(population, current_best=nil) population.sort!{|x,y| x[:cost] <=> y[:cost]} best = population.first if current_best.nil? or best[:cost] <= current_best[:cost] current_best = {} current_best[:position] = Array.new(best[:position]) current_best[:cost] = best[:cost] end return current_best end def update_velocity(particle, gbest, max_v, c1, c2) particle[:velocity].each_with_index do |v,i| v1 = c1 * rand() * (particle[:b_position][i] - particle[:position][i]) v2 = c2 * rand() * (gbest[:position][i] - particle[:position][i]) particle[:velocity][i] = v + v1 + v2 particle[:velocity][i] = max_v if particle[:velocity][i] > max_v particle[:velocity][i] = -max_v if particle[:velocity][i] < -max_v end end def update_position(part, bounds) part[:position].each_with_index do |v,i| part[:position][i] = v + part[:velocity][i] if part[:position][i] > bounds[i][1] part[:position][i]=bounds[i][1]-(part[:position][i]-bounds[i][1]).abs part[:velocity][i] *= -1.0 elsif part[:position][i] < bounds[i][0] part[:position][i]=bounds[i][0]+(part[:position][i]-bounds[i][0]).abs part[:velocity][i] *= -1.0 end end end def update_best_position(particle) return if particle[:cost] > particle[:b_cost] particle[:b_cost] = particle[:cost] particle[:b_position] = Array.new(particle[:position]) end def search(max_gens, search_space, vel_space, pop_size, max_vel, c1, c2) pop = Array.new(pop_size) {create_particle(search_space, vel_space)} gbest = get_global_best(pop) max_gens.times do |gen| pop.each do |particle| update_velocity(particle, gbest, max_vel, c1, c2) update_position(particle, search_space) particle[:cost] = objective_function(particle[:position]) update_best_position(particle) end gbest = get_global_best(pop, gbest) puts " > gen #{gen+1}, fitness=#{gbest[:cost]}" end return gbest end if __FILE__ == $0 # problem configuration problem_size = 2 search_space = Array.new(problem_size) {|i| [-5, 5]} # algorithm configuration vel_space = Array.new(problem_size) {|i| [-1, 1]} max_gens = 100 pop_size = 50 max_vel = 100.0 c1, c2 = 2.0, 2.0 # execute the algorithm best = search(max_gens, search_space, vel_space, pop_size, max_vel, c1,c2) puts "done! Solution: f=#{best[:cost]}, s=#{best[:position].inspect}" end
Particle Swarm Optimization was described as a stochastic global optimization method for continuous functions in 1995 by Eberhart and Kennedy [Eberhart1995] [Kennedy1995]. This work was motivated as an optimization method loosely based on the flocking behavioral models of Reynolds [Reynolds1987]. Early works included the introduction of inertia [Shi1998] and early study of social topologies in the swarm by Kennedy [Kennedy1999].
Poli, Kennedy, and Blackwell provide a modern overview of the field of PSO with detailed coverage of extensions to the baseline technique [Poli2007]. Poli provides a meta-analysis of PSO publications that focus on the application the technique, providing a systematic breakdown on application areas [Poli2008a]. An excellent book on Swarm Intelligence in general with detailed coverage of Particle Swarm Optimization is "Swarm Intelligence" by Kennedy, Eberhart, and Shi [Kennedy2001].
[Eberhart1995] | R. C. Eberhart and J. Kennedy, "A new optimizer using particle swarm theory", in Proceedings of the sixth international symposium on micro machine\n\tand human science, 1995. |
[Kennedy1995] | J. Kennedy and R. C. Eberhart, "Particle swarm optimization", in Proceedings of the IEEE International Conference on Neural Networks, 1995. |
[Kennedy1999] | J. Kennedy, "Small Worlds and Mega-Minds: Effects of Neighborhood Topology on\n\tParticle Swarm Performance", in Proceedings of the 1999 Congress on Evolutionary Computation, 1999. |
[Kennedy2001] | J. Kennedy and R. C. Eberhart and Y. Shi, "Swarm Intelligence", Morgan Kaufmann, 2001. |
[Poli2007] | R. Poli and J. Kennedy and T. Blackwell, "Particle swarm optimization An overview", Swarm Intelligence, 2007. |
[Poli2008a] | R. Poli, "Analysis of the publications on the applications of particle swarm\n\toptimisation", Journal of Artificial Evolution and Applications, 2008. |
[Reynolds1987] | C. W. Reynolds, "Flocks, herds and schools: A distributed behavioral model", in Proceedings of the 14th annual conference on Computer graphics and\n\tinteractive techniques, 1987. |
[Shi1998] | Y. Shi and R. C. Eberhart, "A Modified Particle Swarm Optimizers", in Proceedings of the IEEE International Conference on Evolutionary\n\tComputation, 1998. |
Please Note: This content was automatically generated from the book content and may contain minor differences.