Αντιμετωπίζω ένα πρόβλημα στη δημιουργία ενός προγράμματος για τον αλγόριθμο PSO έχω δημιουργήσει-βρει-τροποποιήσει τον παρακάτω κώδικα:
- Κώδικας: Επιλογή όλων
%% Initialization
clear
clc
n = 10; % Αριθμός σωματιδίων
steps = 50; % Μέγιστος αριθμός βημάτων
dim = 2; % Διάσταση προβήματος
c2 =1.1; % PSO parameter C2
c1 = 0.12; % PSO parameter C1
w =0.9; % pso ώθηση ή αδράνεια
fitness=0*ones(n,steps);
%-----------------------------%
% initialize the parameter %
%-----------------------------%
R1 = rand(dim, n);
R2 = rand(dim, n);
current_fitness =0*ones(n,1);
%------------------------------------------------%
% Initializing swarm and velocities and position %
%------------------------------------------------%
current_position = 10*(rand(dim, n)-.5);
velocity = .3*randn(dim, n) ;
local_best_position = current_position ;
%-------------------------------------------%
% Evaluate initial population %
%-------------------------------------------%
for i = 1:n
current_fitness(i) = Live_fn(current_position(:,i));
end
local_best_fitness = current_fitness ;
[global_best_fitness,g] = min(local_best_fitness) ;
for i=1:n
globl_best_position(:,i) = local_best_position(:,g) ;
end
%-------------------%
% VELOCITY UPDATE %
%-------------------%
velocity = w *velocity + c1*(R1.*(local_best_position-current_position)) + c2*(R2.*(globl_best_position-current_position));
%------------------%
% SWARMUPDATE %
%------------------%
current_position = current_position + velocity ;
%------------------------%
% evaluate anew swarm %
%------------------------%
%% Main Loop
iter = 0 ; % Iterations’counter
while ( iter < steps )
iter = iter + 1;
for i = 1:n,
current_fitness(i) = Live_fn(current_position(:,i)) ;
end
for i = 1 : n
if current_fitness(i) < local_best_fitness(i)
local_best_fitness(i) = current_fitness(i);
local_best_position(:,i) = current_position(:,i) ;
end
end
[current_global_best_fitness,g] = min(local_best_fitness);
if current_global_best_fitness < global_best_fitness
global_best_fitness = current_global_best_fitness;
for i=1:n
globl_best_position(:,i) = local_best_position(:,g);
end
end
velocity = w *velocity + c1*(R1.*(local_best_position-current_position)) + c2*(R2.*(globl_best_position-current_position));
current_position = current_position + velocity;
x=current_position(1,:);
y=current_position(2,:);
clf
plot(x, y , 'h')
axis([-5 5 -5 5]);
pause(.2)
[x,y] = ginput(1)
end % end of while loop its mean the end of all step that the birds move it
[Jbest_min,I] = min(current_fitness) % minimum fitness
current_position(:,I) % best solution
%
Το έχω κάνει σε Octave αλλά με απασχολεί το εξής δεν ξέρω αν δίνεται η δυνατότητα με ένα mouse click να ορίζει ένα σημείο στο χώρο ενός παραθύρου με διαστάσεις [min1, max1] και [min2,max2]. Στη συνέχεια ένα σμήνος που θα αποτελείται από n=10 σωματίδια θα αρχικοποιείται και θα αναζητά το σημείο που όρισε αρχικά ο χρήστης. Οι διαδοχικές θέσεις των σωματιδίων του σμήνους θα απεικονίζονται σε κάθε επανάληψη του αλγορίθμου δίνοντας την εντύπωση της κίνησης του σμήνους. Το πρόγραμμα θα τελειώνει όταν όλα τα σωματίδια του σμήνους βρεθούν πάνω στο σημείο που όρισε ο χρήστης.
Ευχαριστώ πολύ για το χρόνο σας και συγνώμη εκ των προτέρων