Как применить алгоритм PSO на поверхности затененной области полушария? - PullRequest
0 голосов
/ 15 февраля 2019

Я новичок в Matlab и сейчас пытаюсь решить проблему применения алгоритма оптимизации роя частиц (PSO) к заштрихованной части, расположенной на поверхности полушария.

Уже формируем полушарие с затененнымобласти на его поверхности и пробовал код алгоритма PSO, но каким-то образом не может объединить их вместе, или, как сказано, применить алгоритм на его поверхности.

Я ожидаю, что точки будут случайным образом распределены на затененной области, которая расположенана поверхности полушария, и после этого будет проходить путь через все точки, каждая из которых указывает на центр полушария.

Код такой, как показано ниже:

clc; clear; close all;

%% Initialization
swarmsize = 100;
iterations = 50;
inertia = 1.0;
correction_factor = 2.0;

%% Initial swarm position 
swarm = zeros(100,7);

step = 1;
for i = 1 : 100
swarm(step, 1:7) = i;
step = step + 1;
end

swarm(:, 7) = 50;      
swarm(:, 5) = 0;          
swarm(:, 6) = 0;          

%% Main Loop of PSO
for iter = 1:iterations

% Update position
for i = 1 : swarmsize
    swarm(i, 1) = swarm(i, 1) + swarm(i, 5)/1.2  ;   
    swarm(i, 2) = swarm(i, 2) + swarm(i, 6)/1.2 ;    
    u = swarm(i, 1);
    v = swarm(i, 2);

    value = (u - 20)^2 + (v - 10)^2;          

    if value < swarm(i, 7)             
        swarm(i, 3) = swarm(i, 1);     
        swarm(i, 4) = swarm(i, 2);     
        swarm(i, 7) = value;           
    end
end

[temp, gbest] = min(swarm(:, 7));        

% Update velocity
for i = 1 : swarmsize
    swarm(i, 5) = rand*inertia*swarm(i, 5) + correction_factor*rand*(swarm(i, 3)...
        - swarm(i, 1)) + correction_factor*rand*(swarm(gbest, 3) - swarm(i, 1));   % u velocity parameters
    swarm(i, 6) = rand*inertia*swarm(i, 6) + correction_factor*rand*(swarm(i, 4)...
        - swarm(i, 2)) + correction_factor*rand*(swarm(gbest, 4) - swarm(i, 2));   % v velocity parameters
end

%% Plot the hemisphere
[x,y,z] = sphere;      
x = x(11:end,:);       
y = y(11:end,:);       
z = z(11:end,:);       
r= 0.13;
c = [0.36 0 0];
hs = surf(r.*x+c(1),r.*y,r.*z,'FaceColor','yellow','FaceAlpha',.3);  
axis equal
xlabel('X');ylabel('Y');zlabel('Z');
hold on;

%% Putting the ranges for the elevation and azimuth
minAzimuth = 0;
maxAzimuth = 180;
minElevation = 0;
maxElevation = 80;

%% Compute angles 
phi = atan2d(y,x);
theta = acosd (z);

%% Highlighting logic (Shading the subset of the hemisphere)
ind = (phi >= minAzimuth & phi <= maxAzimuth) & (theta >= minElevation & theta <= maxElevation); 
x2 = x; y2 = y; z2 = z; 
x2(~ind) = NaN; y2(~ind) = NaN; z2(~ind)=NaN;

hold on;
surf(r.*x2+c(1),r.*y2,r.*z2,'FaceColor','red'); 

%%Plot the particles
plot3(swarm(:,1), swarm(:,2), swarm(:,7),'x');
pause(.1);
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...