%%#################################################################### %%#### Particle swarm optimization %%#### With linkage operator %%#### Deepak devicharan july 2003 %%#################################################################### %%## to apply this to different equations do the following %%## generate initial particles in a search space close to actual soln %%## fool around with no of iterations, no of particles, learning rates %%## for a truly generic PSO do the following %%## increase the number of particles , increase the variance %%## i.e let the particles cover a larger area of the search space %%## then fool around as always with the above thins %declare the parameters of the optimization max_iterations = 1000; no_of_particles = 50; dimensions = 1; delta_min = -0.003; delta_max = 0.003; c1 = 1.3; c2 = 1.3; %initialise the particles and teir velocity components for count_x = 1:no_of_particles for count_y = 1:dimensions particle_position(count_x,count_y) = rand*10; particle_velocity(count_x,count_y) = rand; p_best(count_x,count_y) = particle_position(count_x,count_y); end end %initialize the p_best_fitness array for count = 1:no_of_particles p_best_fitness(count) = -1000; end %particle_position %particle_velocity %main particle swrm routine for count = 1:max_iterations %find the fitness of each particle %change fitness function as per equation requiresd and dimensions for count_x = 1:no_of_particles %x = particle_position(count_x,1); %y = particle_position(count_x,2); %z = particle_position(count_x,3); %soln = x^2 - 3*y*x + z; %x = particle_position(count_x); %soln = x^2-2*x+1; x = particle_position(count_x); soln = x-7; if soln~=0 current_fitness(count_x) = 1/abs(soln); else current_fitness =1000; end end %decide on p_best etc for each particle for count_x = 1:no_of_particles if current_fitness(count_x) > p_best_fitness(count_x) p_best_fitness(count_x) = current_fitness(count_x); for count_y = 1:dimensions p_best(count_x,count_y) = particle_position(count_x,count_y); end end end %decide on the global best among all the particles [g_best_val,g_best_index] = max(current_fitness); %g_best contains the position of teh global best for count_y = 1:dimensions g_best(count_y) = particle_position(g_best_index,count_y); end %update the position and velocity compponents for count_x = 1:no_of_particles for count_y = 1:dimensions p_current(count_y) = particle_position(count_x,count_y); end for count_y = 1:dimensions particle_velocity(count_y) = particle_velocity(count_y) + c1*rand*(p_best(count_y)-p_current(count_y)) + c2*rand*(g_best(count_y)-p_current(count_y)); particle_positon(count_x,count_y) = p_current(count_y) +particle_velocity(count_y); end end end g_best current_fitness(g_best_index)