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

Performance 如何在MATLAB CPSO中使用并行循环,performance,matlab,Performance,Matlab,我想在MATLAB中实现并行聚类粒子群优化(CPSO),但它比使用简单的循环花费更多的时间 所以请帮助我在代码中执行并行循环迭代 我有MatlabR2013A和Intel core i3处理器 matlabpool('open', 2) tic; for iteration=1:iterations %CALCULATE EUCLIDEAN DISTANCES TO ALL CENTROIDS distances=zeros(dataset_size(1),centroids,

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

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

我有MatlabR2013A和Intel core 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
matlabpool('open',2)
抽搐;
对于迭代=1:迭代
%计算到所有质心的欧几里德距离
距离=零(数据集大小(1)、质心、粒子);
对于粒子=1:粒子
对于质心=1:质心
距离=零(数据集大小(1),1);
对于数据_向量=1:数据集_大小(1)
%meas(数据向量:)
距离(数据向量,1)=范数(群位置(质心,:,粒子)-meas(数据向量,:);
结束
距离(:,质心,粒子)=距离;
结束
结束
%fprintf('\nEnd,meas(dv)为%5.4f\n',meas(数据向量:);
%使用集群分配度量值
对于粒子=1:粒子
[值,索引]=最小(距离(:,:,粒子),[],2);
c(:,粒子)=指数;
结束
%情节材料。。。清除处理器
删除(pc);删除(txt);
pc=[];txt=[];
%情节材料。。。
等等
对于粒子=1:粒子
对于质心=1:质心
如果有(c(:,粒子)=质心)
如果维度==3
pc=[pc plot3(粒子群位置(质心,1,粒子)、粒子群位置(质心,2,粒子)、粒子群位置(质心,3,粒子)、'*'、'颜色'、簇颜色矢量(粒子,:)];
其他维度==2
pc=[pc图(群点(质心,1,粒子),群点(质心,2,粒子),'*','color',cluster\u colors\u vector(粒子,:)];
结束
结束
结束
结束
集合(pc,{MarkerSize'},{12})
拖延;
%计算全局适应度和局部适应度:=群集适应度
平均_适应度=零(粒子,1);
对于粒子=1:粒子
对于质心=1:质心
如果有(c(:,粒子)=质心)
局部适配度=平均值(距离(c(:,粒子)=质心,质心,粒子));
平均适应度(粒子,1)=平均适应度(粒子,1)+局部适应度;
结束
结束
平均_适应度(粒子,1)=平均_适应度(粒子,1)/质心;
if(平均适应度(粒子,1)<群体适应度(粒子))
群体适应度(粒子)=平均适应度(粒子,1);
群集最佳(:,:,粒子)=群集位置(:,:,粒子);%本地最佳健身
结束
结束
[全局适应度,指数]=min(群体适应度);%全球最佳健身
蜂群整体姿态=蜂群位置(:,:,索引);%全球最佳位置
fprintf('全局位置为%5.4f\n',群集整体姿态);
%有关命令窗口的一些信息
fprintf('%3d.全局适应度为%5.4f\n',迭代,全局适应度);
%uicontrol('Style','text','Position',[40201820],'String',sprintf('real fitness is:%5.4f',global_fitness','BackgroundColor',get(gcf,'Color');
暂停(simtime);
%均匀分布[0..1]中的样本r1和r2
r1=兰特;
r2=兰特;
%更新簇质心
%p=标准杆(50);
对于粒子=1:粒子
惯性=w*群水平(:,:,粒子);
认知=c1*r1*(群最佳(:,:,粒子)-群位置(:,:,粒子));
社交=c2*r2*(群体整体姿势-群体位置(:,:,粒子));
vel=惯性+认知+社交;
swarm_pos(:,:,particle)=swarm_pos(:,:,particle)+vel;%更新粒子姿势
群水平(:,:,粒子)=水平;%更新粒子级别
结束
%停止(p);
%地块(p);
%telapsed=toc(tstart);
%minTime=min(终止,minTime);
结束

显示您已经尝试过的内容以及您面临的错误或问题。我使用fisheriris数据集尝试过PSO群集的MATLAB代码。现在,当我使用parfor循环而不是for循环时,它会在运行时间方面降低性能。您需要提供更多信息。例如,您的
parpool
配置。请查看代码部分,我添加了matlabpool('open',2)。这是串行代码,大约需要4秒钟,但是如果我使用parfor循环,那么时间会随着parfor循环的增加而增加。为什么会这样?举一个简单的例子来说明这个行为。我想这是因为过度的数据洗牌。