3

我有几个.m文件的程序组合。程序运行调用其中一个(main)命名tests.m,然后从那里我调用另一个optFun.m计算不同参数的地方。这些参数在一个while循环内计算,当它们的值多次(例如 4500)没有变化时结束。该程序运行良好,但我必须执行 200 次才能获得 200 组不同的值。此外,我可以使用具有>12 个内核的计算机,因此我对.m包含语句的主文件进行了一些更改parfor,以部署 12 个 matlab 工作人员。我的目标是在一轮中获得 12 个不同的解决方案(初始程序的执行)。

function [] = tests(Num)
matlabpool open local 12;  
y = zeros(itermax,15);  
z = zeros(itermax,9);
parfor i = 1:itermax   
    [iternum tTot SolOpt ImpCostMAX minABFmax ABFmax ImportCosteABS] =...
             optFun(N, K, AntNum,...  
                    q, eps, Rt, Rs, theta, maxiter,...
                    strcat(particad,num2str(i)));   
     y(i,:) = [ i; iternum; tTot; SolOpt; ImpCostMAX(1); ImpCostMAX(2);...
                q; eps; N; K; AntNum; maxiter;...
                SolOpt/ImpCostMAX(1); SolOpt/ImpCostMAX(2); SolOpt/N];  
     z(i,:) = [ i; minABFmax(1); minABFmax(2); minABFmax(3); ABFmax(1);...
                ABFmax(2); ABFmax(3);...
                ImportCosteABS(1); ImportCosteABS(2)];   
end %parfor

matlabpool close;  
dlmwrite(nombre, y, 'delimiter', ' ','precision', '%9.5f');  
dlmwrite(b, z, 'delimiter', ' ','precision', '%9.5f');

我已经运行了 matlab 的 12 名工作人员,但现在程序似乎在达到最佳或正确结果之前就停止了。似乎我的程序的参数解决方案是在达到 while 循环的 4500 次迭代之前输出的。虽然我获得了 12 种不同的解决方案,但似乎 12 名工作人员共享一些变量的值,因此当其他工作人员对解决方案进行了足够改进或其中几个人的总和被认为是正确的解决方案时,他们就会停止。你能帮我理解发生了什么吗?

非常感谢您的问候

4

1 回答 1

0

我过去也遇到过类似的问题。您确定 for 循环的“独立”评估不会通过他们都使用的公共变量交换有关解决方案收敛性的信息吗?比如说,您convergence=zeros(1);在 the 之外定义 a parfor,然后让 optFun.m 的所有后续调用使用相同的变量。这也可能适用于在数组中存储中间值的函数。

虽然我不能说这是否确实是您的问题(没有代码示例),但它可能只是。在这种情况下,我建议为每个评估创建一个独立的容器(例如,一个zeros(NoEvals,NoThingsToStore)矩阵,它们将彼此独立地保存数据)。

于 2013-01-22T19:50:11.493 回答