如何在半球阴影区域的表面上应用PSO算法?

时间:2019-02-15 10:13:55

标签: matlab

我是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

0 个答案:

没有答案