source: liacs/NC2010/laser-pulse-shaping/pso.m@ 364

Last change on this file since 364 was 49, checked in by Rick van der Zwet, 15 years ago

Final result report

File size: 3.5 KB
Line 
1% Particle Swarm optimalisation
2% BSDLicence
3% Rick van der Zwet - 0433373 - <hvdzwet@liacs.nl>
4% Modeled after http://en.wikipedia.org/wiki/Particle_swarm_optimization
5
6% Dimention settings
7parameters = 10;
8
9% If global optimum does not change this many steps bail out
10iteration_break = 5;
11max_iterations = 1000;
12max_time = 10 * 60; % in sec
13
14% Flock properties
15local_swarm_size = 50;
16local_swarms = 10;
17
18%% Particle properties
19% Speed of walking around to a certain direction
20wander = 0.4;
21
22% 'Influence' of the envirionment with regards to solutions
23% Trust the group global solution to be feasible
24c_social = 0.4;
25% Trust the neighbor solution to be feasible
26c_cognitive = 0.4;
27% Trust the own best solution to be feasible
28c_ego = 0.2;
29
30% Variables used for plotting
31fitness_history = [];
32fitness_iterations = [];
33
34% Initiate all particles
35flock_p = rand(parameters,local_swarm_size,local_swarms) .* (2 * pi);
36flock_v = zeros(size(flock_p));
37
38
39% Global best placeholder
40g_best = ones(parameters,1) .* 9;
41g_fitness = 0;
42% at (:,x) lives the neighbor best of local_swarm 'x'
43n_best = ones(parameters,local_swarms) .* 9;
44n_fitness = zeros(parameters,local_swarms);
45% at (:,p,x) leves the local best of particle 'p' in local_swarm 'x'
46l_best = ones(parameters,local_swarm_size,local_swarms) .* 9;
47l_fitness = zeros(local_swarm_size, local_swarms);
48
49idle_counter = 0;
50tic();
51
52% Code not optimised for performance, but for readablility
53for i = 1:max_iterations
54 for s = 1:local_swarms
55 fitness = SHGa(flock_p(:,:,s));
56 % See if we got any better local optimum
57 for p = 1:local_swarm_size
58 if fitness(p) > l_fitness(p,s)
59 l_fitness(p,s) = fitness(p);
60 l_best(:,p,s) = flock_p(:,p,s);
61 end
62 end
63
64 % See if we got any better neighbor optimum
65 for p = 1:local_swarm_size
66 if l_fitness(p,s) > n_fitness(s)
67 n_fitness(s) = l_fitness(p,s);
68 n_best(:,s) = l_best(:,p,s);
69 end
70 end
71 end
72
73 idle_counter = idle_counter + 1;
74
75 % See wether we have a new global optimum
76 for s = 1:local_swarms
77 if n_fitness(s) > g_fitness
78 g_fitness = n_fitness(s);
79 g_best = n_best(:,s);
80 idle_counter = 0;
81 end
82 end
83
84 % Stop conditions
85 if idle_counter == iteration_break
86 fprintf('Caught by idle_counter\n');
87 break;
88 end
89 if toc > max_time
90 fprintf('Caught by max_time used \n');
91 break;
92 end
93
94
95 fprintf('%04i : %.15f\n', i, g_fitness);
96 fitness_iterations = [fitness_iterations, i];
97 fitness_history = [fitness_history, g_fitness];
98
99
100 % Update particles to new value
101 r_cognitive = rand();
102 r_social = rand();
103 r_ego = rand();
104 for s = 1:local_swarms
105 for p = 1:local_swarm_size
106 flock_v(:,p,s) = flock_v(:,p,s) * wander + ...
107 (g_best - flock_p(:,p,s)) * (c_cognitive * r_cognitive) + ...
108 (n_best(:,s) - flock_p(:,p,s)) * (c_social * r_social) + ...
109 (l_best(:,p,s) - flock_p(:,p,s)) * (c_ego * r_ego);
110 flock_p(:,p,s) = flock_p(:,p,s) + flock_v(:,p,s);
111 end
112 end
113end
114
115% Dispay hack
116g_fitness
117g_best
118
119plot(fitness_iterations,fitness_history);
120title(sprintf('Particle Swarm Optimalisation on Laser-Pulse shaping problem'));
121ylabel('fitness');
122xlabel('iterations');
123grid on;
124legend(sprintf('Parameters %i',parameters));
125print(sprintf('pso-fitness-%.10f.eps', max(fitness_history)),'-depsc2');
Note: See TracBrowser for help on using the repository browser.