如何在MATLAB CPSO中使用并行循环

时间:2015-11-17 06:50:41

标签: performance matlab

我想实现并行聚类粒子群优化(CPSO)MATLAB using parfor loop,但它比使用简单的for循环花费更多的时间。

所以请帮我在代码中执行并行循环迭代。

我有MATLAB R2013a和Intel核心i3处理器。

matlabpool('open', 2)  

tic;  

for iteration=1:iterations  

%CALCULATE EUCLIDEAN DISTANCES TO ALL CENTROIDS
distances=zeros(dataset_size(1),centroids,particles);

for particle=1:particles
    for centroid=1:centroids
        distance=zeros(dataset_size(1),1);
        for data_vector=1:dataset_size(1)
            %meas(data_vector,:)
            distance(data_vector,1)=norm(swarm_pos(centroid,:,particle)-meas(data_vector,:));

        end
        distances(:,centroid,particle)=distance;
    end
end
                %fprintf('\nEnd, meas(dv) is %5.4f\n',meas(data_vector,:));

%ASSIGN MEASURES with CLUSTERS    
for particle=1:particles
    [value, index] = min(distances(:,:,particle),[],2);
    c(:,particle) = index;
end

% PLOT STUFF... CLEAR HANDLERS
delete(pc); delete(txt);
pc = []; txt = [];

% PLOT STUFF...
hold on;
for particle=1:particles
    for centroid=1:centroids
        if any(c(:,particle) == centroid)
            if dimensions == 3
                pc = [pc plot3(swarm_pos(centroid,1,particle),swarm_pos(centroid,2,particle),swarm_pos(centroid,3,particle),'*','color',cluster_colors_vector(particle,:))];
            elseif dimensions == 2
                pc = [pc plot(swarm_pos(centroid,1,particle),swarm_pos(centroid,2,particle),'*','color',cluster_colors_vector(particle,:))];
            end
        end
    end
end
set(pc,{'MarkerSize'},{12})
hold off;

%CALCULATE GLOBAL FITNESS and LOCAL FITNESS:=swarm_fitness
average_fitness = zeros(particles,1);
for particle=1:particles
    for centroid = 1 : centroids
        if any(c(:,particle) == centroid)
            local_fitness=mean(distances(c(:,particle)==centroid,centroid,particle));
            average_fitness(particle,1) = average_fitness(particle,1) + local_fitness;
        end
    end
    average_fitness(particle,1) = average_fitness(particle,1) / centroids;
    if (average_fitness(particle,1) < swarm_fitness(particle))
        swarm_fitness(particle) = average_fitness(particle,1);
        swarm_best(:,:,particle) = swarm_pos(:,:,particle);     %LOCAL BEST FITNESS
    end
end    
[global_fitness, index] = min(swarm_fitness);       %GLOBAL BEST FITNESS
swarm_overall_pose = swarm_pos(:,:,index);          %GLOBAL BEST POSITION
            fprintf('global position is %5.4f\n',swarm_overall_pose);            

% SOME INFO ON THE COMMAND WINDOW
fprintf('%3d. global fitness is %5.4f\n',iteration,global_fitness);            
%uicontrol('Style','text','Position',[40 20 180 20],'String',sprintf('Actual fitness is: %5.4f', global_fitness),'BackgroundColor',get(gcf,'Color'));        
pause(simtime);



% SAMPLE r1 AND r2 FROM UNIFORM DISTRIBUTION [0..1]
r1 = rand;
r2 = rand;

% UPDATE CLUSTER CENTROIDS
%p = Par(50); 
for particle=1:particles 

    inertia = w * swarm_vel(:,:,particle);
    cognitive = c1 * r1 * (swarm_best(:,:,particle)-swarm_pos(:,:,particle));
    social = c2 * r2 * (swarm_overall_pose-swarm_pos(:,:,particle));
    vel = inertia+cognitive+social;

    swarm_pos(:,:,particle) = swarm_pos(:,:,particle) + vel ;   % UPDATE PARTICLE POSE
    swarm_vel(:,:,particle) = vel;                              % UPDATE PARTICLE VEL

end
%stop(p);
%plot(p); 
% telapsed = toc(tstart);
%     minTime = min(telapsed,minTime);  
end

0 个答案:

没有答案